/** * Copyright (c) 2026 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #include "asset/asset.h" #include "assert/assert.h" #include "display/texture/tileset.h" #include "util/memory.h" #include "util/endian.h" errorret_t assetTilesetLoad(assetentire_t entire) { assertNotNull(entire.data, "Asset data cannot be null"); assertNotNull(entire.output, "Asset output cannot be null"); assettileset_t *tilesetData = (assettileset_t *)entire.data; tileset_t *tileset = (tileset_t *)entire.output; if( tilesetData->header[0] != 'D' || tilesetData->header[1] != 'T' || tilesetData->header[2] != 'F' ) { errorThrow("Invalid tileset header"); } if(tilesetData->version != 0x00) { errorThrow("Unsupported tileset version"); } // Fix endianness tilesetData->tileWidth = endianLittleToHost16(tilesetData->tileWidth); tilesetData->tileHeight = endianLittleToHost16(tilesetData->tileHeight); tilesetData->columnCount = endianLittleToHost16(tilesetData->columnCount); tilesetData->rowCount = endianLittleToHost16(tilesetData->rowCount); tilesetData->right = endianLittleToHost16(tilesetData->right); tilesetData->bottom = endianLittleToHost16(tilesetData->bottom); if(tilesetData->tileWidth == 0) { errorThrow("Tile width cannot be 0"); } if(tilesetData->tileHeight == 0) { errorThrow("Tile height cannot be 0"); } if(tilesetData->columnCount == 0) { errorThrow("Column count cannot be 0"); } if(tilesetData->rowCount == 0) { errorThrow("Row count cannot be 0"); } tilesetData->u0 = endianLittleToHostFloat(tilesetData->u0); tilesetData->v0 = endianLittleToHostFloat(tilesetData->v0); if(tilesetData->v0 < 0.0f || tilesetData->v0 > 1.0f) { errorThrow("Invalid v0 value in tileset"); } // Setup tileset tileset->tileWidth = tilesetData->tileWidth; tileset->tileHeight = tilesetData->tileHeight; tileset->tileCount = tilesetData->columnCount * tilesetData->rowCount; tileset->columns = tilesetData->columnCount; tileset->rows = tilesetData->rowCount; tileset->uv[0] = tilesetData->u0; tileset->uv[1] = tilesetData->v0; errorOk(); }