| /* | |
| * Copyright 2026 Rive | |
| */ | |
| #include "rive/decoders/bitmap_decoder.hpp" | |
| #include "astcenc.h" | |
| #include <cstdio> | |
| #include <memory> | |
| #include <vector> | |
| std::unique_ptr<Bitmap> decode_astc_texture(const uint8_t* blocks, | |
| size_t byteCount, | |
| uint32_t width, | |
| uint32_t height, | |
| uint32_t blockWidth, | |
| uint32_t blockHeight) | |
| { | |
| astcenc_config config; | |
| astcenc_error err = astcenc_config_init(ASTCENC_PRF_LDR_SRGB, | |
| blockWidth, | |
| blockHeight, | |
| 1, | |
| ASTCENC_PRE_MEDIUM, | |
| ASTCENC_FLG_DECOMPRESS_ONLY, | |
| &config); | |
| if (err != ASTCENC_SUCCESS) | |
| { | |
| fprintf(stderr, | |
| "DecodeAstcTexture - astcenc_config_init failed: %s\n", | |
| astcenc_get_error_string(err)); | |
| return nullptr; | |
| } | |
| astcenc_context* ctx = nullptr; | |
| err = astcenc_context_alloc(&config, 1, &ctx); | |
| if (err != ASTCENC_SUCCESS) | |
| { | |
| fprintf(stderr, | |
| "DecodeAstcTexture - astcenc_context_alloc failed: %s\n", | |
| astcenc_get_error_string(err)); | |
| return nullptr; | |
| } | |
| const size_t pixelCount = static_cast<size_t>(width) * height; | |
| auto pixels = std::make_unique<uint8_t[]>(pixelCount * 4); | |
| void* slicePtr = pixels.get(); | |
| astcenc_image outImage; | |
| outImage.dim_x = width; | |
| outImage.dim_y = height; | |
| outImage.dim_z = 1; | |
| outImage.data_type = ASTCENC_TYPE_U8; | |
| outImage.data = &slicePtr; | |
| const astcenc_swizzle swizzle = {ASTCENC_SWZ_R, | |
| ASTCENC_SWZ_G, | |
| ASTCENC_SWZ_B, | |
| ASTCENC_SWZ_A}; | |
| err = astcenc_decompress_image(ctx, | |
| blocks, | |
| byteCount, | |
| &outImage, | |
| &swizzle, | |
| 0); | |
| astcenc_context_free(ctx); | |
| if (err != ASTCENC_SUCCESS) | |
| { | |
| fprintf(stderr, | |
| "DecodeAstcTexture - astcenc_decompress_image failed: %s\n", | |
| astcenc_get_error_string(err)); | |
| return nullptr; | |
| } | |
| const size_t numBytes = static_cast<size_t>(width) * height * 4; | |
| return std::make_unique<Bitmap>(width, | |
| height, | |
| numBytes, | |
| Bitmap::PixelFormat::RGBA, | |
| std::move(pixels)); | |
| } |