| 1540 | } |
| 1541 | |
| 1542 | bool SaveCompressedTextureSet(ntc::IContext* context, ntc::ITextureSet* textureSet) |
| 1543 | { |
| 1544 | ntc::FileStreamWrapper outputStream(context); |
| 1545 | |
| 1546 | ntc::Status ntcStatus = context->OpenFile(g_options.saveCompressedFileName, true, outputStream.ptr()); |
| 1547 | if (ntcStatus != ntc::Status::Ok) |
| 1548 | { |
| 1549 | fprintf(stderr, "Cannot open output file '%s', code = %s\n%s\n", |
| 1550 | g_options.saveCompressedFileName, ntc::StatusToString(ntcStatus), ntc::GetLastErrorMessage()); |
| 1551 | return false; |
| 1552 | } |
| 1553 | |
| 1554 | ntcStatus = textureSet->ConfigureLosslessCompression(g_options.losslessCompression); |
| 1555 | CHECK_NTC_RESULT(ConfigureLosslessCompression); |
| 1556 | |
| 1557 | ntc::LosslessCompressionStats losslessStats; |
| 1558 | ntcStatus = textureSet->SaveToStream(outputStream, &losslessStats); |
| 1559 | if (ntcStatus != ntc::Status::Ok) |
| 1560 | { |
| 1561 | fprintf(stderr, "Failed to save compressed texture to output file '%s', code = %s\n%s\n", |
| 1562 | g_options.saveCompressedFileName, ntc::StatusToString(ntcStatus), ntc::GetLastErrorMessage()); |
| 1563 | return false; |
| 1564 | } |
| 1565 | |
| 1566 | uint64_t const fileSize = outputStream->Tell(); |
| 1567 | size_t const texturePixels = GetTextureSetPixelCount(textureSet); |
| 1568 | float const bpp = 8.f * float(fileSize) / float(texturePixels); |
| 1569 | |
| 1570 | printf("Saved '%s'\n", g_options.saveCompressedFileName); |
| 1571 | printf("File size: %" PRIu64 " bytes, %.2f bits per pixel.\n", fileSize, bpp); |
| 1572 | if (g_options.losslessCompression.compressBCModeBuffers || g_options.losslessCompression.compressLatents) |
| 1573 | { |
| 1574 | double const compressedBufferRatioPercents = (losslessStats.originalSizeOfCompressedBuffers == 0) ? 0.0 : |
| 1575 | 100.0 * double(losslessStats.sizeOfCompressedBuffers) / double(losslessStats.originalSizeOfCompressedBuffers); |
| 1576 | |
| 1577 | double const overallCmpressionRatioPercents = 100.0 * |
| 1578 | double(losslessStats.sizeOfCompressedBuffers + losslessStats.sizeOfUncompressedBuffers) / |
| 1579 | double(losslessStats.originalSizeOfCompressedBuffers + losslessStats.sizeOfUncompressedBuffers); |
| 1580 | |
| 1581 | printf("%s compressed %d buffers out of %d, compressed ratio %.1f%%, overall ratio %.1f%%, time %.2f ms\n", |
| 1582 | ntc::CompressionTypeToString(g_options.losslessCompression.algorithm), |
| 1583 | losslessStats.compressedBuffers, losslessStats.totalBuffers, |
| 1584 | compressedBufferRatioPercents, overallCmpressionRatioPercents, losslessStats.compressionTimeMs); |
| 1585 | } |
| 1586 | |
| 1587 | return true; |
| 1588 | } |
| 1589 | |
| 1590 | ntc::ITextureSet* LoadCompressedTextureSet(ntc::IContext* context) |
| 1591 | { |
no test coverage detected