Ziqing Hui : windowscodecs: Add support for decoding cube maps.
Alexandre Julliard
julliard at winehq.org
Mon Jul 20 15:30:08 CDT 2020
Module: wine
Branch: master
Commit: 2683be090b470b4787d87259efbb75577347fd02
URL: https://source.winehq.org/git/wine.git/?a=commit;h=2683be090b470b4787d87259efbb75577347fd02
Author: Ziqing Hui <zhui at codeweavers.com>
Date: Sat Jul 18 11:18:22 2020 +0800
windowscodecs: Add support for decoding cube maps.
Signed-off-by: Ziqing Hui <zhui at codeweavers.com>
Signed-off-by: Esme Povirk <esme at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/windowscodecs/ddsformat.c | 23 +++++++++++++++++++++--
dlls/windowscodecs/tests/ddsformat.c | 6 ------
2 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/dlls/windowscodecs/ddsformat.c b/dlls/windowscodecs/ddsformat.c
index b972b41b30..447eaf4178 100644
--- a/dlls/windowscodecs/ddsformat.c
+++ b/dlls/windowscodecs/ddsformat.c
@@ -14,6 +14,16 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ *
+ * Note:
+ *
+ * Uncompressed image:
+ * For uncompressed formats, a block is equivalent to a pixel.
+ *
+ * Cube map:
+ * A cube map is equivalent to a 2D texture array which has 6 textures.
+ * A cube map array is equivalent to a 2D texture array which has cubeCount*6 textures.
*/
#include "config.h"
@@ -436,6 +446,7 @@ static void get_dds_info(dds_info* info, DDS_HEADER *header, DDS_HEADER_DXT10 *h
}
info->frame_count *= info->array_size;
}
+ if (info->dimension == WICDdsTextureCube) info->frame_count *= 6;
}
static inline DdsDecoder *impl_from_IWICBitmapDecoder(IWICBitmapDecoder *iface)
@@ -910,7 +921,11 @@ static HRESULT WINAPI DdsDecoder_GetFrame(IWICBitmapDecoder *iface,
return WINCODEC_ERR_WRONGSTATE;
}
- frame_per_texture = This->info.frame_count / This->info.array_size;
+ if (This->info.dimension == WICDdsTextureCube) {
+ frame_per_texture = This->info.mip_levels;
+ } else {
+ frame_per_texture = This->info.frame_count / This->info.array_size;
+ }
array_index = index / frame_per_texture;
slice_index = index % frame_per_texture;
depth = This->info.depth;
@@ -1021,7 +1036,11 @@ static HRESULT WINAPI DdsDecoder_Dds_GetFrame(IWICDdsDecoder *iface,
hr = WINCODEC_ERR_WRONGSTATE;
goto end;
}
- if (arrayIndex >= This->info.array_size || mipLevel >= This->info.mip_levels || sliceIndex >= This->info.depth) {
+
+ if ((arrayIndex >= This->info.array_size && This->info.dimension != WICDdsTextureCube) ||
+ (arrayIndex >= This->info.array_size * 6) ||
+ (mipLevel >= This->info.mip_levels) ||
+ (sliceIndex >= This->info.depth)) {
hr = E_INVALIDARG;
goto end;
}
diff --git a/dlls/windowscodecs/tests/ddsformat.c b/dlls/windowscodecs/tests/ddsformat.c
index cfe4d9b781..b8ca452a43 100644
--- a/dlls/windowscodecs/tests/ddsformat.c
+++ b/dlls/windowscodecs/tests/ddsformat.c
@@ -541,7 +541,6 @@ static void test_dds_decoder_image_parameters(void)
hr = IWICBitmapDecoder_GetFrameCount(decoder, &frame_count);
ok(hr == S_OK, "Test %u: GetFrameCount failed, hr %#x\n", i, hr);
if (hr == S_OK) {
- todo_wine_if(test_data[i].expected_parameters.Dimension == WICDdsTextureCube)
ok(frame_count == test_data[i].expected_frame_count, "Test %u: Expected frame count %u, got %u\n",
i, test_data[i].expected_frame_count, frame_count);
}
@@ -794,11 +793,6 @@ static void test_dds_decoder_frame(IWICBitmapDecoder *decoder, int i)
UINT frame_count, j;
WICDdsParameters params;
- if (test_data[i].expected_parameters.Dimension == WICDdsTextureCube) {
- skip("Frame tests for cube maps will crash\n");
- return;
- }
-
hr = IWICBitmapDecoder_GetFrameCount(decoder, &frame_count);
ok(hr == S_OK, "Test %u: GetFrameCount failed, hr %#x\n", i, hr);
if (hr != S_OK) return;
More information about the wine-cvs
mailing list