annotate src/libraries/ddsparse/ddsparse.cpp @ 1422:377f9dad7a2d image-CompressedData

Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist. love.filesystem.newFileData now accepts filepaths and File objects.
author Alex Szpakowski <slime73@gmail.com>
date Sun, 07 Apr 2013 17:18:34 -0300
parents aa603d1b03bc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
1 /**
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
2 * Simple DDS data parser for compressed 2D textures.
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
3 *
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
4 * Copyright (c) 2013 Alexander Szpakowski.
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
5 *
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
7 * of this software and associated documentation files (the "Software"), to deal
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
8 * in the Software without restriction, including without limitation the rights
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
10 * copies of the Software, and to permit persons to whom the Software is
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
11 * furnished to do so, subject to the following conditions:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
12 *
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
13 * The above copyright notice and this permission notice shall be included in
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
14 * all copies or substantial portions of the Software.
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
15 *
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
22 * THE SOFTWARE.
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
23 **/
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
24
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
25 #include "ddsparse.h"
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
26 #include "ddsinfo.h"
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
27
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
28 #include <algorithm>
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
29
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
30 namespace dds
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
31 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
32
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
33 using namespace dds::dxinfo;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
34
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
35 // Creates a packed uint representation of a FourCC code.
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
36 static inline uint32_t FourCC(char a, char b, char c, char d)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
37 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
38 uint32_t fcc = ((uint32_t) a)
1422
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
39 | (((uint32_t) b) << 8)
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
40 | (((uint32_t) c) << 16)
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
41 | (((uint32_t) d) << 24);
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
42
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
43 return fcc;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
44 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
45
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
46 Parser::Image::Image()
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
47 : width(0)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
48 , height(0)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
49 , dataSize(0)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
50 , data(0)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
51 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
52 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
53
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
54 bool Parser::isDDS(const void *data, size_t dataSize)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
55 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
56 const uint8_t *readData = (const uint8_t *) data;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
57 ptrdiff_t offset = 0;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
58
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
59 // Is the data large enough to hold the DDS header?
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
60 if(dataSize < sizeof(uint32_t) + sizeof(DDSHeader))
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
61 return false;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
62
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
63 // All DDS files start with "DDS ".
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
64 if((*(uint32_t *) readData) != FourCC('D','D','S',' '))
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
65 return false;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
66
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
67 offset += sizeof(uint32_t);
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
68
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
69 DDSHeader *header = (DDSHeader *) &readData[offset];
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
70
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
71
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
72 // Verify header to validate DDS data.
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
73 if (header->size != sizeof(DDSHeader) || header->format.size != sizeof(DDSPixelFormat))
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
74 return false;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
75
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
76 offset += sizeof(DDSHeader);
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
77
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
78 // Check for DX10 extension.
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
79 if ((header->format.flags & DDPF_FOURCC) && (header->format.fourCC == FourCC('D','X','1','0')))
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
80 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
81 // Data must be big enough for both headers plus the magic value.
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
82 if (dataSize < (sizeof(uint32_t) + sizeof(DDSHeader) + sizeof(DDSHeader10)))
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
83 return false;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
84 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
85
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
86 return true;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
87 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
88
1422
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
89 bool Parser::isCompressedDDS(const void *data, size_t dataSize)
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
90 {
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
91 if (!isDDS(data, dataSize))
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
92 return false;
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
93
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
94 const uint8_t *readData = (const uint8_t *) data;
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
95 ptrdiff_t offset = sizeof(uint32_t);
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
96
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
97 DDSHeader *header = (DDSHeader *) &readData[offset];
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
98 offset += sizeof(DDSHeader);
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
99
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
100 // Check for DX10 extension.
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
101 if ((header->format.flags & DDPF_FOURCC) && (header->format.fourCC == FourCC('D','X','1','0')))
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
102 {
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
103 DDSHeader10 *header10 = (DDSHeader10 *) &readData[offset];
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
104 return parseDX10Format(header10->dxgiFormat) != FORMAT_UNKNOWN;
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
105 }
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
106
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
107 return parseDDSFormat(header->format) != FORMAT_UNKNOWN;
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
108 }
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
109
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
110 Parser::Parser(const void *data, size_t dataSize)
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
111 : format(FORMAT_UNKNOWN)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
112 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
113 parseData(data, dataSize);
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
114 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
115
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
116 Parser::Parser(const Parser &other)
1422
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
117 : texData(other.texData)
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
118 , format(other.format)
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
119 {
1422
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
120 }
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
121
1422
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
122 Parser::Parser()
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
123 : format(FORMAT_UNKNOWN)
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
124 {
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
125 }
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
126
1422
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
127 Parser &Parser::operator = (const Parser &other)
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
128 {
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
129 texData = other.texData;
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
130 format = other.format;
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
131
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
132 return *this;
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
133 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
134
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
135 Parser::~Parser()
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
136 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
137 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
138
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
139 Format Parser::getFormat() const
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
140 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
141 return format;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
142 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
143
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
144 const Parser::Image *Parser::getImageData(size_t miplevel) const
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
145 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
146 if (miplevel >= texData.size())
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
147 return 0;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
148
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
149 return &texData[miplevel];
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
150 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
151
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
152 size_t Parser::getNumMipmaps() const
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
153 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
154 return texData.size();
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
155 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
156
1422
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
157 Format Parser::parseDDSFormat(const DDSPixelFormat &fmt)
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
158 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
159 if (fmt.flags & DDPF_FOURCC)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
160 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
161 if (fmt.fourCC == FourCC('D','X','T','1'))
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
162 return FORMAT_DXT1;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
163 else if (fmt.fourCC == FourCC('D','X','T','3'))
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
164 return FORMAT_DXT3;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
165 else if (fmt.fourCC == FourCC('D','X','T','5'))
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
166 return FORMAT_DXT5;
1422
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
167 else if (fmt.fourCC == FourCC('A','T','I','1'))
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
168 return FORMAT_BC4;
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
169 else if (fmt.fourCC == FourCC('A','T','I','2'))
1421
aa603d1b03bc Code cleanup
Alex Szpakowski <slime73@gmail.com>
parents: 1420
diff changeset
170 return FORMAT_BC5;
1422
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
171 else if (fmt.fourCC == FourCC('B','C','4','U'))
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
172 return FORMAT_BC4;
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
173 else if (fmt.fourCC == FourCC('B','C','4','S'))
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
174 return FORMAT_BC4s;
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
175 else if (fmt.fourCC == FourCC('B','C','5','U'))
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
176 return FORMAT_BC5;
1421
aa603d1b03bc Code cleanup
Alex Szpakowski <slime73@gmail.com>
parents: 1420
diff changeset
177 else if (fmt.fourCC == FourCC('B','C','5','S'))
aa603d1b03bc Code cleanup
Alex Szpakowski <slime73@gmail.com>
parents: 1420
diff changeset
178 return FORMAT_BC5s;
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
179 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
180
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
181 return FORMAT_UNKNOWN;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
182 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
183
1422
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
184 Format Parser::parseDX10Format(DXGIFormat fmt)
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
185 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
186 Format f = FORMAT_UNKNOWN;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
187
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
188 switch (fmt)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
189 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
190 case DXGI_FORMAT_BC1_TYPELESS:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
191 case DXGI_FORMAT_BC1_UNORM:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
192 case DXGI_FORMAT_BC1_UNORM_SRGB:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
193 f = FORMAT_DXT1;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
194 break;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
195 case DXGI_FORMAT_BC2_TYPELESS:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
196 case DXGI_FORMAT_BC2_UNORM:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
197 case DXGI_FORMAT_BC2_UNORM_SRGB:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
198 f = FORMAT_DXT3;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
199 break;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
200 case DXGI_FORMAT_BC3_TYPELESS:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
201 case DXGI_FORMAT_BC3_UNORM:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
202 case DXGI_FORMAT_BC3_UNORM_SRGB:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
203 f = FORMAT_DXT5;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
204 break;
1422
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
205 case DXGI_FORMAT_BC4_TYPELESS:
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
206 case DXGI_FORMAT_BC4_UNORM:
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
207 f = FORMAT_BC4;
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
208 break;
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
209 case DXGI_FORMAT_BC4_SNORM:
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
210 f = FORMAT_BC4s;
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
211 break;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
212 case DXGI_FORMAT_BC5_TYPELESS:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
213 case DXGI_FORMAT_BC5_UNORM:
1421
aa603d1b03bc Code cleanup
Alex Szpakowski <slime73@gmail.com>
parents: 1420
diff changeset
214 f = FORMAT_BC5;
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
215 break;
1422
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
216 case DXGI_FORMAT_BC5_SNORM:
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
217 f = FORMAT_BC5s;
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
218 break;
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
219 case DXGI_FORMAT_BC6H_TYPELESS:
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
220 case DXGI_FORMAT_BC6H_UF16:
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
221 f = FORMAT_BC6H;
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
222 break;
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
223 case DXGI_FORMAT_BC6H_SF16:
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
224 f = FORAMT_BC6Hs;
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
225 break;
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
226 case DXGI_FORMAT_BC7_TYPELESS:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
227 case DXGI_FORMAT_BC7_UNORM:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
228 f = FORMAT_BC7;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
229 break;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
230 case DXGI_FORMAT_BC7_UNORM_SRGB:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
231 f = FORMAT_BC7srgb;
1422
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
232 break;
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
233 default:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
234 break;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
235 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
236
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
237 return f;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
238 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
239
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
240 size_t Parser::parseImageSize(Format fmt, int width, int height) const
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
241 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
242 size_t size = 0;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
243
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
244 switch (fmt)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
245 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
246 case FORMAT_DXT1:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
247 case FORMAT_DXT3:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
248 case FORMAT_DXT5:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
249 case FORMAT_BC5s:
1421
aa603d1b03bc Code cleanup
Alex Szpakowski <slime73@gmail.com>
parents: 1420
diff changeset
250 case FORMAT_BC5:
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
251 case FORMAT_BC7:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
252 case FORMAT_BC7srgb:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
253 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
254 int numBlocksWide = 0;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
255 if (width > 0)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
256 numBlocksWide = std::max(1, (width + 3) / 4);
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
257
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
258 int numBlocksHigh = 0;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
259 if (height > 0)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
260 numBlocksHigh = std::max(1, (height + 3) / 4);
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
261
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
262 int numBytesPerBlock = (fmt == FORMAT_DXT1 ? 8 : 16);
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
263
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
264 size = numBlocksWide * numBytesPerBlock * numBlocksHigh;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
265 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
266 break;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
267 default:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
268 break;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
269 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
270
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
271 return size;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
272 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
273
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
274 bool Parser::parseTexData(const uint8_t *data, size_t dataSize, Format fmt, int w, int h, int mips)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
275 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
276 size_t offset = 0;
1422
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
277 std::vector<Image> newTexData;
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
278
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
279 for (int i = 0; i < mips; i++)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
280 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
281 Image img;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
282 img.width = w;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
283 img.height = h;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
284
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
285 img.dataSize = parseImageSize(fmt, img.width, img.height);
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
286
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
287 // Make sure the data size is valid.
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
288 if (img.dataSize == 0 || (offset + img.dataSize) > dataSize)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
289 return false;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
290
1422
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
291 // Store the memory address of the data representing this mip level.
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
292 img.data = &data[offset];
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
293
1422
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
294 newTexData.push_back(img);
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
295
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
296 // Move to the next mip level.
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
297 offset += img.dataSize;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
298
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
299 w = std::max(w / 2, 1);
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
300 h = std::max(h / 2, 1);
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
301 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
302
1422
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
303 texData = newTexData;
377f9dad7a2d Replaced the devil love.image module with love.image.magpie, which can decide which image library to use in a similar manner to love.sound.lullaby. Some rough edges still exist.
Alex Szpakowski <slime73@gmail.com>
parents: 1421
diff changeset
304
1420
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
305 return true;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
306 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
307
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
308 bool Parser::parseData(const void *data, size_t dataSize)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
309 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
310 if (!isDDS(data, dataSize))
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
311 return false;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
312
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
313 const uint8_t *readData = (const uint8_t *) data;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
314 ptrdiff_t offset = sizeof(uint32_t);
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
315
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
316 DDSHeader *header = (DDSHeader *) &readData[offset];
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
317 offset += sizeof(DDSHeader);
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
318
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
319
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
320 // Check for DX10 extension.
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
321 if ((header->format.flags & DDPF_FOURCC) && (header->format.fourCC == FourCC('D','X','1','0')))
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
322 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
323 DDSHeader10 *header10 = (DDSHeader10 *) &readData[offset];
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
324 offset += sizeof(DDSHeader10);
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
325
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
326 // We can't deal with 1D/3D textures.
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
327 switch (header10->resourceDimension)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
328 {
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
329 case D3D10_RESOURCE_DIMENSION_TEXTURE2D:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
330 case D3D10_RESOURCE_DIMENSION_UNKNOWN:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
331 break;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
332 default:
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
333 return false;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
334 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
335
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
336 // We also can't deal with texture arrays and cubemaps.
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
337 if (header10->arraySize > 1)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
338 return false;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
339
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
340 format = parseDX10Format(header10->dxgiFormat);
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
341 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
342 else
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
343 format = parseDDSFormat(header->format);
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
344
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
345
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
346 if (format == FORMAT_UNKNOWN)
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
347 return false;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
348
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
349
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
350 int w = header->width;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
351 int h = header->height;
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
352
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
353 int mips = std::max((int) header->mipMapCount, 1);
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
354
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
355 return parseTexData(&readData[offset], dataSize - offset, format, w, h, mips);
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
356 }
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
357
2a5ef265e040 Added support for DXT1/3/5 and BC5/7 compressed textures via love.image.CompressedData. Some internals are still iffy.
Alex Szpakowski <slime73@gmail.com>
parents:
diff changeset
358 } // dds