diff --git a/basisu_enc.cpp b/basisu_enc.cpp
index e5c63f5..7057c65 100644
--- a/basisu_enc.cpp
+++ b/basisu_enc.cpp
@@ -53,7 +53,6 @@
 	// Encoder library initialization (just call once at startup)
 	void basisu_encoder_init()
 	{
-		pack_etc1_block_init();
 		basist::basisu_transcoder_init();
 	}
 
diff --git a/basisu_etc.cpp b/basisu_etc.cpp
index 4ccb3a0..244f1d2 100644
--- a/basisu_etc.cpp
+++ b/basisu_etc.cpp
@@ -117,135 +117,6 @@
 		}
 	};
 
-	// Given an ETC1 diff/inten_table/selector, and an 8-bit desired color, this table encodes the best packed_color in the low byte, and the abs error in the high byte.
-	static uint16_t g_etc1_inverse_lookup[2 * 8 * 4][256];      // [diff/inten_table/selector][desired_color]
-
-	// g_color8_to_etc_block_config[color][table_index] = Supplies for each 8-bit color value a list of packed ETC1 diff/intensity table/selectors/packed_colors that map to that color.
-	// To pack: diff | (inten << 1) | (selector << 4) | (packed_c << 8)
-	static const uint16_t g_color8_to_etc_block_config_0_255[2][33] =
-	{
-		{ 0x0000,  0x0010,  0x0002,  0x0012,  0x0004,  0x0014,  0x0006,  0x0016,  0x0008,  0x0018,  0x000A,  0x001A,  0x000C,  0x001C,  0x000E,  0x001E,
-		 0x0001,  0x0011,  0x0003,  0x0013,  0x0005,  0x0015,  0x0007,  0x0017,  0x0009,  0x0019,  0x000B,  0x001B,  0x000D,  0x001D,  0x000F,  0x001F, 0xFFFF },
-		{ 0x0F20,  0x0F30,  0x0E32,  0x0F22,  0x0E34,  0x0F24,  0x0D36,  0x0F26,  0x0C38,  0x0E28,  0x0B3A,  0x0E2A,  0x093C,  0x0E2C,  0x053E,  0x0D2E,
-		 0x1E31,  0x1F21,  0x1D33,  0x1F23,  0x1C35,  0x1E25,  0x1A37,  0x1E27,  0x1839,  0x1D29,  0x163B,  0x1C2B,  0x133D,  0x1B2D,  0x093F,  0x1A2F, 0xFFFF },
-	};
-
-	// Really only [254][11].
-	static const uint16_t g_color8_to_etc_block_config_1_to_254[254][12] =
-	{
-		{ 0x021C, 0x0D0D, 0xFFFF }, { 0x0020, 0x0021, 0x0A0B, 0x061F, 0xFFFF }, { 0x0113, 0x0217, 0xFFFF }, { 0x0116, 0x031E,
-		0x0B0E, 0x0405, 0xFFFF }, { 0x0022, 0x0204, 0x050A, 0x0023, 0xFFFF }, { 0x0111, 0x0319, 0x0809, 0x170F, 0xFFFF }, {
-		0x0303, 0x0215, 0x0607, 0xFFFF }, { 0x0030, 0x0114, 0x0408, 0x0031, 0x0201, 0x051D, 0xFFFF }, { 0x0100, 0x0024, 0x0306,
-		0x0025, 0x041B, 0x0E0D, 0xFFFF }, { 0x021A, 0x0121, 0x0B0B, 0x071F, 0xFFFF }, { 0x0213, 0x0317, 0xFFFF }, { 0x0112,
-		0x0505, 0xFFFF }, { 0x0026, 0x070C, 0x0123, 0x0027, 0xFFFF }, { 0x0211, 0x0909, 0xFFFF }, { 0x0110, 0x0315, 0x0707,
-		0x0419, 0x180F, 0xFFFF }, { 0x0218, 0x0131, 0x0301, 0x0403, 0x061D, 0xFFFF }, { 0x0032, 0x0202, 0x0033, 0x0125, 0x051B,
-		0x0F0D, 0xFFFF }, { 0x0028, 0x031C, 0x0221, 0x0029, 0xFFFF }, { 0x0120, 0x0313, 0x0C0B, 0x081F, 0xFFFF }, { 0x0605,
-		0x0417, 0xFFFF }, { 0x0216, 0x041E, 0x0C0E, 0x0223, 0x0127, 0xFFFF }, { 0x0122, 0x0304, 0x060A, 0x0311, 0x0A09, 0xFFFF
-		}, { 0x0519, 0x190F, 0xFFFF }, { 0x002A, 0x0231, 0x0503, 0x0415, 0x0807, 0x002B, 0x071D, 0xFFFF }, { 0x0130, 0x0214,
-		0x0508, 0x0401, 0x0133, 0x0225, 0x061B, 0xFFFF }, { 0x0200, 0x0124, 0x0406, 0x0321, 0x0129, 0x100D, 0xFFFF }, { 0x031A,
-		0x0D0B, 0x091F, 0xFFFF }, { 0x0413, 0x0705, 0x0517, 0xFFFF }, { 0x0212, 0x0034, 0x0323, 0x0035, 0x0227, 0xFFFF }, {
-		0x0126, 0x080C, 0x0B09, 0xFFFF }, { 0x0411, 0x0619, 0x1A0F, 0xFFFF }, { 0x0210, 0x0331, 0x0603, 0x0515, 0x0907, 0x012B,
-		0xFFFF }, { 0x0318, 0x002C, 0x0501, 0x0233, 0x0325, 0x071B, 0x002D, 0x081D, 0xFFFF }, { 0x0132, 0x0302, 0x0229, 0x110D,
-		0xFFFF }, { 0x0128, 0x041C, 0x0421, 0x0E0B, 0x0A1F, 0xFFFF }, { 0x0220, 0x0513, 0x0617, 0xFFFF }, { 0x0135, 0x0805,
-		0x0327, 0xFFFF }, { 0x0316, 0x051E, 0x0D0E, 0x0423, 0xFFFF }, { 0x0222, 0x0404, 0x070A, 0x0511, 0x0719, 0x0C09, 0x1B0F,
-		0xFFFF }, { 0x0703, 0x0615, 0x0A07, 0x022B, 0xFFFF }, { 0x012A, 0x0431, 0x0601, 0x0333, 0x012D, 0x091D, 0xFFFF }, {
-		0x0230, 0x0314, 0x0036, 0x0608, 0x0425, 0x0037, 0x0329, 0x081B, 0x120D, 0xFFFF }, { 0x0300, 0x0224, 0x0506, 0x0521,
-		0x0F0B, 0x0B1F, 0xFFFF }, { 0x041A, 0x0613, 0x0717, 0xFFFF }, { 0x0235, 0x0905, 0xFFFF }, { 0x0312, 0x0134, 0x0523,
-		0x0427, 0xFFFF }, { 0x0226, 0x090C, 0x002E, 0x0611, 0x0D09, 0x002F, 0xFFFF }, { 0x0715, 0x0B07, 0x0819, 0x032B, 0x1C0F,
-		0xFFFF }, { 0x0310, 0x0531, 0x0701, 0x0803, 0x022D, 0x0A1D, 0xFFFF }, { 0x0418, 0x012C, 0x0433, 0x0525, 0x0137, 0x091B,
-		0x130D, 0xFFFF }, { 0x0232, 0x0402, 0x0621, 0x0429, 0xFFFF }, { 0x0228, 0x051C, 0x0713, 0x100B, 0x0C1F, 0xFFFF }, {
-		0x0320, 0x0335, 0x0A05, 0x0817, 0xFFFF }, { 0x0623, 0x0527, 0xFFFF }, { 0x0416, 0x061E, 0x0E0E, 0x0711, 0x0E09, 0x012F,
-		0xFFFF }, { 0x0322, 0x0504, 0x080A, 0x0919, 0x1D0F, 0xFFFF }, { 0x0631, 0x0903, 0x0815, 0x0C07, 0x042B, 0x032D, 0x0B1D,
-		0xFFFF }, { 0x022A, 0x0801, 0x0533, 0x0625, 0x0237, 0x0A1B, 0xFFFF }, { 0x0330, 0x0414, 0x0136, 0x0708, 0x0721, 0x0529,
-		0x140D, 0xFFFF }, { 0x0400, 0x0324, 0x0606, 0x0038, 0x0039, 0x110B, 0x0D1F, 0xFFFF }, { 0x051A, 0x0813, 0x0B05, 0x0917,
-		0xFFFF }, { 0x0723, 0x0435, 0x0627, 0xFFFF }, { 0x0412, 0x0234, 0x0F09, 0x022F, 0xFFFF }, { 0x0326, 0x0A0C, 0x012E,
-		0x0811, 0x0A19, 0x1E0F, 0xFFFF }, { 0x0731, 0x0A03, 0x0915, 0x0D07, 0x052B, 0xFFFF }, { 0x0410, 0x0901, 0x0633, 0x0725,
-		0x0337, 0x0B1B, 0x042D, 0x0C1D, 0xFFFF }, { 0x0518, 0x022C, 0x0629, 0x150D, 0xFFFF }, { 0x0332, 0x0502, 0x0821, 0x0139,
-		0x120B, 0x0E1F, 0xFFFF }, { 0x0328, 0x061C, 0x0913, 0x0A17, 0xFFFF }, { 0x0420, 0x0535, 0x0C05, 0x0727, 0xFFFF }, {
-		0x0823, 0x032F, 0xFFFF }, { 0x0516, 0x071E, 0x0F0E, 0x0911, 0x0B19, 0x1009, 0x1F0F, 0xFFFF }, { 0x0422, 0x0604, 0x090A,
-		0x0B03, 0x0A15, 0x0E07, 0x062B, 0xFFFF }, { 0x0831, 0x0A01, 0x0733, 0x052D, 0x0D1D, 0xFFFF }, { 0x032A, 0x0825, 0x0437,
-		0x0729, 0x0C1B, 0x160D, 0xFFFF }, { 0x0430, 0x0514, 0x0236, 0x0808, 0x0921, 0x0239, 0x130B, 0x0F1F, 0xFFFF }, { 0x0500,
-		0x0424, 0x0706, 0x0138, 0x0A13, 0x0B17, 0xFFFF }, { 0x061A, 0x0635, 0x0D05, 0xFFFF }, { 0x0923, 0x0827, 0xFFFF }, {
-		0x0512, 0x0334, 0x003A, 0x0A11, 0x1109, 0x003B, 0x042F, 0xFFFF }, { 0x0426, 0x0B0C, 0x022E, 0x0B15, 0x0F07, 0x0C19,
-		0x072B, 0xFFFF }, { 0x0931, 0x0B01, 0x0C03, 0x062D, 0x0E1D, 0xFFFF }, { 0x0510, 0x0833, 0x0925, 0x0537, 0x0D1B, 0x170D,
-		0xFFFF }, { 0x0618, 0x032C, 0x0A21, 0x0339, 0x0829, 0xFFFF }, { 0x0432, 0x0602, 0x0B13, 0x140B, 0x101F, 0xFFFF }, {
-		0x0428, 0x071C, 0x0735, 0x0E05, 0x0C17, 0xFFFF }, { 0x0520, 0x0A23, 0x0927, 0xFFFF }, { 0x0B11, 0x1209, 0x013B, 0x052F,
-		0xFFFF }, { 0x0616, 0x081E, 0x0D19, 0xFFFF }, { 0x0522, 0x0704, 0x0A0A, 0x0A31, 0x0D03, 0x0C15, 0x1007, 0x082B, 0x072D,
-		0x0F1D, 0xFFFF }, { 0x0C01, 0x0933, 0x0A25, 0x0637, 0x0E1B, 0xFFFF }, { 0x042A, 0x0B21, 0x0929, 0x180D, 0xFFFF }, {
-		0x0530, 0x0614, 0x0336, 0x0908, 0x0439, 0x150B, 0x111F, 0xFFFF }, { 0x0600, 0x0524, 0x0806, 0x0238, 0x0C13, 0x0F05,
-		0x0D17, 0xFFFF }, { 0x071A, 0x0B23, 0x0835, 0x0A27, 0xFFFF }, { 0x1309, 0x023B, 0x062F, 0xFFFF }, { 0x0612, 0x0434,
-		0x013A, 0x0C11, 0x0E19, 0xFFFF }, { 0x0526, 0x0C0C, 0x032E, 0x0B31, 0x0E03, 0x0D15, 0x1107, 0x092B, 0xFFFF }, { 0x0D01,
-		0x0A33, 0x0B25, 0x0737, 0x0F1B, 0x082D, 0x101D, 0xFFFF }, { 0x0610, 0x0A29, 0x190D, 0xFFFF }, { 0x0718, 0x042C, 0x0C21,
-		0x0539, 0x160B, 0x121F, 0xFFFF }, { 0x0532, 0x0702, 0x0D13, 0x0E17, 0xFFFF }, { 0x0528, 0x081C, 0x0935, 0x1005, 0x0B27,
-		0xFFFF }, { 0x0620, 0x0C23, 0x033B, 0x072F, 0xFFFF }, { 0x0D11, 0x0F19, 0x1409, 0xFFFF }, { 0x0716, 0x003C, 0x091E,
-		0x0F03, 0x0E15, 0x1207, 0x0A2B, 0x003D, 0xFFFF }, { 0x0622, 0x0804, 0x0B0A, 0x0C31, 0x0E01, 0x0B33, 0x092D, 0x111D,
-		0xFFFF }, { 0x0C25, 0x0837, 0x0B29, 0x101B, 0x1A0D, 0xFFFF }, { 0x052A, 0x0D21, 0x0639, 0x170B, 0x131F, 0xFFFF }, {
-		0x0630, 0x0714, 0x0436, 0x0A08, 0x0E13, 0x0F17, 0xFFFF }, { 0x0700, 0x0624, 0x0906, 0x0338, 0x0A35, 0x1105, 0xFFFF }, {
-		0x081A, 0x0D23, 0x0C27, 0xFFFF }, { 0x0E11, 0x1509, 0x043B, 0x082F, 0xFFFF }, { 0x0712, 0x0534, 0x023A, 0x0F15, 0x1307,
-		0x1019, 0x0B2B, 0x013D, 0xFFFF }, { 0x0626, 0x0D0C, 0x042E, 0x0D31, 0x0F01, 0x1003, 0x0A2D, 0x121D, 0xFFFF }, { 0x0C33,
-		0x0D25, 0x0937, 0x111B, 0x1B0D, 0xFFFF }, { 0x0710, 0x0E21, 0x0739, 0x0C29, 0xFFFF }, { 0x0818, 0x052C, 0x0F13, 0x180B,
-		0x141F, 0xFFFF }, { 0x0632, 0x0802, 0x0B35, 0x1205, 0x1017, 0xFFFF }, { 0x0628, 0x091C, 0x0E23, 0x0D27, 0xFFFF }, {
-		0x0720, 0x0F11, 0x1609, 0x053B, 0x092F, 0xFFFF }, { 0x1119, 0x023D, 0xFFFF }, { 0x0816, 0x013C, 0x0A1E, 0x0E31, 0x1103,
-		0x1015, 0x1407, 0x0C2B, 0x0B2D, 0x131D, 0xFFFF }, { 0x0722, 0x0904, 0x0C0A, 0x1001, 0x0D33, 0x0E25, 0x0A37, 0x121B,
-		0xFFFF }, { 0x0F21, 0x0D29, 0x1C0D, 0xFFFF }, { 0x062A, 0x0839, 0x190B, 0x151F, 0xFFFF }, { 0x0730, 0x0814, 0x0536,
-		0x0B08, 0x1013, 0x1305, 0x1117, 0xFFFF }, { 0x0800, 0x0724, 0x0A06, 0x0438, 0x0F23, 0x0C35, 0x0E27, 0xFFFF }, { 0x091A,
-		0x1709, 0x063B, 0x0A2F, 0xFFFF }, { 0x1011, 0x1219, 0x033D, 0xFFFF }, { 0x0812, 0x0634, 0x033A, 0x0F31, 0x1203, 0x1115,
-		0x1507, 0x0D2B, 0xFFFF }, { 0x0726, 0x0E0C, 0x052E, 0x1101, 0x0E33, 0x0F25, 0x0B37, 0x131B, 0x0C2D, 0x141D, 0xFFFF }, {
-		0x0E29, 0x1D0D, 0xFFFF }, { 0x0810, 0x1021, 0x0939, 0x1A0B, 0x161F, 0xFFFF }, { 0x0918, 0x062C, 0x1113, 0x1217, 0xFFFF
-		}, { 0x0732, 0x0902, 0x0D35, 0x1405, 0x0F27, 0xFFFF }, { 0x0728, 0x0A1C, 0x1023, 0x073B, 0x0B2F, 0xFFFF }, { 0x0820,
-		0x1111, 0x1319, 0x1809, 0xFFFF }, { 0x1303, 0x1215, 0x1607, 0x0E2B, 0x043D, 0xFFFF }, { 0x0916, 0x023C, 0x0B1E, 0x1031,
-		0x1201, 0x0F33, 0x0D2D, 0x151D, 0xFFFF }, { 0x0822, 0x0A04, 0x0D0A, 0x1025, 0x0C37, 0x0F29, 0x141B, 0x1E0D, 0xFFFF }, {
-		0x1121, 0x0A39, 0x1B0B, 0x171F, 0xFFFF }, { 0x072A, 0x1213, 0x1317, 0xFFFF }, { 0x0830, 0x0914, 0x0636, 0x0C08, 0x0E35,
-		0x1505, 0xFFFF }, { 0x0900, 0x0824, 0x0B06, 0x0538, 0x1123, 0x1027, 0xFFFF }, { 0x0A1A, 0x1211, 0x1909, 0x083B, 0x0C2F,
-		0xFFFF }, { 0x1315, 0x1707, 0x1419, 0x0F2B, 0x053D, 0xFFFF }, { 0x0912, 0x0734, 0x043A, 0x1131, 0x1301, 0x1403, 0x0E2D,
-		0x161D, 0xFFFF }, { 0x0826, 0x0F0C, 0x062E, 0x1033, 0x1125, 0x0D37, 0x151B, 0x1F0D, 0xFFFF }, { 0x1221, 0x0B39, 0x1029,
-		0xFFFF }, { 0x0910, 0x1313, 0x1C0B, 0x181F, 0xFFFF }, { 0x0A18, 0x072C, 0x0F35, 0x1605, 0x1417, 0xFFFF }, { 0x0832,
-		0x0A02, 0x1223, 0x1127, 0xFFFF }, { 0x0828, 0x0B1C, 0x1311, 0x1A09, 0x093B, 0x0D2F, 0xFFFF }, { 0x0920, 0x1519, 0x063D,
-		0xFFFF }, { 0x1231, 0x1503, 0x1415, 0x1807, 0x102B, 0x0F2D, 0x171D, 0xFFFF }, { 0x0A16, 0x033C, 0x0C1E, 0x1401, 0x1133,
-		0x1225, 0x0E37, 0x161B, 0xFFFF }, { 0x0922, 0x0B04, 0x0E0A, 0x1321, 0x1129, 0xFFFF }, { 0x0C39, 0x1D0B, 0x191F, 0xFFFF
-		}, { 0x082A, 0x1413, 0x1705, 0x1517, 0xFFFF }, { 0x0930, 0x0A14, 0x0736, 0x0D08, 0x1323, 0x1035, 0x1227, 0xFFFF }, {
-		0x0A00, 0x0924, 0x0C06, 0x0638, 0x1B09, 0x0A3B, 0x0E2F, 0xFFFF }, { 0x0B1A, 0x1411, 0x1619, 0x073D, 0xFFFF }, { 0x1331,
-		0x1603, 0x1515, 0x1907, 0x112B, 0xFFFF }, { 0x0A12, 0x0834, 0x053A, 0x1501, 0x1233, 0x1325, 0x0F37, 0x171B, 0x102D,
-		0x181D, 0xFFFF }, { 0x0926, 0x072E, 0x1229, 0xFFFF }, { 0x1421, 0x0D39, 0x1E0B, 0x1A1F, 0xFFFF }, { 0x0A10, 0x1513,
-		0x1617, 0xFFFF }, { 0x0B18, 0x082C, 0x1135, 0x1805, 0x1327, 0xFFFF }, { 0x0932, 0x0B02, 0x1423, 0x0B3B, 0x0F2F, 0xFFFF
-		}, { 0x0928, 0x0C1C, 0x1511, 0x1719, 0x1C09, 0xFFFF }, { 0x0A20, 0x1703, 0x1615, 0x1A07, 0x122B, 0x083D, 0xFFFF }, {
-		0x1431, 0x1601, 0x1333, 0x112D, 0x191D, 0xFFFF }, { 0x0B16, 0x043C, 0x0D1E, 0x1425, 0x1037, 0x1329, 0x181B, 0xFFFF }, {
-		0x0A22, 0x0C04, 0x0F0A, 0x1521, 0x0E39, 0x1F0B, 0x1B1F, 0xFFFF }, { 0x1613, 0x1717, 0xFFFF }, { 0x092A, 0x1235, 0x1905,
-		0xFFFF }, { 0x0A30, 0x0B14, 0x0836, 0x0E08, 0x1523, 0x1427, 0xFFFF }, { 0x0B00, 0x0A24, 0x0D06, 0x0738, 0x1611, 0x1D09,
-		0x0C3B, 0x102F, 0xFFFF }, { 0x0C1A, 0x1715, 0x1B07, 0x1819, 0x132B, 0x093D, 0xFFFF }, { 0x1531, 0x1701, 0x1803, 0x122D,
-		0x1A1D, 0xFFFF }, { 0x0B12, 0x0934, 0x063A, 0x1433, 0x1525, 0x1137, 0x191B, 0xFFFF }, { 0x0A26, 0x003E, 0x082E, 0x1621,
-		0x0F39, 0x1429, 0x003F, 0xFFFF }, { 0x1713, 0x1C1F, 0xFFFF }, { 0x0B10, 0x1335, 0x1A05, 0x1817, 0xFFFF }, { 0x0C18,
-		0x092C, 0x1623, 0x1527, 0xFFFF }, { 0x0A32, 0x0C02, 0x1711, 0x1E09, 0x0D3B, 0x112F, 0xFFFF }, { 0x0A28, 0x0D1C, 0x1919,
-		0x0A3D, 0xFFFF }, { 0x0B20, 0x1631, 0x1903, 0x1815, 0x1C07, 0x142B, 0x132D, 0x1B1D, 0xFFFF }, { 0x1801, 0x1533, 0x1625,
-		0x1237, 0x1A1B, 0xFFFF }, { 0x0C16, 0x053C, 0x0E1E, 0x1721, 0x1529, 0x013F, 0xFFFF }, { 0x0B22, 0x0D04, 0x1039, 0x1D1F,
-		0xFFFF }, { 0x1813, 0x1B05, 0x1917, 0xFFFF }, { 0x0A2A, 0x1723, 0x1435, 0x1627, 0xFFFF }, { 0x0B30, 0x0C14, 0x0936,
-		0x0F08, 0x1F09, 0x0E3B, 0x122F, 0xFFFF }, { 0x0C00, 0x0B24, 0x0E06, 0x0838, 0x1811, 0x1A19, 0x0B3D, 0xFFFF }, { 0x0D1A,
-		0x1731, 0x1A03, 0x1915, 0x1D07, 0x152B, 0xFFFF }, { 0x1901, 0x1633, 0x1725, 0x1337, 0x1B1B, 0x142D, 0x1C1D, 0xFFFF }, {
-		0x0C12, 0x0A34, 0x073A, 0x1629, 0x023F, 0xFFFF }, { 0x0B26, 0x013E, 0x092E, 0x1821, 0x1139, 0x1E1F, 0xFFFF }, { 0x1913,
-		0x1A17, 0xFFFF }, { 0x0C10, 0x1535, 0x1C05, 0x1727, 0xFFFF }, { 0x0D18, 0x0A2C, 0x1823, 0x0F3B, 0x132F, 0xFFFF }, {
-		0x0B32, 0x0D02, 0x1911, 0x1B19, 0xFFFF }, { 0x0B28, 0x0E1C, 0x1B03, 0x1A15, 0x1E07, 0x162B, 0x0C3D, 0xFFFF }, { 0x0C20,
-		0x1831, 0x1A01, 0x1733, 0x152D, 0x1D1D, 0xFFFF }, { 0x1825, 0x1437, 0x1729, 0x1C1B, 0x033F, 0xFFFF }, { 0x0D16, 0x063C,
-		0x0F1E, 0x1921, 0x1239, 0x1F1F, 0xFFFF }, { 0x0C22, 0x0E04, 0x1A13, 0x1B17, 0xFFFF }, { 0x1635, 0x1D05, 0xFFFF }, {
-		0x0B2A, 0x1923, 0x1827, 0xFFFF }, { 0x0C30, 0x0D14, 0x0A36, 0x1A11, 0x103B, 0x142F, 0xFFFF }, { 0x0D00, 0x0C24, 0x0F06,
-		0x0938, 0x1B15, 0x1F07, 0x1C19, 0x172B, 0x0D3D, 0xFFFF }, { 0x0E1A, 0x1931, 0x1B01, 0x1C03, 0x162D, 0x1E1D, 0xFFFF }, {
-		0x1833, 0x1925, 0x1537, 0x1D1B, 0xFFFF }, { 0x0D12, 0x0B34, 0x083A, 0x1A21, 0x1339, 0x1829, 0x043F, 0xFFFF }, { 0x0C26,
-		0x023E, 0x0A2E, 0x1B13, 0xFFFF }, { 0x1735, 0x1E05, 0x1C17, 0xFFFF }, { 0x0D10, 0x1A23, 0x1927, 0xFFFF }, { 0x0E18,
-		0x0B2C, 0x1B11, 0x113B, 0x152F, 0xFFFF }, { 0x0C32, 0x0E02, 0x1D19, 0x0E3D, 0xFFFF }, { 0x0C28, 0x0F1C, 0x1A31, 0x1D03,
-		0x1C15, 0x182B, 0x172D, 0x1F1D, 0xFFFF }, { 0x0D20, 0x1C01, 0x1933, 0x1A25, 0x1637, 0x1E1B, 0xFFFF }, { 0x1B21, 0x1929,
-		0x053F, 0xFFFF }, { 0x0E16, 0x073C, 0x1439, 0xFFFF }, { 0x0D22, 0x0F04, 0x1C13, 0x1F05, 0x1D17, 0xFFFF }, { 0x1B23,
-		0x1835, 0x1A27, 0xFFFF }, { 0x0C2A, 0x123B, 0x162F, 0xFFFF }, { 0x0D30, 0x0E14, 0x0B36, 0x1C11, 0x1E19, 0x0F3D, 0xFFFF
-		}, { 0x0E00, 0x0D24, 0x0A38, 0x1B31, 0x1E03, 0x1D15, 0x192B, 0xFFFF }, { 0x0F1A, 0x1D01, 0x1A33, 0x1B25, 0x1737, 0x1F1B,
-		0x182D, 0xFFFF }, { 0x1A29, 0x063F, 0xFFFF }, { 0x0E12, 0x0C34, 0x093A, 0x1C21, 0x1539, 0xFFFF }, { 0x0D26, 0x033E,
-		0x0B2E, 0x1D13, 0x1E17, 0xFFFF }, { 0x1935, 0x1B27, 0xFFFF }, { 0x0E10, 0x1C23, 0x133B, 0x172F, 0xFFFF }, { 0x0F18,
-		0x0C2C, 0x1D11, 0x1F19, 0xFFFF }, { 0x0D32, 0x0F02, 0x1F03, 0x1E15, 0x1A2B, 0x103D, 0xFFFF }, { 0x0D28, 0x1C31, 0x1E01,
-		0x1B33, 0x192D, 0xFFFF }, { 0x0E20, 0x1C25, 0x1837, 0x1B29, 0x073F, 0xFFFF }, { 0x1D21, 0x1639, 0xFFFF }, { 0x0F16,
-		0x083C, 0x1E13, 0x1F17, 0xFFFF }, { 0x0E22, 0x1A35, 0xFFFF }, { 0x1D23, 0x1C27, 0xFFFF }, { 0x0D2A, 0x1E11, 0x143B,
-		0x182F, 0xFFFF }, { 0x0E30, 0x0F14, 0x0C36, 0x1F15, 0x1B2B, 0x113D, 0xFFFF }, { 0x0F00, 0x0E24, 0x0B38, 0x1D31, 0x1F01,
-		0x1A2D, 0xFFFF }, { 0x1C33, 0x1D25, 0x1937, 0xFFFF }, { 0x1E21, 0x1739, 0x1C29, 0x083F, 0xFFFF }, { 0x0F12, 0x0D34,
-		0x0A3A, 0x1F13, 0xFFFF }, { 0x0E26, 0x043E, 0x0C2E, 0x1B35, 0xFFFF }, { 0x1E23, 0x1D27, 0xFFFF }, { 0x0F10, 0x1F11,
-		0x153B, 0x192F, 0xFFFF }, { 0x0D2C, 0x123D, 0xFFFF },
-	};
-
 	uint16_t etc_block::pack_color5(const color_rgba& color, bool scaled, uint32_t bias)
 	{
 		return pack_color5(color.r, color.g, color.b, scaled, bias);
@@ -1200,770 +1071,4 @@
 		return success;
 	}
 
-	static uint32_t etc1_decode_value(uint32_t diff, uint32_t inten, uint32_t selector, uint32_t packed_c)
-	{
-		const uint32_t limit = diff ? 32 : 16; limit;
-		assert((diff < 2) && (inten < 8) && (selector < 4) && (packed_c < limit));
-		int c;
-		if (diff)
-			c = (packed_c >> 2) | (packed_c << 3);
-		else
-			c = packed_c | (packed_c << 4);
-		c += g_etc1_inten_tables[inten][selector];
-		c = clamp<int>(c, 0, 255);
-		return c;
-	}
-
-	void pack_etc1_block_init()
-	{
-		for (uint32_t diff = 0; diff < 2; diff++)
-		{
-			const uint32_t limit = diff ? 32 : 16;
-
-			for (uint32_t inten = 0; inten < 8; inten++)
-			{
-				for (uint32_t selector = 0; selector < 4; selector++)
-				{
-					const uint32_t inverse_table_index = diff + (inten << 1) + (selector << 4);
-					for (uint32_t color = 0; color < 256; color++)
-					{
-						uint32_t best_error = UINT32_MAX, best_packed_c = 0;
-						for (uint32_t packed_c = 0; packed_c < limit; packed_c++)
-						{
-							int v = etc1_decode_value(diff, inten, selector, packed_c);
-							uint32_t err = iabs(v - static_cast<int>(color));
-							if (err < best_error)
-							{
-								best_error = err;
-								best_packed_c = packed_c;
-								if (!best_error)
-									break;
-							}
-						}
-						assert(best_error <= 255);
-						g_etc1_inverse_lookup[inverse_table_index][color] = static_cast<uint16_t>(best_packed_c | (best_error << 8));
-					}
-				}
-			}
-		}
-	}
-
-	// Packs solid color blocks efficiently using a set of small precomputed tables.
-	// For random 888 inputs, MSE results are better than Erricson's ETC1 packer in "slow" mode ~9.5% of the time, is slightly worse only ~.01% of the time, and is equal the rest of the time.
-	uint64_t pack_etc1_block_solid_color(etc_block& block, const uint8_t* pColor, bool diff_only)
-	{
-		assert(g_etc1_inverse_lookup[0][255]);
-
-		static uint32_t s_next_comp[4] = { 1, 2, 0, 1 };
-
-		uint32_t best_error = UINT32_MAX, best_i = 0;
-		int best_x = 0, best_packed_c1 = 0, best_packed_c2 = 0;
-
-		// For each possible 8-bit value, there is a precomputed list of diff/inten/selector configurations that allow that 8-bit value to be encoded with no error.
-		for (uint32_t i = 0; i < 3; i++)
-		{
-			const uint32_t c1 = pColor[s_next_comp[i]], c2 = pColor[s_next_comp[i + 1]];
-
-			const int delta_range = 1;
-			for (int delta = -delta_range; delta <= delta_range; delta++)
-			{
-				const int c_plus_delta = clamp<int>(pColor[i] + delta, 0, 255);
-
-				const uint16_t* pTable;
-				if (!c_plus_delta)
-					pTable = g_color8_to_etc_block_config_0_255[0];
-				else if (c_plus_delta == 255)
-					pTable = g_color8_to_etc_block_config_0_255[1];
-				else
-					pTable = g_color8_to_etc_block_config_1_to_254[c_plus_delta - 1];
-
-				do
-				{
-					const uint32_t x = *pTable++;
-					
-					const bool diff = (x & 1) != 0;
-					if ((diff_only) && (!diff))
-						continue;
-
-#ifdef BASISU_BUILD_DEBUG
-					const uint32_t diff = x & 1;
-					const uint32_t inten = (x >> 1) & 7;
-					const uint32_t selector = (x >> 4) & 3;
-					const uint32_t p0 = (x >> 8) & 255;
-					assert(etc1_decode_value(diff, inten, selector, p0) == (uint32_t)c_plus_delta);
-#endif
-
-					const uint16_t* pInverse_table = g_etc1_inverse_lookup[x & 0xFF];
-					uint16_t p1 = pInverse_table[c1];
-					uint16_t p2 = pInverse_table[c2];
-					const uint32_t trial_error = square(c_plus_delta - pColor[i]) + square(p1 >> 8) + square(p2 >> 8);
-					if (trial_error < best_error)
-					{
-						best_error = trial_error;
-						best_x = x;
-						best_packed_c1 = p1 & 0xFF;
-						best_packed_c2 = p2 & 0xFF;
-						best_i = i;
-						if (!best_error)
-							goto found_perfect_match;
-					}
-				} while (*pTable != 0xFFFF);
-			}
-		}
-	found_perfect_match:
-
-		if (best_error == UINT32_MAX)
-			return UINT64_MAX;
-
-		const uint32_t diff = best_x & 1;
-		const uint32_t inten = (best_x >> 1) & 7;
-
-		block.m_bytes[3] = static_cast<uint8_t>(((inten | (inten << 3)) << 2) | (diff << 1));
-
-		const uint32_t etc1_selector = g_selector_index_to_etc1[(best_x >> 4) & 3];
-		*reinterpret_cast<uint16_t*>(&block.m_bytes[4]) = (etc1_selector & 2) ? 0xFFFF : 0;
-		*reinterpret_cast<uint16_t*>(&block.m_bytes[6]) = (etc1_selector & 1) ? 0xFFFF : 0;
-
-		const uint32_t best_packed_c0 = (best_x >> 8) & 255;
-		if (diff)
-		{
-			block.m_bytes[best_i] = static_cast<uint8_t>(best_packed_c0 << 3);
-			block.m_bytes[s_next_comp[best_i]] = static_cast<uint8_t>(best_packed_c1 << 3);
-			block.m_bytes[s_next_comp[best_i + 1]] = static_cast<uint8_t>(best_packed_c2 << 3);
-		}
-		else
-		{
-			block.m_bytes[best_i] = static_cast<uint8_t>(best_packed_c0 | (best_packed_c0 << 4));
-			block.m_bytes[s_next_comp[best_i]] = static_cast<uint8_t>(best_packed_c1 | (best_packed_c1 << 4));
-			block.m_bytes[s_next_comp[best_i + 1]] = static_cast<uint8_t>(best_packed_c2 | (best_packed_c2 << 4));
-		}
-
-		return best_error;
-	}
-
-	static uint32_t pack_etc1_block_solid_color_constrained(
-		etc1_optimizer::results& results,
-		uint32_t num_colors, const uint8_t *pColor,
-		bool use_diff,
-		const color_rgba* pBase_color5_unscaled)
-	{
-		assert(g_etc1_inverse_lookup[0][255]);
-
-		static uint32_t s_next_comp[4] = { 1, 2, 0, 1 };
-
-		uint32_t best_error = UINT32_MAX, best_i = 0;
-		int best_x = 0, best_packed_c1 = 0, best_packed_c2 = 0;
-
-		// For each possible 8-bit value, there is a precomputed list of diff/inten/selector configurations that allow that 8-bit value to be encoded with no error.
-		for (uint32_t i = 0; i < 3; i++)
-		{
-			const uint32_t c1 = pColor[s_next_comp[i]], c2 = pColor[s_next_comp[i + 1]];
-
-			const int delta_range = 1;
-			for (int delta = -delta_range; delta <= delta_range; delta++)
-			{
-				const int c_plus_delta = clamp<int>(pColor[i] + delta, 0, 255);
-
-				const uint16_t* pTable;
-				if (!c_plus_delta)
-					pTable = g_color8_to_etc_block_config_0_255[0];
-				else if (c_plus_delta == 255)
-					pTable = g_color8_to_etc_block_config_0_255[1];
-				else
-					pTable = g_color8_to_etc_block_config_1_to_254[c_plus_delta - 1];
-
-				do
-				{
-					const uint32_t x = *pTable++;
-					const uint32_t diff = x & 1;
-					if (static_cast<uint32_t>(use_diff) != diff)
-					{
-						if (*pTable == 0xFFFF)
-							break;
-						continue;
-					}
-
-					if ((diff) && (pBase_color5_unscaled))
-					{
-						const int p0 = (x >> 8) & 255;
-						int delta_temp = p0 - static_cast<int>(pBase_color5_unscaled->m_comps[i]);
-						if ((delta_temp < cETC1ColorDeltaMin) || (delta_temp > cETC1ColorDeltaMax))
-						{
-							if (*pTable == 0xFFFF)
-								break;
-							continue;
-						}
-					}
-
-#ifdef BASISU_BUILD_DEBUG
-					{
-						const uint32_t inten = (x >> 1) & 7;
-						const uint32_t selector = (x >> 4) & 3;
-						const uint32_t p0 = (x >> 8) & 255;
-						assert(etc1_decode_value(diff, inten, selector, p0) == (uint32_t)c_plus_delta);
-					}
-#endif
-
-					const uint16_t* pInverse_table = g_etc1_inverse_lookup[x & 0xFF];
-					uint16_t p1 = pInverse_table[c1];
-					uint16_t p2 = pInverse_table[c2];
-
-					if ((diff) && (pBase_color5_unscaled))
-					{
-						int delta1 = (p1 & 0xFF) - static_cast<int>(pBase_color5_unscaled->m_comps[s_next_comp[i]]);
-						int delta2 = (p2 & 0xFF) - static_cast<int>(pBase_color5_unscaled->m_comps[s_next_comp[i + 1]]);
-						if ((delta1 < cETC1ColorDeltaMin) || (delta1 > cETC1ColorDeltaMax) || (delta2 < cETC1ColorDeltaMin) || (delta2 > cETC1ColorDeltaMax))
-						{
-							if (*pTable == 0xFFFF)
-								break;
-							continue;
-						}
-					}
-
-					const uint32_t trial_error = square(c_plus_delta - pColor[i]) + square(p1 >> 8) + square(p2 >> 8);
-					if (trial_error < best_error)
-					{
-						best_error = trial_error;
-						best_x = x;
-						best_packed_c1 = p1 & 0xFF;
-						best_packed_c2 = p2 & 0xFF;
-						best_i = i;
-						if (!best_error)
-							goto found_perfect_match;
-					}
-				} while (*pTable != 0xFFFF);
-			}
-		}
-	found_perfect_match:
-
-		if (best_error == UINT32_MAX)
-			return best_error;
-
-		best_error *= num_colors;
-
-		results.m_n = num_colors;
-		results.m_block_color4 = !(best_x & 1);
-		results.m_block_inten_table = (best_x >> 1) & 7;
-		memset(results.m_pSelectors, (best_x >> 4) & 3, num_colors);
-
-		const uint32_t best_packed_c0 = (best_x >> 8) & 255;
-		results.m_block_color_unscaled[best_i] = static_cast<uint8_t>(best_packed_c0);
-		results.m_block_color_unscaled[s_next_comp[best_i]] = static_cast<uint8_t>(best_packed_c1);
-		results.m_block_color_unscaled[s_next_comp[best_i + 1]] = static_cast<uint8_t>(best_packed_c2);
-		results.m_error = best_error;
-
-		return best_error;
-	}
-
-	static bool invoke_optimizer(etc1_optimizer::results &results, pack_etc1_block_context &context, etc1_optimizer::params &params, const basis_etc1_pack_params &pack_params)
-	{
-		if (!pack_params.m_cluster_fit)
-		{
-			if (params.m_quality >= cETCQualitySlow)
-			{
-				static const int s_scan_delta_0_to_4[] = { -4, -3, -2, -1, 0, 1, 2, 3, 4 };
-				params.m_scan_delta_size = BASISU_ARRAY_SIZE(s_scan_delta_0_to_4);
-				params.m_pScan_deltas = s_scan_delta_0_to_4;
-			}
-			else if (params.m_quality == cETCQualityMedium)
-			{
-				static const int s_scan_delta_0_to_1[] = { -1, 0, 1 };
-				params.m_scan_delta_size = BASISU_ARRAY_SIZE(s_scan_delta_0_to_1);
-				params.m_pScan_deltas = s_scan_delta_0_to_1;
-			}
-			else
-			{
-				static const int s_scan_delta_0[] = { 0 };
-				params.m_scan_delta_size = BASISU_ARRAY_SIZE(s_scan_delta_0);
-				params.m_pScan_deltas = s_scan_delta_0;
-			}
-		}
-
-		context.m_optimizer.init(params, results);
-
-		bool optimizer_succeeded = context.m_optimizer.compute();
-
-#if BASISU_DEBUG_ETC_ENCODER
-		printf("Optimizer succeeded: %u, First optimization pass error: %I64u\n", optimizer_succeeded, results);
-#endif
-
-		if (!pack_params.m_cluster_fit)
-		{
-			// Fairly arbitrary/unrefined thresholds that control how far away to scan for potentially better solutions.
-			const uint32_t refinement_error_thresh0 = 3000 * (results.m_n / 8);
-			const uint32_t refinement_error_thresh1 = 6000 * (results.m_n / 8);
-			if ((params.m_quality >= cETCQualityMedium) && ((results.m_error > refinement_error_thresh0) || (!optimizer_succeeded)))
-			{
-				if (params.m_quality == cETCQualityMedium)
-				{
-					static const int s_scan_delta_2_to_3[] = { -3, -2, 2, 3 };
-					params.m_scan_delta_size = BASISU_ARRAY_SIZE(s_scan_delta_2_to_3);
-					params.m_pScan_deltas = s_scan_delta_2_to_3;
-				}
-				else
-				{
-					static const int s_scan_delta_5_to_5[] = { -5, 5 };
-					static const int s_scan_delta_5_to_8[] = { -8, -7, -6, -5, 5, 6, 7, 8 };
-
-					if (results.m_error > refinement_error_thresh1)
-					{
-						params.m_scan_delta_size = BASISU_ARRAY_SIZE(s_scan_delta_5_to_8);
-						params.m_pScan_deltas = s_scan_delta_5_to_8;
-					}
-					else
-					{
-						params.m_scan_delta_size = BASISU_ARRAY_SIZE(s_scan_delta_5_to_5);
-						params.m_pScan_deltas = s_scan_delta_5_to_5;
-					}
-				}
-
-				if (context.m_optimizer.compute())
-					optimizer_succeeded = true;
-
-#if BASISU_DEBUG_ETC_ENCODER
-				printf("Second optimization pass error: %I64u\n", results.m_error);
-#endif
-			}
-		}
-
-		return optimizer_succeeded;
-	}
-
-	static vec3F color_quad_u8_to_f(const color_rgba& c)
-	{
-		return vec3F(static_cast<float>(c.r), static_cast<float>(c.g), static_cast<float>(c.b));
-	}
-
-	// Returns distance from color c to the gray line going through color d.
-	static inline float gray_distance2(const color_rgba& c, const vec3F& d)
-	{
-		float gray_dist = static_cast<float>(((c.r - d[0]) + (c.g - d[1]) + (c.b - d[2]))) * (1.0f / 3.0f);
-
-		// Project onto the gray line
-		float gray_point_r = clamp(d[0] + gray_dist, 0.0f, 255.0f);
-		float gray_point_g = clamp(d[1] + gray_dist, 0.0f, 255.0f);
-		float gray_point_b = clamp(d[2] + gray_dist, 0.0f, 255.0f);
-
-		// Compute distance^2
-		float dist_to_gray_point_r = static_cast<float>(c.r) - gray_point_r;
-		float dist_to_gray_point_g = static_cast<float>(c.g) - gray_point_g;
-		float dist_to_gray_point_b = static_cast<float>(c.b) - gray_point_b;
-
-		return dist_to_gray_point_r * dist_to_gray_point_r + dist_to_gray_point_g * dist_to_gray_point_g + dist_to_gray_point_b * dist_to_gray_point_b;
-	}
-
-	bool pack_etc1_estimate_flipped(const color_rgba* pSrc_pixels)
-	{
-		vec3F sums[2][2];
-
-#define GET_XY(x, y) color_quad_u8_to_f(pSrc_pixels[(x) + ((y) * 4)])
-
-		sums[0][0] = GET_XY(0, 0) + GET_XY(0, 1) + GET_XY(1, 0) + GET_XY(1, 1);
-		sums[1][0] = GET_XY(2, 0) + GET_XY(2, 1) + GET_XY(3, 0) + GET_XY(3, 1);
-		sums[0][1] = GET_XY(0, 2) + GET_XY(0, 3) + GET_XY(1, 2) + GET_XY(1, 3);
-		sums[1][1] = GET_XY(2, 2) + GET_XY(2, 3) + GET_XY(3, 2) + GET_XY(3, 3);
-
-		vec3F upper_avg((sums[0][0] + sums[1][0]) * (1.0f / 8.0f));
-		vec3F lower_avg((sums[0][1] + sums[1][1]) * (1.0f / 8.0f));
-		vec3F left_avg((sums[0][0] + sums[0][1]) * (1.0f / 8.0f));
-		vec3F right_avg((sums[1][0] + sums[1][1]) * (1.0f / 8.0f));
-
-#undef GET_XY
-#define GET_XY(x, y, a) gray_distance2(pSrc_pixels[(x) + ((y) * 4)], a)
-
-		float upper_gray_dist = 0.0f, lower_gray_dist = 0.0f, left_gray_dist = 0.0f, right_gray_dist = 0.0f;
-		for (uint32_t i = 0; i < 4; i++)
-		{
-			for (uint32_t j = 0; j < 2; j++)
-			{
-				upper_gray_dist += GET_XY(i, j, upper_avg);
-				lower_gray_dist += GET_XY(i, 2 + j, lower_avg);
-				left_gray_dist += GET_XY(j, i, left_avg);
-				right_gray_dist += GET_XY(2 + j, i, right_avg);
-			}
-		}
-
-#undef GET_XY
-
-		float upper_lower_sum = upper_gray_dist + lower_gray_dist;
-		float left_right_sum = left_gray_dist + right_gray_dist;
-
-		return upper_lower_sum < left_right_sum;
-	}
-		
-	uint64_t pack_etc1_block(etc_block& dst_block, const color_rgba* pSrc_pixels, basis_etc1_pack_params& pack_params, pack_etc1_block_context& context, const uint8_t* pForce_selectors)
-	{
-#if BASISU_DEBUG_ETC_ENCODER
-		printf("** Start of block\n");
-#endif
-
-		color_rgba src_pixel0(pSrc_pixels[0]);
-
-		if (!pForce_selectors)
-		{
-			int r;
-			for (r = 15; r >= 1; --r)
-				if ((pSrc_pixels[r].r != src_pixel0.r) || (pSrc_pixels[r].g != src_pixel0.g) || (pSrc_pixels[r].b != src_pixel0.b))
-					break;
-			if (!r)
-			{
-#if BASISU_DEBUG_ETC_ENCODER
-				printf("** Block is a single solid color\n");
-#endif
-				uint64_t err = 16 * pack_etc1_block_solid_color(dst_block, &pSrc_pixels[0].r);
-				dst_block.set_flip_bit(true);
-				return err;
-			}
-		}
-				
-		uint64_t best_error = UINT64_MAX;
-		uint32_t best_flip = false, best_use_color4 = false, best_is_subset = false;
-
-		uint8_t best_selectors[2][8];
-		etc1_optimizer::results best_results[2];
-		for (uint32_t i = 0; i < 2; i++)
-		{
-			best_results[i].m_n = 8;
-			best_results[i].m_pSelectors = best_selectors[i];
-			best_results[i].m_block_color_unscaled.set(0, 0, 0, 255);
-			best_results[i].m_block_inten_table = 0;
-			best_results[i].m_error = 0;
-			best_results[i].m_block_color4 = false;
-		}
-
-		uint8_t best_subset_selectors[16];
-		etc1_optimizer::results best_subset_results;
-		best_subset_results.m_n = 16;
-		best_subset_results.m_pSelectors = best_subset_selectors;
-
-		if (((pForce_selectors) && (pack_params.m_quality >= cETCQualitySlow)) || (pack_params.m_force_etc1s))
-		{
-			// TODO: This may only be useful in force selector mode.
-			uint8_t subset_selectors[16];
-
-			etc1_optimizer::params subset_params(pack_params);
-			subset_params.m_num_src_pixels = 16;
-			subset_params.m_pSrc_pixels = pSrc_pixels;
-			subset_params.m_pForce_selectors = pForce_selectors;
-
-			etc1_optimizer::results subset_results;
-			subset_results.m_n = 16;
-			subset_results.m_pSelectors = subset_selectors;
-
-			for (uint32_t use_color4 = 0; use_color4 < (uint32_t)(pack_params.m_use_color4 ? 2 : 1); use_color4++)
-			{
-				subset_params.m_use_color4 = (use_color4 != 0);
-
-				if (!invoke_optimizer(subset_results, context, subset_params, subset_params))
-					break;
-
-				if (subset_results.m_error < best_error)
-				{
-					best_error = subset_results.m_error;
-					best_flip = true;
-					best_use_color4 = use_color4;
-					best_subset_results = subset_results;
-					best_results[0] = subset_results;
-					best_results[1] = subset_results;
-					best_is_subset = true;
-				}
-			}
-		}
-
-		if ((best_error > 0) && (!pack_params.m_force_etc1s))
-		{
-			uint8_t selectors[3][8];
-			etc1_optimizer::results results[3];
-
-			for (uint32_t i = 0; i < 3; i++)
-			{
-				results[i].m_n = 8;
-				results[i].m_pSelectors = selectors[i];
-			}
-
-			color_rgba subblock_pixels[8];
-
-			etc1_optimizer::params params(pack_params);
-			params.m_num_src_pixels = 8;
-			params.m_pSrc_pixels = subblock_pixels;
-
-			uint8_t forced_selectors[8];
-			params.m_pForce_selectors = pForce_selectors ? forced_selectors : nullptr;
-
-			uint32_t first_flip = 0;
-			uint32_t last_flip = 2;
-			if (pack_params.m_quality < cETCQualitySlow)
-			{
-				const bool should_flip = pack_etc1_estimate_flipped(pSrc_pixels);
-
-				first_flip = should_flip;
-				last_flip = first_flip + 1;
-			}
-
-			for (uint32_t flip = first_flip; flip < last_flip; flip++)
-			{
-				for (uint32_t use_color4 = 0; use_color4 < (uint32_t)(pack_params.m_use_color4 ? 2 : 1); use_color4++)
-				{
-					uint64_t trial_error = 0;
-
-					uint32_t subblock;
-					for (subblock = 0; subblock < 2; subblock++)
-					{
-#if BASISU_DEBUG_ETC_ENCODER
-						printf("** Flip: %u, Color4: %u, Subblock: %u, Best error so far: %I64u\n", flip, use_color4, subblock, best_error);
-#endif
-
-						if (flip)
-						{
-							memcpy(subblock_pixels, pSrc_pixels + subblock * 8, sizeof(color_rgba) * 8);
-
-							if (pForce_selectors)
-								memcpy(forced_selectors, pForce_selectors + subblock * 8, 8);
-						}
-						else
-						{
-							const color_rgba* pSrc_col = pSrc_pixels + subblock * 2;
-							subblock_pixels[0] = pSrc_col[0]; subblock_pixels[1] = pSrc_col[4]; subblock_pixels[2] = pSrc_col[8]; subblock_pixels[3] = pSrc_col[12];
-							subblock_pixels[4] = pSrc_col[1]; subblock_pixels[5] = pSrc_col[5]; subblock_pixels[6] = pSrc_col[9]; subblock_pixels[7] = pSrc_col[13];
-
-							if (pForce_selectors)
-							{
-								const uint8_t* pSrc_sel = pForce_selectors + subblock * 2;
-								forced_selectors[0] = pSrc_sel[0]; forced_selectors[1] = pSrc_sel[4]; forced_selectors[2] = pSrc_sel[8]; forced_selectors[3] = pSrc_sel[12];
-								forced_selectors[4] = pSrc_sel[1]; forced_selectors[5] = pSrc_sel[5]; forced_selectors[6] = pSrc_sel[9]; forced_selectors[7] = pSrc_sel[13];
-							}
-						}
-
-						results[2].m_error = UINT64_MAX;
-						if ((params.m_quality >= cETCQualityMedium) && ((subblock) || (use_color4)) && (pForce_selectors == nullptr))
-						{
-							color_rgba subblock_pixel0(subblock_pixels[0]);
-							int r;
-							for (r = 7; r >= 1; --r)
-								if ((subblock_pixels[r].r != subblock_pixel0.r) || (subblock_pixels[r].g != subblock_pixel0.g) || (subblock_pixels[r].b != subblock_pixel0.b))
-									break;
-							if (!r)
-							{
-								pack_etc1_block_solid_color_constrained(results[2], 8, &subblock_pixel0.r, !use_color4, (subblock && !use_color4) ? &results[0].m_block_color_unscaled : nullptr);
-							}
-						}
-
-						params.m_use_color4 = (use_color4 != 0);
-						params.m_constrain_against_base_color5 = false;
-
-						if ((!use_color4) && (subblock))
-						{
-							params.m_constrain_against_base_color5 = true;
-							params.m_base_color5 = results[0].m_block_color_unscaled;
-						}
-
-						if (!invoke_optimizer(results[subblock], context, params, pack_params))
-						{
-#if BASISU_DEBUG_ETC_ENCODER
-							printf("Optimizer failed\n");
-#endif
-							break;
-
-#if 0
-							if (!pack_params.m_cluster_fit)
-								break;
-
-							// TODO: Test this, is it worth it?								
-							basis_etc1_pack_params temp_pack_params(pack_params);
-							
-							temp_pack_params.m_cluster_fit = false;
-
-							if (!invoke_optimizer(results[subblock], context, params, temp_pack_params))
-							{
-#if BASISU_DEBUG_ETC_ENCODER
-								printf("Optimizer failed again\n");
-#endif
-								break;
-							}
-							else
-							{
-#if BASISU_DEBUG_ETC_ENCODER
-								printf("Optimizer succeeded once cluster fit was disabled\n");
-#endif
-							}
-#endif
-							
-						}
-
-#if BASISU_DEBUG_ETC_ENCODER
-						printf("First optimization pass error: %I64u\n", results[subblock].m_error);
-#endif
-
-						if (results[2].m_error < results[subblock].m_error)
-						{
-#if BASISU_DEBUG_ETC_ENCODER
-							printf("Switching to solid block results for sublock (%I64u vs. %I64u error)\n", results[2].m_error, results[subblock].m_error);
-#endif
-							results[subblock] = results[2];
-						}
-
-						trial_error += results[subblock].m_error;
-						if (trial_error >= best_error)
-						{
-#if BASISU_DEBUG_ETC_ENCODER
-							printf("Early out, trial error %I64u vs. current best error %I64u\n", trial_error, best_error);
-#endif
-							break;
-						}
-					} // subblock
-
-					if (subblock < 2)
-						continue;
-
-					if ((pack_params.m_flip_bias > 0.0f) && (flip) && (pack_params.m_quality >= cETCQualitySlow))
-					{
-						uint64_t nonflip_error = best_error;
-						uint64_t flip_error = trial_error;
-
-						if (!(flip_error < nonflip_error * pack_params.m_flip_bias))
-							continue;
-					}
-
-					best_error = trial_error;
-					best_results[0] = results[0];
-					best_results[1] = results[1];
-					best_flip = flip;
-					best_use_color4 = use_color4;
-					best_is_subset = false;
-
-				} // use_color4
-
-			} // flip
-		}
-
-#if BASISU_DEBUG_ETC_ENCODER
-		printf("Best error: %I64u\n", best_error);
-#endif
-
-		int dr = best_results[1].m_block_color_unscaled.r - best_results[0].m_block_color_unscaled.r;
-		int dg = best_results[1].m_block_color_unscaled.g - best_results[0].m_block_color_unscaled.g;
-		int db = best_results[1].m_block_color_unscaled.b - best_results[0].m_block_color_unscaled.b;
-		if (!best_use_color4)
-		{
-			if ((minimum(dr, dg, db) < cETC1ColorDeltaMin) || (maximum(dr, dg, db) > cETC1ColorDeltaMax))
-			{
-				assert(0);
-#if 0
-				printf("%i %i %i, %i %i %i\n", 
-					best_results[0].m_block_color_unscaled.r,
-					best_results[0].m_block_color_unscaled.g,
-					best_results[0].m_block_color_unscaled.b,
-					best_results[1].m_block_color_unscaled.r,
-					best_results[1].m_block_color_unscaled.g,
-					best_results[1].m_block_color_unscaled.b);
-#endif											
-				// Shouldn't ever happen!
-			}
-		}
-
-		if (best_use_color4)
-		{
-			dst_block.m_bytes[0] = static_cast<uint8_t>(best_results[1].m_block_color_unscaled.r | (best_results[0].m_block_color_unscaled.r << 4));
-			dst_block.m_bytes[1] = static_cast<uint8_t>(best_results[1].m_block_color_unscaled.g | (best_results[0].m_block_color_unscaled.g << 4));
-			dst_block.m_bytes[2] = static_cast<uint8_t>(best_results[1].m_block_color_unscaled.b | (best_results[0].m_block_color_unscaled.b << 4));
-		}
-		else
-		{
-			if (dr < 0) dr += 8;
-			if (dg < 0) dg += 8;
-			if (db < 0) db += 8;
-			dst_block.m_bytes[0] = static_cast<uint8_t>((best_results[0].m_block_color_unscaled.r << 3) | dr);
-			dst_block.m_bytes[1] = static_cast<uint8_t>((best_results[0].m_block_color_unscaled.g << 3) | dg);
-			dst_block.m_bytes[2] = static_cast<uint8_t>((best_results[0].m_block_color_unscaled.b << 3) | db);
-		}
-
-		dst_block.m_bytes[3] = static_cast<uint8_t>((best_results[1].m_block_inten_table << 2) | (best_results[0].m_block_inten_table << 5) | ((~best_use_color4 & 1) << 1) | best_flip);
-
-		uint32_t selector0 = 0, selector1 = 0;
-		if (best_is_subset)
-		{
-			const uint8_t* pSelectors0 = best_subset_results.m_pSelectors;
-			const uint8_t* pSelectors1 = best_subset_results.m_pSelectors + 8;
-			for (int x = 3; x >= 0; --x)
-			{
-				uint32_t b;
-				b = g_selector_index_to_etc1[pSelectors1[4 + x]];
-				selector0 = (selector0 << 1) | (b & 1); selector1 = (selector1 << 1) | (b >> 1);
-
-				b = g_selector_index_to_etc1[pSelectors1[x]];
-				selector0 = (selector0 << 1) | (b & 1); selector1 = (selector1 << 1) | (b >> 1);
-
-				b = g_selector_index_to_etc1[pSelectors0[4 + x]];
-				selector0 = (selector0 << 1) | (b & 1); selector1 = (selector1 << 1) | (b >> 1);
-
-				b = g_selector_index_to_etc1[pSelectors0[x]];
-				selector0 = (selector0 << 1) | (b & 1); selector1 = (selector1 << 1) | (b >> 1);
-			}
-		}
-		else if (best_flip)
-		{
-			// flipped:
-			// { 0, 0 }, { 1, 0 }, { 2, 0 }, { 3, 0 },               
-			// { 0, 1 }, { 1, 1 }, { 2, 1 }, { 3, 1 } 
-			//
-			// { 0, 2 }, { 1, 2 }, { 2, 2 }, { 3, 2 },
-			// { 0, 3 }, { 1, 3 }, { 2, 3 }, { 3, 3 }
-			const uint8_t* pSelectors0 = best_results[0].m_pSelectors;
-			const uint8_t* pSelectors1 = best_results[1].m_pSelectors;
-			for (int x = 3; x >= 0; --x)
-			{
-				uint32_t b;
-				b = g_selector_index_to_etc1[pSelectors1[4 + x]];
-				selector0 = (selector0 << 1) | (b & 1); selector1 = (selector1 << 1) | (b >> 1);
-
-				b = g_selector_index_to_etc1[pSelectors1[x]];
-				selector0 = (selector0 << 1) | (b & 1); selector1 = (selector1 << 1) | (b >> 1);
-
-				b = g_selector_index_to_etc1[pSelectors0[4 + x]];
-				selector0 = (selector0 << 1) | (b & 1); selector1 = (selector1 << 1) | (b >> 1);
-
-				b = g_selector_index_to_etc1[pSelectors0[x]];
-				selector0 = (selector0 << 1) | (b & 1); selector1 = (selector1 << 1) | (b >> 1);
-			}
-		}
-		else
-		{
-			// non-flipped:
-			// { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 },
-			// { 1, 0 }, { 1, 1 }, { 1, 2 }, { 1, 3 }
-			//
-			// { 2, 0 }, { 2, 1 }, { 2, 2 }, { 2, 3 },
-			// { 3, 0 }, { 3, 1 }, { 3, 2 }, { 3, 3 }
-			for (int subblock = 1; subblock >= 0; --subblock)
-			{
-				const uint8_t* pSelectors = best_results[subblock].m_pSelectors + 4;
-				for (uint32_t i = 0; i < 2; i++)
-				{
-					uint32_t b;
-					b = g_selector_index_to_etc1[pSelectors[3]];
-					selector0 = (selector0 << 1) | (b & 1); selector1 = (selector1 << 1) | (b >> 1);
-
-					b = g_selector_index_to_etc1[pSelectors[2]];
-					selector0 = (selector0 << 1) | (b & 1); selector1 = (selector1 << 1) | (b >> 1);
-
-					b = g_selector_index_to_etc1[pSelectors[1]];
-					selector0 = (selector0 << 1) | (b & 1); selector1 = (selector1 << 1) | (b >> 1);
-
-					b = g_selector_index_to_etc1[pSelectors[0]];
-					selector0 = (selector0 << 1) | (b & 1); selector1 = (selector1 << 1) | (b >> 1);
-
-					pSelectors -= 4;
-				}
-			}
-		}
-
-		dst_block.m_bytes[4] = static_cast<uint8_t>(selector1 >> 8);
-		dst_block.m_bytes[5] = static_cast<uint8_t>(selector1 & 0xFF);
-		dst_block.m_bytes[6] = static_cast<uint8_t>(selector0 >> 8);
-		dst_block.m_bytes[7] = static_cast<uint8_t>(selector0 & 0xFF);
-
-		return best_error;
-	}
-	
-			
 } // namespace basisu
diff --git a/basisu_etc.h b/basisu_etc.h
index 7ed1317..a202d01 100644
--- a/basisu_etc.h
+++ b/basisu_etc.h
@@ -1043,12 +1043,4 @@
 		etc1_optimizer m_optimizer;
 	};
 
-	void pack_etc1_block_init();
-
-	uint64_t pack_etc1_block(etc_block& block, const color_rgba* pSrc_pixels, basis_etc1_pack_params& pack_params, pack_etc1_block_context& context, const uint8_t *pForce_selectors = nullptr);
-
-	bool pack_etc1_estimate_flipped(const color_rgba* pSrc_pixels);
-		
-	uint64_t pack_etc1_block_solid_color(etc_block& block, const uint8_t* pColor, bool diff_only = true);
-
 } // namespace basisu
