| 321 | namespace package_resource_internal |
| 322 | { |
| 323 | void *load(File &file, Allocator &a) |
| 324 | { |
| 325 | u32 version; |
| 326 | u32 compressed_size; |
| 327 | u32 uncompressed_size; |
| 328 | BinaryReader br(file); |
| 329 | |
| 330 | br.read(version); |
| 331 | CE_ENSURE(version == RESOURCE_HEADER(RESOURCE_VERSION_PACKAGE)); |
| 332 | br.read(compressed_size); |
| 333 | |
| 334 | if (compressed_size == 0) { |
| 335 | file.seek(0); |
| 336 | return simple_resource::load(file, a); |
| 337 | } |
| 338 | |
| 339 | br.read(uncompressed_size); |
| 340 | |
| 341 | const u32 file_size = file.size(); // Compressed package. |
| 342 | const u32 header_size = file_size - compressed_size; |
| 343 | const u32 resource_size = header_size + uncompressed_size; |
| 344 | char *data = (char *)a.allocate(resource_size, 16); |
| 345 | char *compressed_data = (char *)a.allocate(compressed_size); |
| 346 | |
| 347 | file.seek(0); |
| 348 | file.read(data, file_size - compressed_size); |
| 349 | file.read(compressed_data, compressed_size); |
| 350 | const int decompressed_size = LZ4_decompress_safe(compressed_data, data + header_size, compressed_size, uncompressed_size); |
| 351 | CE_ASSERT(decompressed_size >= 0 && u32(decompressed_size) == uncompressed_size, "Failed to decompress data"); |
| 352 | CE_UNUSED(decompressed_size); |
| 353 | a.deallocate(compressed_data); |
| 354 | return data; |
| 355 | } |
| 356 | |
| 357 | } // namespace package_resource_internal |
| 358 |
nothing calls this directly
no test coverage detected