| 596 | } |
| 597 | |
| 598 | bool save_dds(const char* pFilename, uint32_t width, uint32_t height, const void* pBlocks, uint32_t pixel_format_bpp, DXGI_FORMAT dxgi_format, bool srgb, bool force_dx10_header) |
| 599 | { |
| 600 | (void)srgb; |
| 601 | |
| 602 | FILE* pFile = NULL; |
| 603 | #ifdef _MSC_VER |
| 604 | fopen_s(&pFile, pFilename, "wb"); |
| 605 | #else |
| 606 | pFile = fopen(pFilename, "wb"); |
| 607 | #endif |
| 608 | if (!pFile) |
| 609 | { |
| 610 | fprintf(stderr, "Failed creating file %s!\n", pFilename); |
| 611 | return false; |
| 612 | } |
| 613 | |
| 614 | fwrite("DDS ", 4, 1, pFile); |
| 615 | |
| 616 | DDSURFACEDESC2 desc; |
| 617 | memset(&desc, 0, sizeof(desc)); |
| 618 | |
| 619 | desc.dwSize = sizeof(desc); |
| 620 | desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_CAPS; |
| 621 | |
| 622 | desc.dwWidth = width; |
| 623 | desc.dwHeight = height; |
| 624 | |
| 625 | desc.ddsCaps.dwCaps = DDSCAPS_TEXTURE; |
| 626 | desc.ddpfPixelFormat.dwSize = sizeof(desc.ddpfPixelFormat); |
| 627 | |
| 628 | desc.ddpfPixelFormat.dwFlags |= DDPF_FOURCC; |
| 629 | |
| 630 | desc.lPitch = (((desc.dwWidth + 3) & ~3) * ((desc.dwHeight + 3) & ~3) * pixel_format_bpp) >> 3; |
| 631 | desc.dwFlags |= DDSD_LINEARSIZE; |
| 632 | |
| 633 | desc.ddpfPixelFormat.dwRGBBitCount = 0; |
| 634 | |
| 635 | if ((!force_dx10_header) && |
| 636 | ((dxgi_format == DXGI_FORMAT_BC1_UNORM) || |
| 637 | (dxgi_format == DXGI_FORMAT_BC3_UNORM) || |
| 638 | (dxgi_format == DXGI_FORMAT_BC4_UNORM) || |
| 639 | (dxgi_format == DXGI_FORMAT_BC5_UNORM))) |
| 640 | { |
| 641 | if (dxgi_format == DXGI_FORMAT_BC1_UNORM) |
| 642 | desc.ddpfPixelFormat.dwFourCC = (uint32_t)PIXEL_FMT_FOURCC('D', 'X', 'T', '1'); |
| 643 | else if (dxgi_format == DXGI_FORMAT_BC3_UNORM) |
| 644 | desc.ddpfPixelFormat.dwFourCC = (uint32_t)PIXEL_FMT_FOURCC('D', 'X', 'T', '5'); |
| 645 | else if (dxgi_format == DXGI_FORMAT_BC4_UNORM) |
| 646 | desc.ddpfPixelFormat.dwFourCC = (uint32_t)PIXEL_FMT_FOURCC('A', 'T', 'I', '1'); |
| 647 | else if (dxgi_format == DXGI_FORMAT_BC5_UNORM) |
| 648 | desc.ddpfPixelFormat.dwFourCC = (uint32_t)PIXEL_FMT_FOURCC('A', 'T', 'I', '2'); |
| 649 | |
| 650 | fwrite(&desc, sizeof(desc), 1, pFile); |
| 651 | } |
| 652 | else |
| 653 | { |
| 654 | desc.ddpfPixelFormat.dwFourCC = (uint32_t)PIXEL_FMT_FOURCC('D', 'X', '1', '0'); |
| 655 | |