Browse Source

Finalized DynamicFont implementation

-DynamicFont uses Freetype by default
-Editor fonts are now scalable thanks to this
-Cleaned up documentation browser and added fonts for this
Juan Linietsky 9 years ago
parent
commit
3e8eb396d7
100 changed files with 2700 additions and 1 deletions
  1. 1 0
      .gitignore
  2. 2636 0
      core/hq2x.cpp
  3. 19 0
      core/hq2x.h
  4. 39 1
      core/image.cpp
  5. 1 0
      core/image.h
  6. 2 0
      drivers/SCsub
  7. 2 0
      drivers/freetype/SCsub
  8. 0 0
      drivers/freetype/freetype/include/freetype/config/ftconfig.h
  9. 0 0
      drivers/freetype/freetype/include/freetype/config/ftheader.h
  10. 0 0
      drivers/freetype/freetype/include/freetype/config/ftmodule.h
  11. 0 0
      drivers/freetype/freetype/include/freetype/config/ftoption.h
  12. 0 0
      drivers/freetype/freetype/include/freetype/config/ftstdlib.h
  13. 0 0
      drivers/freetype/freetype/include/freetype/freetype.h
  14. 0 0
      drivers/freetype/freetype/include/freetype/ftadvanc.h
  15. 0 0
      drivers/freetype/freetype/include/freetype/ftautoh.h
  16. 0 0
      drivers/freetype/freetype/include/freetype/ftbbox.h
  17. 0 0
      drivers/freetype/freetype/include/freetype/ftbdf.h
  18. 0 0
      drivers/freetype/freetype/include/freetype/ftbitmap.h
  19. 0 0
      drivers/freetype/freetype/include/freetype/ftbzip2.h
  20. 0 0
      drivers/freetype/freetype/include/freetype/ftcache.h
  21. 0 0
      drivers/freetype/freetype/include/freetype/ftcffdrv.h
  22. 0 0
      drivers/freetype/freetype/include/freetype/ftchapters.h
  23. 0 0
      drivers/freetype/freetype/include/freetype/ftcid.h
  24. 0 0
      drivers/freetype/freetype/include/freetype/fterrdef.h
  25. 0 0
      drivers/freetype/freetype/include/freetype/fterrors.h
  26. 0 0
      drivers/freetype/freetype/include/freetype/ftgasp.h
  27. 0 0
      drivers/freetype/freetype/include/freetype/ftglyph.h
  28. 0 0
      drivers/freetype/freetype/include/freetype/ftgxval.h
  29. 0 0
      drivers/freetype/freetype/include/freetype/ftgzip.h
  30. 0 0
      drivers/freetype/freetype/include/freetype/ftimage.h
  31. 0 0
      drivers/freetype/freetype/include/freetype/ftincrem.h
  32. 0 0
      drivers/freetype/freetype/include/freetype/ftlcdfil.h
  33. 0 0
      drivers/freetype/freetype/include/freetype/ftlist.h
  34. 0 0
      drivers/freetype/freetype/include/freetype/ftlzw.h
  35. 0 0
      drivers/freetype/freetype/include/freetype/ftmac.h
  36. 0 0
      drivers/freetype/freetype/include/freetype/ftmm.h
  37. 0 0
      drivers/freetype/freetype/include/freetype/ftmodapi.h
  38. 0 0
      drivers/freetype/freetype/include/freetype/ftmoderr.h
  39. 0 0
      drivers/freetype/freetype/include/freetype/ftotval.h
  40. 0 0
      drivers/freetype/freetype/include/freetype/ftoutln.h
  41. 0 0
      drivers/freetype/freetype/include/freetype/ftpfr.h
  42. 0 0
      drivers/freetype/freetype/include/freetype/ftrender.h
  43. 0 0
      drivers/freetype/freetype/include/freetype/ftsizes.h
  44. 0 0
      drivers/freetype/freetype/include/freetype/ftsnames.h
  45. 0 0
      drivers/freetype/freetype/include/freetype/ftstroke.h
  46. 0 0
      drivers/freetype/freetype/include/freetype/ftsynth.h
  47. 0 0
      drivers/freetype/freetype/include/freetype/ftsystem.h
  48. 0 0
      drivers/freetype/freetype/include/freetype/fttrigon.h
  49. 0 0
      drivers/freetype/freetype/include/freetype/ftttdrv.h
  50. 0 0
      drivers/freetype/freetype/include/freetype/fttypes.h
  51. 0 0
      drivers/freetype/freetype/include/freetype/ftwinfnt.h
  52. 0 0
      drivers/freetype/freetype/include/freetype/ftxf86.h
  53. 0 0
      drivers/freetype/freetype/include/freetype/internal/autohint.h
  54. 0 0
      drivers/freetype/freetype/include/freetype/internal/ftcalc.h
  55. 0 0
      drivers/freetype/freetype/include/freetype/internal/ftdebug.h
  56. 0 0
      drivers/freetype/freetype/include/freetype/internal/ftdriver.h
  57. 0 0
      drivers/freetype/freetype/include/freetype/internal/ftgloadr.h
  58. 0 0
      drivers/freetype/freetype/include/freetype/internal/ftmemory.h
  59. 0 0
      drivers/freetype/freetype/include/freetype/internal/ftobjs.h
  60. 0 0
      drivers/freetype/freetype/include/freetype/internal/ftpic.h
  61. 0 0
      drivers/freetype/freetype/include/freetype/internal/ftrfork.h
  62. 0 0
      drivers/freetype/freetype/include/freetype/internal/ftserv.h
  63. 0 0
      drivers/freetype/freetype/include/freetype/internal/ftstream.h
  64. 0 0
      drivers/freetype/freetype/include/freetype/internal/fttrace.h
  65. 0 0
      drivers/freetype/freetype/include/freetype/internal/ftvalid.h
  66. 0 0
      drivers/freetype/freetype/include/freetype/internal/internal.h
  67. 0 0
      drivers/freetype/freetype/include/freetype/internal/psaux.h
  68. 0 0
      drivers/freetype/freetype/include/freetype/internal/pshints.h
  69. 0 0
      drivers/freetype/freetype/include/freetype/internal/services/svbdf.h
  70. 0 0
      drivers/freetype/freetype/include/freetype/internal/services/svcid.h
  71. 0 0
      drivers/freetype/freetype/include/freetype/internal/services/svgldict.h
  72. 0 0
      drivers/freetype/freetype/include/freetype/internal/services/svgxval.h
  73. 0 0
      drivers/freetype/freetype/include/freetype/internal/services/svkern.h
  74. 0 0
      drivers/freetype/freetype/include/freetype/internal/services/svmm.h
  75. 0 0
      drivers/freetype/freetype/include/freetype/internal/services/svotval.h
  76. 0 0
      drivers/freetype/freetype/include/freetype/internal/services/svpfr.h
  77. 0 0
      drivers/freetype/freetype/include/freetype/internal/services/svpostnm.h
  78. 0 0
      drivers/freetype/freetype/include/freetype/internal/services/svprop.h
  79. 0 0
      drivers/freetype/freetype/include/freetype/internal/services/svpscmap.h
  80. 0 0
      drivers/freetype/freetype/include/freetype/internal/services/svpsinfo.h
  81. 0 0
      drivers/freetype/freetype/include/freetype/internal/services/svsfnt.h
  82. 0 0
      drivers/freetype/freetype/include/freetype/internal/services/svttcmap.h
  83. 0 0
      drivers/freetype/freetype/include/freetype/internal/services/svtteng.h
  84. 0 0
      drivers/freetype/freetype/include/freetype/internal/services/svttglyf.h
  85. 0 0
      drivers/freetype/freetype/include/freetype/internal/services/svwinfnt.h
  86. 0 0
      drivers/freetype/freetype/include/freetype/internal/services/svxf86nm.h
  87. 0 0
      drivers/freetype/freetype/include/freetype/internal/sfnt.h
  88. 0 0
      drivers/freetype/freetype/include/freetype/internal/t1types.h
  89. 0 0
      drivers/freetype/freetype/include/freetype/internal/tttypes.h
  90. 0 0
      drivers/freetype/freetype/include/freetype/t1tables.h
  91. 0 0
      drivers/freetype/freetype/include/freetype/ttnameid.h
  92. 0 0
      drivers/freetype/freetype/include/freetype/tttables.h
  93. 0 0
      drivers/freetype/freetype/include/freetype/tttags.h
  94. 0 0
      drivers/freetype/freetype/include/freetype/ttunpat.h
  95. 0 0
      drivers/freetype/freetype/include/ftoption.h
  96. 0 0
      drivers/freetype/freetype/src/Jamfile
  97. 0 0
      drivers/freetype/freetype/src/autofit/Jamfile
  98. 0 0
      drivers/freetype/freetype/src/autofit/afangles.c
  99. 0 0
      drivers/freetype/freetype/src/autofit/afangles.h
  100. 0 0
      drivers/freetype/freetype/src/autofit/afcjk.c

+ 1 - 0
.gitignore

@@ -20,6 +20,7 @@ tools/editor/doc_data_compressed.h
 tools/editor/certs_compressed.h
 tools/editor/certs_compressed.h
 tools/editor/editor_icons.cpp
 tools/editor/editor_icons.cpp
 tools/editor/translations.h
 tools/editor/translations.h
+tools/editor/builtin_fonts.h
 -fpic
 -fpic
 .fscache
 .fscache
 make.bat
 make.bat

+ 2636 - 0
core/hq2x.cpp

@@ -0,0 +1,2636 @@
+/*
+ * Copyright 2016 Bruno Ribeiro
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include "hq2x.h"
+#include "math_funcs.h"
+
+
+static const uint32_t AMASK = 0xFF000000;
+static const uint32_t YMASK = 0x00FF0000;
+static const uint32_t UMASK = 0x0000FF00;
+static const uint32_t VMASK = 0x000000FF;
+
+_FORCE_INLINE_ static uint32_t ARGBtoAYUV(
+	uint32_t value )
+{
+    uint32_t A, R, G, B, Y, U, V;
+//todo big endian check
+    A = value >> 24;
+    R = (value >> 16) & 0xFF;
+    G = (value >> 8) & 0xFF;
+    B = value & 0xFF;
+
+    Y = Math::fast_ftoi( 0.299 * R + 0.587 * G + 0.114 * B);
+    U = Math::fast_ftoi(-0.169 * R - 0.331 * G +   0.5 * B) + 128;
+    V = Math::fast_ftoi(   0.5 * R - 0.419 * G - 0.081 * B) + 128;
+    return (A << 24) + (Y << 16) + (U << 8) + V;
+}
+
+
+/*
+ * Use this function for sharper images (good for cartoon style, used by DOSBOX)
+ */
+
+_FORCE_INLINE_ static bool isDifferent(
+	uint32_t color1,
+	uint32_t color2,
+	uint32_t trY,
+	uint32_t trU,
+	uint32_t trV,
+	uint32_t trA )
+{
+	color1 = ARGBtoAYUV(color1);
+	color2 = ARGBtoAYUV(color2);
+
+	uint32_t value;
+
+	value = ((color1 & YMASK) - (color2 & YMASK));
+	value = (value ^ (value >> 31)) - (value >> 31);
+	if (value > trY) return true;
+
+	value = ((color1 & UMASK) - (color2 & UMASK));
+	value = (value ^ (value >> 31)) - (value >> 31);
+	if (value > trU) return true;
+
+	value = ((color1 & VMASK) - (color2 & VMASK));
+	value = (value ^ (value >> 31)) - (value >> 31);
+	if (value > trV) return true;
+
+	value = ((color1 & AMASK) - (color2 & AMASK));
+	value = (value ^ (value >> 31)) - (value >> 31);
+	if (value > trA) return true;
+
+	return false;
+
+}
+
+
+
+#define MASK_RB   0x00FF00FF
+#define MASK_G    0x0000FF00
+#define MASK_A    0xFF000000
+
+
+/**
+ * @brief Mixes two colors using the given weights.
+ */
+#define HQX_MIX_2(C0,C1,W0,W1) \
+	((((C0 & MASK_RB) * W0 + (C1 & MASK_RB) * W1) / (W0 + W1)) & MASK_RB) | \
+	((((C0 & MASK_G)  * W0 + (C1 & MASK_G)  * W1) / (W0 + W1)) & MASK_G)  | \
+	(((((C0 & MASK_A) >> 8)  * W0 + ((C1 & MASK_A) >> 8) * W1) / (W0 + W1)) << 8) & MASK_A
+
+/**
+ * @brief Mixes three colors using the given weights.
+ */
+#define HQX_MIX_3(C0,C1,C2,W0,W1,W2) \
+	((((C0 & MASK_RB) * W0 + (C1 & MASK_RB) * W1 + (C2 & MASK_RB) * W2) / (W0 + W1 + W2)) & MASK_RB) | \
+	((((C0 & MASK_G)  * W0 + (C1 & MASK_G)  * W1 + (C2 & MASK_G)  * W2) / (W0 + W1 + W2)) & MASK_G)  | \
+	(((((C0 & MASK_A) >> 8) * W0 + ((C1 & MASK_A) >> 8) * W1 + ((C2 & MASK_A) >> 8) * W2) / (W0 + W1 + W2)) << 8) & MASK_A
+
+
+#define MIX_00_4				*output = w[4];
+#define MIX_00_MIX_00_4_0_3_1	*output = HQX_MIX_2(w[4],w[0],3U,1U);
+#define MIX_00_4_3_3_1			*output = HQX_MIX_2(w[4],w[3],3U,1U);
+#define MIX_00_4_1_3_1			*output = HQX_MIX_2(w[4],w[1],3U,1U);
+#define MIX_00_3_1_1_1			*output = HQX_MIX_2(w[3],w[1],1U,1U);
+#define MIX_00_4_3_1_2_1_1		*output = HQX_MIX_3(w[4],w[3],w[1],2U,1U,1U);
+#define MIX_00_4_3_1_2_7_7 		*output = HQX_MIX_3(w[4],w[3],w[1],2U,7U,7U);
+#define MIX_00_4_0_1_2_1_1		*output = HQX_MIX_3(w[4],w[0],w[1],2U,1U,1U);
+#define MIX_00_4_0_3_2_1_1		*output = HQX_MIX_3(w[4],w[0],w[3],2U,1U,1U);
+#define MIX_00_4_1_3_5_2_1		*output = HQX_MIX_3(w[4],w[1],w[3],5U,2U,1U);
+#define MIX_00_4_3_1_5_2_1		*output = HQX_MIX_3(w[4],w[3],w[1],5U,2U,1U);
+#define MIX_00_4_3_1_6_1_1		*output = HQX_MIX_3(w[4],w[3],w[1],6U,1U,1U);
+#define MIX_00_4_3_1_2_3_3		*output = HQX_MIX_3(w[4],w[3],w[1],2U,3U,3U);
+#define MIX_00_MIX_00_4_0_3_10	*output = HQX_MIX_3(w[4],w[3],w[1],14U,1U,1U);
+
+#define MIX_01_4			*(output + 1) = w[4];
+#define MIX_01_4_2_3_1		*(output + 1) = HQX_MIX_2(w[4],w[2],3U,1U);
+#define MIX_01_4_1_3_1		*(output + 1) = HQX_MIX_2(w[4],w[1],3U,1U);
+#define MIX_01_1_4_3_1		*(output + 1) = HQX_MIX_2(w[1],w[4],3U,1U);
+#define MIX_01_4_5_3_1		*(output + 1) = HQX_MIX_2(w[4],w[5],3U,1U);
+#define MIX_01_4_1_7_1		*(output + 1) = HQX_MIX_2(w[4],w[1],7U,1U);
+#define MIX_01_4_1_5_2_1_1	*(output + 1) = HQX_MIX_3(w[4],w[1],w[5],2U,1U,1U);
+#define MIX_01_4_2_5_2_1_1	*(output + 1) = HQX_MIX_3(w[4],w[2],w[5],2U,1U,1U);
+#define MIX_01_4_2_1_2_1_1	*(output + 1) = HQX_MIX_3(w[4],w[2],w[1],2U,1U,1U);
+#define MIX_01_4_5_1_5_2_1	*(output + 1) = HQX_MIX_3(w[4],w[5],w[1],5U,2U,1U);
+#define MIX_01_4_1_5_5_2_1	*(output + 1) = HQX_MIX_3(w[4],w[1],w[5],5U,2U,1U);
+#define MIX_01_4_1_5_6_1_1	*(output + 1) = HQX_MIX_3(w[4],w[1],w[5],6U,1U,1U);
+#define MIX_01_4_1_5_2_3_3	*(output + 1) = HQX_MIX_3(w[4],w[1],w[5],2U,3U,3U);
+#define MIX_01_4_2_3_10		*(output + 1) = HQX_MIX_3(w[4],w[1],w[5],14U,1U,1U);
+
+#define MIX_02_4			*(output + 2) = w[4];
+#define MIX_02_4_2_3_1		*(output + 2) = HQX_MIX_2(w[4],w[2],3U,1U);
+#define MIX_02_4_1_3_1		*(output + 2) = HQX_MIX_2(w[4],w[1],3U,1U);
+#define MIX_02_4_5_3_1  	*(output + 2) = HQX_MIX_2(w[4],w[5],3U,1U);
+#define MIX_02_4_1_5_2_1_1	*(output + 2) = HQX_MIX_3(w[4],w[1],w[5],2U,1U,1U);
+#define MIX_02_4_1_5_2_7_7	*(output + 2) = HQX_MIX_3(w[4],w[1],w[5],2U,7U,7U);
+#define MIX_02_1_5_1_1		*(output + 2) = HQX_MIX_2(w[1],w[5],1U,1U);
+
+#define MIX_10_4			*(output + lineSize) = w[4];
+#define MIX_10_4_6_3_1		*(output + lineSize) = HQX_MIX_2(w[4],w[6],3U,1U);
+#define MIX_10_4_7_3_1		*(output + lineSize) = HQX_MIX_2(w[4],w[7],3U,1U);
+#define MIX_10_4_3_3_1		*(output + lineSize) = HQX_MIX_2(w[4],w[3],3U,1U);
+#define MIX_10_4_7_3_2_1_1	*(output + lineSize) = HQX_MIX_3(w[4],w[7],w[3],2U,1U,1U);
+#define MIX_10_4_6_3_2_1_1	*(output + lineSize) = HQX_MIX_3(w[4],w[6],w[3],2U,1U,1U);
+#define MIX_10_4_6_7_2_1_1	*(output + lineSize) = HQX_MIX_3(w[4],w[6],w[7],2U,1U,1U);
+#define MIX_10_4_3_7_5_2_1	*(output + lineSize) = HQX_MIX_3(w[4],w[3],w[7],5U,2U,1U);
+#define MIX_10_4_7_3_5_2_1	*(output + lineSize) = HQX_MIX_3(w[4],w[7],w[3],5U,2U,1U);
+#define MIX_10_4_7_3_6_1_1	*(output + lineSize) = HQX_MIX_3(w[4],w[7],w[3],6U,1U,1U);
+#define MIX_10_4_7_3_2_3_3	*(output + lineSize) = HQX_MIX_3(w[4],w[7],w[3],2U,3U,3U);
+#define MIX_10_4_6_3_10		*(output + lineSize) = HQX_MIX_3(w[4],w[7],w[3],14U,1U,1U);
+#define MIX_10_4_3_7_1  	*(output + lineSize) = HQX_MIX_2(w[4],w[3],7U,1U);
+#define MIX_10_3_4_3_1  	*(output + lineSize) = HQX_MIX_2(w[3],w[4],3U,1U);
+
+#define MIX_11_4			*(output + lineSize + 1) = w[4];
+#define MIX_11_4_8_3_1		*(output + lineSize + 1) = HQX_MIX_2(w[4],w[8],3U,1U);
+#define MIX_11_4_5_3_1		*(output + lineSize + 1) = HQX_MIX_2(w[4],w[5],3U,1U);
+#define MIX_11_4_7_3_1		*(output + lineSize + 1) = HQX_MIX_2(w[4],w[7],3U,1U);
+#define MIX_11_4_5_7_2_1_1	*(output + lineSize + 1) = HQX_MIX_3(w[4],w[5],w[7],2U,1U,1U);
+#define MIX_11_4_8_7_2_1_1	*(output + lineSize + 1) = HQX_MIX_3(w[4],w[8],w[7],2U,1U,1U);
+#define MIX_11_4_8_5_2_1_1	*(output + lineSize + 1) = HQX_MIX_3(w[4],w[8],w[5],2U,1U,1U);
+#define MIX_11_4_7_5_5_2_1	*(output + lineSize + 1) = HQX_MIX_3(w[4],w[7],w[5],5U,2U,1U);
+#define MIX_11_4_5_7_5_2_1	*(output + lineSize + 1) = HQX_MIX_3(w[4],w[5],w[7],5U,2U,1U);
+#define MIX_11_4_5_7_6_1_1	*(output + lineSize + 1) = HQX_MIX_3(w[4],w[5],w[7],6U,1U,1U);
+#define MIX_11_4_5_7_2_3_3	*(output + lineSize + 1) = HQX_MIX_3(w[4],w[5],w[7],2U,3U,3U);
+#define MIX_11_4_8_3_10		*(output + lineSize + 1) = HQX_MIX_3(w[4],w[5],w[7],14U,1U,1U);
+
+#define MIX_12_4			*(output + lineSize + 2) = w[4];
+#define MIX_12_4_5_3_1		*(output + lineSize + 2) = HQX_MIX_2(w[4],w[5],3U,1U);
+#define MIX_12_4_5_7_1		*(output + lineSize + 2) = HQX_MIX_2(w[4],w[5],7U,1U);
+#define MIX_12_5_4_3_1		*(output + lineSize + 2) = HQX_MIX_2(w[5],w[4],3U,1U);
+
+#define MIX_20_4			*(output + lineSize + lineSize) = w[4];
+#define MIX_20_4_6_3_1		*(output + lineSize + lineSize) = HQX_MIX_2(w[4],w[6],3U,1U);
+#define MIX_20_4_7_3_1		*(output + lineSize + lineSize) = HQX_MIX_2(w[4],w[7],3U,1U);
+#define MIX_20_4_3_3_1		*(output + lineSize + lineSize) = HQX_MIX_2(w[4],w[3],3U,1U);
+#define MIX_20_4_7_3_2_1_1	*(output + lineSize + lineSize) = HQX_MIX_3(w[4],w[7],w[3],2U,1U,1U);
+#define MIX_20_4_7_3_2_7_7	*(output + lineSize + lineSize) = HQX_MIX_3(w[4],w[7],w[3],2U,7U,7U);
+#define MIX_20_7_3_1_1		*(output + lineSize + lineSize) = HQX_MIX_2(w[7],w[3],1U,1U);
+
+#define MIX_21_4			*(output + lineSize + lineSize + 1) = w[4];
+#define MIX_21_4_7_3_1		*(output + lineSize + lineSize + 1) = HQX_MIX_2(w[4],w[7],3U,1U);
+#define MIX_21_4_7_7_1		*(output + lineSize + lineSize + 1) = HQX_MIX_2(w[4],w[7],7U,1U);
+#define MIX_21_7_4_3_1		*(output + lineSize + lineSize + 1) = HQX_MIX_2(w[7],w[4],3U,1U);
+
+#define MIX_22_4			*(output + lineSize + lineSize + 2) = w[4];
+#define MIX_22_4_8_3_1		*(output + lineSize + lineSize + 2) = HQX_MIX_2(w[4],w[8],3U,1U);
+#define MIX_22_4_7_3_1		*(output + lineSize + lineSize + 2) = HQX_MIX_2(w[4],w[7],3U,1U);
+#define MIX_22_4_5_3_1		*(output + lineSize + lineSize + 2) = HQX_MIX_2(w[4],w[5],3U,1U);
+#define MIX_22_4_5_7_2_1_1	*(output + lineSize + lineSize + 2) = HQX_MIX_3(w[4],w[5],w[7],2U,1U,1U);
+#define MIX_22_4_5_7_2_7_7	*(output + lineSize + lineSize + 2) = HQX_MIX_3(w[4],w[5],w[7],2U,7U,7U);
+#define MIX_22_5_7_1_1		*(output + lineSize + lineSize + 2) = HQX_MIX_2(w[5],w[7],1U,1U);
+
+
+
+uint32_t *hq2x_resize(
+	const uint32_t *image,
+	uint32_t width,
+	uint32_t height,
+	uint32_t *output,
+	uint32_t trY,
+	uint32_t trU,
+	uint32_t trV,
+	uint32_t trA,
+	bool wrapX,
+	bool wrapY )
+{
+	int lineSize = width * 2;
+
+	int previous, next;
+	uint32_t w[9];
+
+	trY <<= 16;
+	trU <<= 8;
+	trA <<= 24;
+
+	// iterates between the lines
+	for (uint32_t row = 0; row < height; row++)
+	{
+		/*
+		 * Note: this function uses a 3x3 sliding window over the original image.
+		 *
+		 *   +----+----+----+
+		 *   |    |    |    |
+		 *   | w0 | w1 | w2 |
+		 *   +----+----+----+
+		 *   |    |    |    |
+		 *   | w3 | w4 | w5 |
+		 *   +----+----+----+
+		 *   |    |    |    |
+		 *   | w6 | w7 | w8 |
+		 *   +----+----+----+
+		 */
+
+		// adjusts the previous and next line pointers
+		if (row > 0)
+			previous = -width;
+		else
+		{
+			if (wrapY)
+				previous = width * (height - 1);
+			else
+				previous = 0;
+		}
+		if (row < height - 1)
+			next = width;
+		else
+		{
+			if (wrapY)
+				next = -(width * (height - 1));
+			else
+				next = 0;
+		}
+
+		// iterates between the columns
+		for (uint32_t col = 0; col < width; col++)
+		{
+			w[1] = *(image + previous);
+			w[4] = *image;
+			w[7] = *(image + next);
+
+			if (col > 0)
+			{
+				w[0] = *(image + previous - 1);
+				w[3] = *(image - 1);
+				w[6] = *(image + next - 1);
+			}
+			else
+			{
+				if (wrapX)
+				{
+					w[0] = *(image + previous + width - 1);
+					w[3] = *(image + width - 1);
+					w[6] = *(image + next + width - 1);
+				}
+				else
+				{
+					w[0] = w[1];
+					w[3] = w[4];
+					w[6] = w[7];
+				}
+			}
+
+			if (col < width - 1)
+			{
+				w[2] = *(image + previous + 1);
+				w[5] = *(image + 1);
+				w[8] = *(image + next + 1);
+			}
+			else
+			{
+				if (wrapX)
+				{
+					w[2] = *(image + previous - width + 1);
+					w[5] = *(image - width + 1);
+					w[8] = *(image + next - width + 1);
+				}
+				else
+				{
+					w[2] = w[1];
+					w[5] = w[4];
+					w[8] = w[7];
+				}
+			}
+
+			int pattern = 0;
+
+			// computes the pattern to be used considering the neighbor pixels
+			for (int k = 0, flag = 1; k < 9; k++)
+			{
+				// ignores the central pixel
+				if (k == 4) continue;
+
+				if (w[k] != w[4])
+					if (isDifferent(w[4], w[k], trY, trU, trV, trA)) pattern |= flag;
+				flag <<= 1;
+			}
+
+			switch (pattern)
+			{
+				case 0:
+				case 1:
+				case 4:
+				case 32:
+				case 128:
+				case 5:
+				case 132:
+				case 160:
+				case 33:
+				case 129:
+				case 36:
+				case 133:
+				case 164:
+				case 161:
+				case 37:
+				case 165:
+					MIX_00_4_3_1_2_1_1
+					MIX_01_4_1_5_2_1_1
+					MIX_10_4_7_3_2_1_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 2:
+				case 34:
+				case 130:
+				case 162:
+					MIX_00_4_0_3_2_1_1
+					MIX_01_4_2_5_2_1_1
+					MIX_10_4_7_3_2_1_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 16:
+				case 17:
+				case 48:
+				case 49:
+					MIX_00_4_3_1_2_1_1
+					MIX_01_4_2_1_2_1_1
+					MIX_10_4_7_3_2_1_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 64:
+				case 65:
+				case 68:
+				case 69:
+					MIX_00_4_3_1_2_1_1
+					MIX_01_4_1_5_2_1_1
+					MIX_10_4_6_3_2_1_1
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 8:
+				case 12:
+				case 136:
+				case 140:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_1_5_2_1_1
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 3:
+				case 35:
+				case 131:
+				case 163:
+					MIX_00_4_3_3_1
+					MIX_01_4_2_5_2_1_1
+					MIX_10_4_7_3_2_1_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 6:
+				case 38:
+				case 134:
+				case 166:
+					MIX_00_4_0_3_2_1_1
+					MIX_01_4_5_3_1
+					MIX_10_4_7_3_2_1_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 20:
+				case 21:
+				case 52:
+				case 53:
+					MIX_00_4_3_1_2_1_1
+					MIX_01_4_1_3_1
+					MIX_10_4_7_3_2_1_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 144:
+				case 145:
+				case 176:
+				case 177:
+					MIX_00_4_3_1_2_1_1
+					MIX_01_4_2_1_2_1_1
+					MIX_10_4_7_3_2_1_1
+					MIX_11_4_7_3_1
+					break;
+				case 192:
+				case 193:
+				case 196:
+				case 197:
+					MIX_00_4_3_1_2_1_1
+					MIX_01_4_1_5_2_1_1
+					MIX_10_4_6_3_2_1_1
+					MIX_11_4_5_3_1
+					break;
+				case 96:
+				case 97:
+				case 100:
+				case 101:
+					MIX_00_4_3_1_2_1_1
+					MIX_01_4_1_5_2_1_1
+					MIX_10_4_3_3_1
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 40:
+				case 44:
+				case 168:
+				case 172:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_1_5_2_1_1
+					MIX_10_4_7_3_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 9:
+				case 13:
+				case 137:
+				case 141:
+					MIX_00_4_1_3_1
+					MIX_01_4_1_5_2_1_1
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 18:
+				case 50:
+					MIX_00_4_0_3_2_1_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4_2_3_1
+					}
+					else
+					{
+						MIX_01_4_1_5_2_1_1
+					}
+					MIX_10_4_7_3_2_1_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 80:
+				case 81:
+					MIX_00_4_3_1_2_1_1
+					MIX_01_4_2_1_2_1_1
+					MIX_10_4_6_3_2_1_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4_8_3_1
+					}
+					else
+					{
+						MIX_11_4_5_7_2_1_1
+					}
+					break;
+				case 72:
+				case 76:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_1_5_2_1_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4_6_3_1
+					}
+					else
+					{
+						MIX_10_4_7_3_2_1_1
+					}
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 10:
+				case 138:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_MIX_00_4_0_3_1
+					}
+					else
+					{
+						MIX_00_4_3_1_2_1_1
+					}
+					MIX_01_4_2_5_2_1_1
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 66:
+					MIX_00_4_0_3_2_1_1
+					MIX_01_4_2_5_2_1_1
+					MIX_10_4_6_3_2_1_1
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 24:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_2_1_2_1_1
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 7:
+				case 39:
+				case 135:
+					MIX_00_4_3_3_1
+					MIX_01_4_5_3_1
+					MIX_10_4_7_3_2_1_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 148:
+				case 149:
+				case 180:
+					MIX_00_4_3_1_2_1_1
+					MIX_01_4_1_3_1
+					MIX_10_4_7_3_2_1_1
+					MIX_11_4_7_3_1
+					break;
+				case 224:
+				case 228:
+				case 225:
+					MIX_00_4_3_1_2_1_1
+					MIX_01_4_1_5_2_1_1
+					MIX_10_4_3_3_1
+					MIX_11_4_5_3_1
+					break;
+				case 41:
+				case 169:
+				case 45:
+					MIX_00_4_1_3_1
+					MIX_01_4_1_5_2_1_1
+					MIX_10_4_7_3_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 22:
+				case 54:
+					MIX_00_4_0_3_2_1_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_1_5_2_1_1
+					}
+					MIX_10_4_7_3_2_1_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 208:
+				case 209:
+					MIX_00_4_3_1_2_1_1
+					MIX_01_4_2_1_2_1_1
+					MIX_10_4_6_3_2_1_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_5_7_2_1_1
+					}
+					break;
+				case 104:
+				case 108:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_1_5_2_1_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_7_3_2_1_1
+					}
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 11:
+				case 139:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_4_3_1_2_1_1
+					}
+					MIX_01_4_2_5_2_1_1
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 19:
+				case 51:
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+					MIX_00_4_3_3_1
+					MIX_01_4_2_3_1
+					}
+					else
+					{
+					MIX_00_4_1_3_5_2_1
+					MIX_01_4_1_5_2_3_3
+					}
+					MIX_10_4_7_3_2_1_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 146:
+				case 178:
+					MIX_00_4_0_3_2_1_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+					MIX_01_4_2_3_1
+					MIX_11_4_7_3_1
+					}
+					else
+					{
+					MIX_01_4_1_5_2_3_3
+					MIX_11_4_5_7_5_2_1
+					}
+					MIX_10_4_7_3_2_1_1
+					break;
+				case 84:
+				case 85:
+					MIX_00_4_3_1_2_1_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+					MIX_01_4_1_3_1
+					MIX_11_4_8_3_1
+					}
+					else
+					{
+					MIX_01_4_5_1_5_2_1
+					MIX_11_4_5_7_2_3_3
+					}
+					MIX_10_4_6_3_2_1_1
+					break;
+				case 112:
+				case 113:
+					MIX_00_4_3_1_2_1_1
+					MIX_01_4_2_1_2_1_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+					MIX_10_4_3_3_1
+					MIX_11_4_8_3_1
+					}
+					else
+					{
+					MIX_10_4_7_3_5_2_1
+					MIX_11_4_5_7_2_3_3
+					}
+					break;
+				case 200:
+				case 204:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_1_5_2_1_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+					MIX_10_4_6_3_1
+					MIX_11_4_5_3_1
+					}
+					else
+					{
+					MIX_10_4_7_3_2_3_3
+					MIX_11_4_7_5_5_2_1
+					}
+					break;
+				case 73:
+				case 77:
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+					MIX_00_4_1_3_1
+					MIX_10_4_6_3_1
+					}
+					else
+					{
+					MIX_00_4_3_1_5_2_1
+					MIX_10_4_7_3_2_3_3
+					}
+					MIX_01_4_1_5_2_1_1
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 42:
+				case 170:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+					MIX_00_MIX_00_4_0_3_1
+					MIX_10_4_7_3_1
+					}
+					else
+					{
+					MIX_00_4_3_1_2_3_3
+					MIX_10_4_3_7_5_2_1
+					}
+					MIX_01_4_2_5_2_1_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 14:
+				case 142:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+					MIX_00_MIX_00_4_0_3_1
+					MIX_01_4_5_3_1
+					}
+					else
+					{
+					MIX_00_4_3_1_2_3_3
+					MIX_01_4_1_5_5_2_1
+					}
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 67:
+					MIX_00_4_3_3_1
+					MIX_01_4_2_5_2_1_1
+					MIX_10_4_6_3_2_1_1
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 70:
+					MIX_00_4_0_3_2_1_1
+					MIX_01_4_5_3_1
+					MIX_10_4_6_3_2_1_1
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 28:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_1_3_1
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 152:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_2_1_2_1_1
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_7_3_1
+					break;
+				case 194:
+					MIX_00_4_0_3_2_1_1
+					MIX_01_4_2_5_2_1_1
+					MIX_10_4_6_3_2_1_1
+					MIX_11_4_5_3_1
+					break;
+				case 98:
+					MIX_00_4_0_3_2_1_1
+					MIX_01_4_2_5_2_1_1
+					MIX_10_4_3_3_1
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 56:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_2_1_2_1_1
+					MIX_10_4_7_3_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 25:
+					MIX_00_4_1_3_1
+					MIX_01_4_2_1_2_1_1
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 26:
+				case 31:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_4_3_1_2_1_1
+					}
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_1_5_2_1_1
+					}
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 82:
+				case 214:
+					MIX_00_4_0_3_2_1_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_1_5_2_1_1
+					}
+					MIX_10_4_6_3_2_1_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_5_7_2_1_1
+					}
+					break;
+				case 88:
+				case 248:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_2_1_2_1_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_7_3_2_1_1
+					}
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_5_7_2_1_1
+					}
+					break;
+				case 74:
+				case 107:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_4_3_1_2_1_1
+					}
+					MIX_01_4_2_5_2_1_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_7_3_2_1_1
+					}
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 27:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_4_3_1_2_1_1
+					}
+					MIX_01_4_2_3_1
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 86:
+					MIX_00_4_0_3_2_1_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_1_5_2_1_1
+					}
+					MIX_10_4_6_3_2_1_1
+					MIX_11_4_8_3_1
+					break;
+				case 216:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_2_1_2_1_1
+					MIX_10_4_6_3_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_5_7_2_1_1
+					}
+					break;
+				case 106:
+					MIX_00_MIX_00_4_0_3_1
+					MIX_01_4_2_5_2_1_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_7_3_2_1_1
+					}
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 30:
+					MIX_00_MIX_00_4_0_3_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_1_5_2_1_1
+					}
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 210:
+					MIX_00_4_0_3_2_1_1
+					MIX_01_4_2_3_1
+					MIX_10_4_6_3_2_1_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_5_7_2_1_1
+					}
+					break;
+				case 120:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_2_1_2_1_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_7_3_2_1_1
+					}
+					MIX_11_4_8_3_1
+					break;
+				case 75:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_4_3_1_2_1_1
+					}
+					MIX_01_4_2_5_2_1_1
+					MIX_10_4_6_3_1
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 29:
+					MIX_00_4_1_3_1
+					MIX_01_4_1_3_1
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 198:
+					MIX_00_4_0_3_2_1_1
+					MIX_01_4_5_3_1
+					MIX_10_4_6_3_2_1_1
+					MIX_11_4_5_3_1
+					break;
+				case 184:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_2_1_2_1_1
+					MIX_10_4_7_3_1
+					MIX_11_4_7_3_1
+					break;
+				case 99:
+					MIX_00_4_3_3_1
+					MIX_01_4_2_5_2_1_1
+					MIX_10_4_3_3_1
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 57:
+					MIX_00_4_1_3_1
+					MIX_01_4_2_1_2_1_1
+					MIX_10_4_7_3_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 71:
+					MIX_00_4_3_3_1
+					MIX_01_4_5_3_1
+					MIX_10_4_6_3_2_1_1
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 156:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_1_3_1
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_7_3_1
+					break;
+				case 226:
+					MIX_00_4_0_3_2_1_1
+					MIX_01_4_2_5_2_1_1
+					MIX_10_4_3_3_1
+					MIX_11_4_5_3_1
+					break;
+				case 60:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_1_3_1
+					MIX_10_4_7_3_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 195:
+					MIX_00_4_3_3_1
+					MIX_01_4_2_5_2_1_1
+					MIX_10_4_6_3_2_1_1
+					MIX_11_4_5_3_1
+					break;
+				case 102:
+					MIX_00_4_0_3_2_1_1
+					MIX_01_4_5_3_1
+					MIX_10_4_3_3_1
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 153:
+					MIX_00_4_1_3_1
+					MIX_01_4_2_1_2_1_1
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_7_3_1
+					break;
+				case 58:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_MIX_00_4_0_3_1
+					}
+					else
+					{
+						MIX_00_4_3_1_6_1_1
+					}
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4_2_3_1
+					}
+					else
+					{
+						MIX_01_4_1_5_6_1_1
+					}
+					MIX_10_4_7_3_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 83:
+					MIX_00_4_3_3_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4_2_3_1
+					}
+					else
+					{
+						MIX_01_4_1_5_6_1_1
+					}
+					MIX_10_4_6_3_2_1_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4_8_3_1
+					}
+					else
+					{
+						MIX_11_4_5_7_6_1_1
+					}
+					break;
+				case 92:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_1_3_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4_6_3_1
+					}
+					else
+					{
+						MIX_10_4_7_3_6_1_1
+					}
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4_8_3_1
+					}
+					else
+					{
+						MIX_11_4_5_7_6_1_1
+					}
+					break;
+				case 202:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_MIX_00_4_0_3_1
+					}
+					else
+					{
+						MIX_00_4_3_1_6_1_1
+					}
+					MIX_01_4_2_5_2_1_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4_6_3_1
+					}
+					else
+					{
+						MIX_10_4_7_3_6_1_1
+					}
+					MIX_11_4_5_3_1
+					break;
+				case 78:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_MIX_00_4_0_3_1
+					}
+					else
+					{
+						MIX_00_4_3_1_6_1_1
+					}
+					MIX_01_4_5_3_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4_6_3_1
+					}
+					else
+					{
+						MIX_10_4_7_3_6_1_1
+					}
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 154:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_MIX_00_4_0_3_1
+					}
+					else
+					{
+						MIX_00_4_3_1_6_1_1
+					}
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4_2_3_1
+					}
+					else
+					{
+						MIX_01_4_1_5_6_1_1
+					}
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_7_3_1
+					break;
+				case 114:
+					MIX_00_4_0_3_2_1_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4_2_3_1
+					}
+					else
+					{
+						MIX_01_4_1_5_6_1_1
+					}
+					MIX_10_4_3_3_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4_8_3_1
+					}
+					else
+					{
+						MIX_11_4_5_7_6_1_1
+					}
+					break;
+				case 89:
+					MIX_00_4_1_3_1
+					MIX_01_4_2_1_2_1_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4_6_3_1
+					}
+					else
+					{
+						MIX_10_4_7_3_6_1_1
+					}
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4_8_3_1
+					}
+					else
+					{
+						MIX_11_4_5_7_6_1_1
+					}
+					break;
+				case 90:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_MIX_00_4_0_3_1
+					}
+					else
+					{
+						MIX_00_4_3_1_6_1_1
+					}
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4_2_3_1
+					}
+					else
+					{
+						MIX_01_4_1_5_6_1_1
+					}
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4_6_3_1
+					}
+					else
+					{
+						MIX_10_4_7_3_6_1_1
+					}
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4_8_3_1
+					}
+					else
+					{
+						MIX_11_4_5_7_6_1_1
+					}
+					break;
+				case 55:
+				case 23:
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+					MIX_00_4_3_3_1
+					MIX_01_4
+					}
+					else
+					{
+					MIX_00_4_1_3_5_2_1
+					MIX_01_4_1_5_2_3_3
+					}
+					MIX_10_4_7_3_2_1_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 182:
+				case 150:
+					MIX_00_4_0_3_2_1_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+					MIX_01_4
+					MIX_11_4_7_3_1
+					}
+					else
+					{
+					MIX_01_4_1_5_2_3_3
+					MIX_11_4_5_7_5_2_1
+					}
+					MIX_10_4_7_3_2_1_1
+					break;
+				case 213:
+				case 212:
+					MIX_00_4_3_1_2_1_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+					MIX_01_4_1_3_1
+					MIX_11_4
+					}
+					else
+					{
+					MIX_01_4_5_1_5_2_1
+					MIX_11_4_5_7_2_3_3
+					}
+					MIX_10_4_6_3_2_1_1
+					break;
+				case 241:
+				case 240:
+					MIX_00_4_3_1_2_1_1
+					MIX_01_4_2_1_2_1_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+					MIX_10_4_3_3_1
+					MIX_11_4
+					}
+					else
+					{
+					MIX_10_4_7_3_5_2_1
+					MIX_11_4_5_7_2_3_3
+					}
+					break;
+				case 236:
+				case 232:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_1_5_2_1_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+					MIX_10_4
+					MIX_11_4_5_3_1
+					}
+					else
+					{
+					MIX_10_4_7_3_2_3_3
+					MIX_11_4_7_5_5_2_1
+					}
+					break;
+				case 109:
+				case 105:
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+					MIX_00_4_1_3_1
+					MIX_10_4
+					}
+					else
+					{
+					MIX_00_4_3_1_5_2_1
+					MIX_10_4_7_3_2_3_3
+					}
+					MIX_01_4_1_5_2_1_1
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 171:
+				case 43:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+					MIX_00_4
+					MIX_10_4_7_3_1
+					}
+					else
+					{
+					MIX_00_4_3_1_2_3_3
+					MIX_10_4_3_7_5_2_1
+					}
+					MIX_01_4_2_5_2_1_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 143:
+				case 15:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+					MIX_00_4
+					MIX_01_4_5_3_1
+					}
+					else
+					{
+					MIX_00_4_3_1_2_3_3
+					MIX_01_4_1_5_5_2_1
+					}
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 124:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_1_3_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_7_3_2_1_1
+					}
+					MIX_11_4_8_3_1
+					break;
+				case 203:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_4_3_1_2_1_1
+					}
+					MIX_01_4_2_5_2_1_1
+					MIX_10_4_6_3_1
+					MIX_11_4_5_3_1
+					break;
+				case 62:
+					MIX_00_MIX_00_4_0_3_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_1_5_2_1_1
+					}
+					MIX_10_4_7_3_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 211:
+					MIX_00_4_3_3_1
+					MIX_01_4_2_3_1
+					MIX_10_4_6_3_2_1_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_5_7_2_1_1
+					}
+					break;
+				case 118:
+					MIX_00_4_0_3_2_1_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_1_5_2_1_1
+					}
+					MIX_10_4_3_3_1
+					MIX_11_4_8_3_1
+					break;
+				case 217:
+					MIX_00_4_1_3_1
+					MIX_01_4_2_1_2_1_1
+					MIX_10_4_6_3_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_5_7_2_1_1
+					}
+					break;
+				case 110:
+					MIX_00_MIX_00_4_0_3_1
+					MIX_01_4_5_3_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_7_3_2_1_1
+					}
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 155:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_4_3_1_2_1_1
+					}
+					MIX_01_4_2_3_1
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_7_3_1
+					break;
+				case 188:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_1_3_1
+					MIX_10_4_7_3_1
+					MIX_11_4_7_3_1
+					break;
+				case 185:
+					MIX_00_4_1_3_1
+					MIX_01_4_2_1_2_1_1
+					MIX_10_4_7_3_1
+					MIX_11_4_7_3_1
+					break;
+				case 61:
+					MIX_00_4_1_3_1
+					MIX_01_4_1_3_1
+					MIX_10_4_7_3_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 157:
+					MIX_00_4_1_3_1
+					MIX_01_4_1_3_1
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_7_3_1
+					break;
+				case 103:
+					MIX_00_4_3_3_1
+					MIX_01_4_5_3_1
+					MIX_10_4_3_3_1
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 227:
+					MIX_00_4_3_3_1
+					MIX_01_4_2_5_2_1_1
+					MIX_10_4_3_3_1
+					MIX_11_4_5_3_1
+					break;
+				case 230:
+					MIX_00_4_0_3_2_1_1
+					MIX_01_4_5_3_1
+					MIX_10_4_3_3_1
+					MIX_11_4_5_3_1
+					break;
+				case 199:
+					MIX_00_4_3_3_1
+					MIX_01_4_5_3_1
+					MIX_10_4_6_3_2_1_1
+					MIX_11_4_5_3_1
+					break;
+				case 220:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_1_3_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4_6_3_1
+					}
+					else
+					{
+						MIX_10_4_7_3_6_1_1
+					}
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_5_7_2_1_1
+					}
+					break;
+				case 158:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_MIX_00_4_0_3_1
+					}
+					else
+					{
+						MIX_00_4_3_1_6_1_1
+					}
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_1_5_2_1_1
+					}
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_7_3_1
+					break;
+				case 234:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_MIX_00_4_0_3_1
+					}
+					else
+					{
+						MIX_00_4_3_1_6_1_1
+					}
+					MIX_01_4_2_5_2_1_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_7_3_2_1_1
+					}
+					MIX_11_4_5_3_1
+					break;
+				case 242:
+					MIX_00_4_0_3_2_1_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4_2_3_1
+					}
+					else
+					{
+						MIX_01_4_1_5_6_1_1
+					}
+					MIX_10_4_3_3_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_5_7_2_1_1
+					}
+					break;
+				case 59:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_4_3_1_2_1_1
+					}
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4_2_3_1
+					}
+					else
+					{
+						MIX_01_4_1_5_6_1_1
+					}
+					MIX_10_4_7_3_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 121:
+					MIX_00_4_1_3_1
+					MIX_01_4_2_1_2_1_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_7_3_2_1_1
+					}
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4_8_3_1
+					}
+					else
+					{
+						MIX_11_4_5_7_6_1_1
+					}
+					break;
+				case 87:
+					MIX_00_4_3_3_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_1_5_2_1_1
+					}
+					MIX_10_4_6_3_2_1_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4_8_3_1
+					}
+					else
+					{
+						MIX_11_4_5_7_6_1_1
+					}
+					break;
+				case 79:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_4_3_1_2_1_1
+					}
+					MIX_01_4_5_3_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4_6_3_1
+					}
+					else
+					{
+						MIX_10_4_7_3_6_1_1
+					}
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 122:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_MIX_00_4_0_3_1
+					}
+					else
+					{
+						MIX_00_4_3_1_6_1_1
+					}
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4_2_3_1
+					}
+					else
+					{
+						MIX_01_4_1_5_6_1_1
+					}
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_7_3_2_1_1
+					}
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4_8_3_1
+					}
+					else
+					{
+						MIX_11_4_5_7_6_1_1
+					}
+					break;
+				case 94:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_MIX_00_4_0_3_1
+					}
+					else
+					{
+						MIX_00_4_3_1_6_1_1
+					}
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_1_5_2_1_1
+					}
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4_6_3_1
+					}
+					else
+					{
+						MIX_10_4_7_3_6_1_1
+					}
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4_8_3_1
+					}
+					else
+					{
+						MIX_11_4_5_7_6_1_1
+					}
+					break;
+				case 218:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_MIX_00_4_0_3_1
+					}
+					else
+					{
+						MIX_00_4_3_1_6_1_1
+					}
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4_2_3_1
+					}
+					else
+					{
+						MIX_01_4_1_5_6_1_1
+					}
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4_6_3_1
+					}
+					else
+					{
+						MIX_10_4_7_3_6_1_1
+					}
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_5_7_2_1_1
+					}
+					break;
+				case 91:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_4_3_1_2_1_1
+					}
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4_2_3_1
+					}
+					else
+					{
+						MIX_01_4_1_5_6_1_1
+					}
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4_6_3_1
+					}
+					else
+					{
+						MIX_10_4_7_3_6_1_1
+					}
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4_8_3_1
+					}
+					else
+					{
+						MIX_11_4_5_7_6_1_1
+					}
+					break;
+				case 229:
+					MIX_00_4_3_1_2_1_1
+					MIX_01_4_1_5_2_1_1
+					MIX_10_4_3_3_1
+					MIX_11_4_5_3_1
+					break;
+				case 167:
+					MIX_00_4_3_3_1
+					MIX_01_4_5_3_1
+					MIX_10_4_7_3_2_1_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 173:
+					MIX_00_4_1_3_1
+					MIX_01_4_1_5_2_1_1
+					MIX_10_4_7_3_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 181:
+					MIX_00_4_3_1_2_1_1
+					MIX_01_4_1_3_1
+					MIX_10_4_7_3_2_1_1
+					MIX_11_4_7_3_1
+					break;
+				case 186:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_MIX_00_4_0_3_1
+					}
+					else
+					{
+						MIX_00_4_3_1_6_1_1
+					}
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4_2_3_1
+					}
+					else
+					{
+						MIX_01_4_1_5_6_1_1
+					}
+					MIX_10_4_7_3_1
+					MIX_11_4_7_3_1
+					break;
+				case 115:
+					MIX_00_4_3_3_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4_2_3_1
+					}
+					else
+					{
+						MIX_01_4_1_5_6_1_1
+					}
+					MIX_10_4_3_3_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4_8_3_1
+					}
+					else
+					{
+						MIX_11_4_5_7_6_1_1
+					}
+					break;
+				case 93:
+					MIX_00_4_1_3_1
+					MIX_01_4_1_3_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4_6_3_1
+					}
+					else
+					{
+						MIX_10_4_7_3_6_1_1
+					}
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4_8_3_1
+					}
+					else
+					{
+						MIX_11_4_5_7_6_1_1
+					}
+					break;
+				case 206:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_MIX_00_4_0_3_1
+					}
+					else
+					{
+						MIX_00_4_3_1_6_1_1
+					}
+					MIX_01_4_5_3_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4_6_3_1
+					}
+					else
+					{
+						MIX_10_4_7_3_6_1_1
+					}
+					MIX_11_4_5_3_1
+					break;
+				case 205:
+				case 201:
+					MIX_00_4_1_3_1
+					MIX_01_4_1_5_2_1_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4_6_3_1
+					}
+					else
+					{
+						MIX_10_4_7_3_6_1_1
+					}
+					MIX_11_4_5_3_1
+					break;
+				case 174:
+				case 46:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_MIX_00_4_0_3_1
+					}
+					else
+					{
+						MIX_00_4_3_1_6_1_1
+					}
+					MIX_01_4_5_3_1
+					MIX_10_4_7_3_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 179:
+				case 147:
+					MIX_00_4_3_3_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4_2_3_1
+					}
+					else
+					{
+						MIX_01_4_1_5_6_1_1
+					}
+					MIX_10_4_7_3_2_1_1
+					MIX_11_4_7_3_1
+					break;
+				case 117:
+				case 116:
+					MIX_00_4_3_1_2_1_1
+					MIX_01_4_1_3_1
+					MIX_10_4_3_3_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4_8_3_1
+					}
+					else
+					{
+						MIX_11_4_5_7_6_1_1
+					}
+					break;
+				case 189:
+					MIX_00_4_1_3_1
+					MIX_01_4_1_3_1
+					MIX_10_4_7_3_1
+					MIX_11_4_7_3_1
+					break;
+				case 231:
+					MIX_00_4_3_3_1
+					MIX_01_4_5_3_1
+					MIX_10_4_3_3_1
+					MIX_11_4_5_3_1
+					break;
+				case 126:
+					MIX_00_MIX_00_4_0_3_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_1_5_2_1_1
+					}
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_7_3_2_1_1
+					}
+					MIX_11_4_8_3_1
+					break;
+				case 219:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_4_3_1_2_1_1
+					}
+					MIX_01_4_2_3_1
+					MIX_10_4_6_3_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_5_7_2_1_1
+					}
+					break;
+				case 125:
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+					MIX_00_4_1_3_1
+					MIX_10_4
+					}
+					else
+					{
+					MIX_00_4_3_1_5_2_1
+					MIX_10_4_7_3_2_3_3
+					}
+					MIX_01_4_1_3_1
+					MIX_11_4_8_3_1
+					break;
+				case 221:
+					MIX_00_4_1_3_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+					MIX_01_4_1_3_1
+					MIX_11_4
+					}
+					else
+					{
+					MIX_01_4_5_1_5_2_1
+					MIX_11_4_5_7_2_3_3
+					}
+					MIX_10_4_6_3_1
+					break;
+				case 207:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+					MIX_00_4
+					MIX_01_4_5_3_1
+					}
+					else
+					{
+					MIX_00_4_3_1_2_3_3
+					MIX_01_4_1_5_5_2_1
+					}
+					MIX_10_4_6_3_1
+					MIX_11_4_5_3_1
+					break;
+				case 238:
+					MIX_00_MIX_00_4_0_3_1
+					MIX_01_4_5_3_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+					MIX_10_4
+					MIX_11_4_5_3_1
+					}
+					else
+					{
+					MIX_10_4_7_3_2_3_3
+					MIX_11_4_7_5_5_2_1
+					}
+					break;
+				case 190:
+					MIX_00_MIX_00_4_0_3_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+					MIX_01_4
+					MIX_11_4_7_3_1
+					}
+					else
+					{
+					MIX_01_4_1_5_2_3_3
+					MIX_11_4_5_7_5_2_1
+					}
+					MIX_10_4_7_3_1
+					break;
+				case 187:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+					MIX_00_4
+					MIX_10_4_7_3_1
+					}
+					else
+					{
+					MIX_00_4_3_1_2_3_3
+					MIX_10_4_3_7_5_2_1
+					}
+					MIX_01_4_2_3_1
+					MIX_11_4_7_3_1
+					break;
+				case 243:
+					MIX_00_4_3_3_1
+					MIX_01_4_2_3_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+					MIX_10_4_3_3_1
+					MIX_11_4
+					}
+					else
+					{
+					MIX_10_4_7_3_5_2_1
+					MIX_11_4_5_7_2_3_3
+					}
+					break;
+				case 119:
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+					MIX_00_4_3_3_1
+					MIX_01_4
+					}
+					else
+					{
+					MIX_00_4_1_3_5_2_1
+					MIX_01_4_1_5_2_3_3
+					}
+					MIX_10_4_3_3_1
+					MIX_11_4_8_3_1
+					break;
+				case 237:
+				case 233:
+					MIX_00_4_1_3_1
+					MIX_01_4_1_5_2_1_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_6_3_10
+					}
+					MIX_11_4_5_3_1
+					break;
+				case 175:
+				case 47:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_MIX_00_4_0_3_10
+					}
+					MIX_01_4_5_3_1
+					MIX_10_4_7_3_1
+					MIX_11_4_5_7_2_1_1
+					break;
+				case 183:
+				case 151:
+					MIX_00_4_3_3_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_2_3_10
+					}
+					MIX_10_4_7_3_2_1_1
+					MIX_11_4_7_3_1
+					break;
+				case 245:
+				case 244:
+					MIX_00_4_3_1_2_1_1
+					MIX_01_4_1_3_1
+					MIX_10_4_3_3_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_8_3_10
+					}
+					break;
+				case 250:
+					MIX_00_MIX_00_4_0_3_1
+					MIX_01_4_2_3_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_7_3_2_1_1
+					}
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_5_7_2_1_1
+					}
+					break;
+				case 123:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_4_3_1_2_1_1
+					}
+					MIX_01_4_2_3_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_7_3_2_1_1
+					}
+					MIX_11_4_8_3_1
+					break;
+				case 95:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_4_3_1_2_1_1
+					}
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_1_5_2_1_1
+					}
+					MIX_10_4_6_3_1
+					MIX_11_4_8_3_1
+					break;
+				case 222:
+					MIX_00_MIX_00_4_0_3_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_1_5_2_1_1
+					}
+					MIX_10_4_6_3_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_5_7_2_1_1
+					}
+					break;
+				case 252:
+					MIX_00_4_0_1_2_1_1
+					MIX_01_4_1_3_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_7_3_2_1_1
+					}
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_8_3_10
+					}
+					break;
+				case 249:
+					MIX_00_4_1_3_1
+					MIX_01_4_2_1_2_1_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_6_3_10
+					}
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_5_7_2_1_1
+					}
+					break;
+				case 235:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_4_3_1_2_1_1
+					}
+					MIX_01_4_2_5_2_1_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_6_3_10
+					}
+					MIX_11_4_5_3_1
+					break;
+				case 111:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_MIX_00_4_0_3_10
+					}
+					MIX_01_4_5_3_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_7_3_2_1_1
+					}
+					MIX_11_4_8_5_2_1_1
+					break;
+				case 63:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_MIX_00_4_0_3_10
+					}
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_1_5_2_1_1
+					}
+					MIX_10_4_7_3_1
+					MIX_11_4_8_7_2_1_1
+					break;
+				case 159:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_4_3_1_2_1_1
+					}
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_2_3_10
+					}
+					MIX_10_4_6_7_2_1_1
+					MIX_11_4_7_3_1
+					break;
+				case 215:
+					MIX_00_4_3_3_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_2_3_10
+					}
+					MIX_10_4_6_3_2_1_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_5_7_2_1_1
+					}
+					break;
+				case 246:
+					MIX_00_4_0_3_2_1_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_1_5_2_1_1
+					}
+					MIX_10_4_3_3_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_8_3_10
+					}
+					break;
+				case 254:
+					MIX_00_MIX_00_4_0_3_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_1_5_2_1_1
+					}
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_7_3_2_1_1
+					}
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_8_3_10
+					}
+					break;
+				case 253:
+					MIX_00_4_1_3_1
+					MIX_01_4_1_3_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_6_3_10
+					}
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_8_3_10
+					}
+					break;
+				case 251:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_4_3_1_2_1_1
+					}
+					MIX_01_4_2_3_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_6_3_10
+					}
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_5_7_2_1_1
+					}
+					break;
+				case 239:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_MIX_00_4_0_3_10
+					}
+					MIX_01_4_5_3_1
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_6_3_10
+					}
+					MIX_11_4_5_3_1
+					break;
+				case 127:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_MIX_00_4_0_3_10
+					}
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_1_5_2_1_1
+					}
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+					{
+						MIX_10_4
+					}
+					else
+					{
+						MIX_10_4_7_3_2_1_1
+					}
+					MIX_11_4_8_3_1
+					break;
+				case 191:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_MIX_00_4_0_3_10
+					}
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_2_3_10
+					}
+					MIX_10_4_7_3_1
+					MIX_11_4_7_3_1
+					break;
+				case 223:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+					{
+						MIX_00_4
+					}
+					else
+					{
+						MIX_00_4_3_1_2_1_1
+					}
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_2_3_10
+					}
+					MIX_10_4_6_3_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_5_7_2_1_1
+					}
+					break;
+				case 247:
+					MIX_00_4_3_3_1
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+					{
+						MIX_01_4
+					}
+					else
+					{
+						MIX_01_4_2_3_10
+					}
+					MIX_10_4_3_3_1
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+					{
+						MIX_11_4
+					}
+					else
+					{
+						MIX_11_4_8_3_10
+					}
+					break;
+				case 255:
+					if (isDifferent(w[3], w[1], trY, trU, trV, trA))
+						MIX_00_4
+					else
+						MIX_00_MIX_00_4_0_3_10
+
+					if (isDifferent(w[1], w[5], trY, trU, trV, trA))
+						MIX_01_4
+					else
+						MIX_01_4_2_3_10
+
+					if (isDifferent(w[7], w[3], trY, trU, trV, trA))
+						MIX_10_4
+					else
+						MIX_10_4_6_3_10
+
+					if (isDifferent(w[5], w[7], trY, trU, trV, trA))
+						MIX_11_4
+					else
+						MIX_11_4_8_3_10
+					break;
+			}
+			image++;
+			output += 2;
+		}
+		output += lineSize;
+	}
+
+	return output;
+}

+ 19 - 0
core/hq2x.h

@@ -0,0 +1,19 @@
+#ifndef HQ2X_H
+#define HQ2X_H
+
+#include "typedefs.h"
+
+
+uint32_t *hq2x_resize(
+		const uint32_t *image,
+		uint32_t width,
+		uint32_t height,
+		uint32_t *output,
+		uint32_t trY = 0x30,
+		uint32_t trU = 0x07,
+		uint32_t trV = 0x06,
+		uint32_t trA = 0x50,
+		bool wrapX = false,
+		bool wrapY = false );
+
+#endif // HQ2X_H

+ 39 - 1
core/image.cpp

@@ -30,7 +30,7 @@
 #include "hash_map.h"
 #include "hash_map.h"
 #include "core/io/image_loader.h"
 #include "core/io/image_loader.h"
 #include "core/os/copymem.h"
 #include "core/os/copymem.h"
-
+#include "hq2x.h"
 #include "print_string.h"
 #include "print_string.h"
 #include <stdio.h>
 #include <stdio.h>
 
 
@@ -901,6 +901,44 @@ static void _generate_po2_mipmap(const uint8_t* p_src, uint8_t* p_dst, uint32_t
 }
 }
 
 
 
 
+void Image::expand_x2_hq2x() {
+
+	ERR_FAIL_COND(format>=FORMAT_INDEXED);
+
+	Format current = format;
+	bool mipmaps=get_mipmaps();
+	if (mipmaps) {
+		clear_mipmaps();
+	}
+
+	if (current!=FORMAT_RGBA)
+		convert(FORMAT_RGBA);
+
+	DVector<uint8_t> dest;
+	dest.resize(width*2*height*2*4);
+
+	{
+		DVector<uint8_t>::Read r = data.read();
+		DVector<uint8_t>::Write w = dest.write();
+
+		hq2x_resize((const uint32_t*)r.ptr(),width,height,(uint32_t*)w.ptr());
+
+	}
+
+	width*=2;
+	height*=2;
+	data=dest;
+
+
+	if (current!=FORMAT_RGBA)
+		convert(current);
+
+	if (mipmaps) {
+		generate_mipmaps();
+	}
+
+}
+
 void Image::shrink_x2() {
 void Image::shrink_x2() {
 
 
 	ERR_FAIL_COND(format==FORMAT_INDEXED || format==FORMAT_INDEXED_ALPHA);
 	ERR_FAIL_COND(format==FORMAT_INDEXED || format==FORMAT_INDEXED_ALPHA);

+ 1 - 0
core/image.h

@@ -250,6 +250,7 @@ public:
 	void resize( int p_width, int p_height, Interpolation p_interpolation=INTERPOLATE_BILINEAR );
 	void resize( int p_width, int p_height, Interpolation p_interpolation=INTERPOLATE_BILINEAR );
 	Image resized( int p_width, int p_height, int p_interpolation=INTERPOLATE_BILINEAR );
 	Image resized( int p_width, int p_height, int p_interpolation=INTERPOLATE_BILINEAR );
 	void shrink_x2();
 	void shrink_x2();
+	void expand_x2_hq2x();
 	/**
 	/**
 	 * Crop the image to a specific size, if larger, then the image is filled by black
 	 * Crop the image to a specific size, if larger, then the image is filled by black
 	 */
 	 */

+ 2 - 0
drivers/SCsub

@@ -59,6 +59,8 @@ if (env['musepack']=='yes'):
 	SConscript("mpc/SCsub");
 	SConscript("mpc/SCsub");
 if (env["squish"]=="yes" and env["tools"]=="yes"):
 if (env["squish"]=="yes" and env["tools"]=="yes"):
 	SConscript("squish/SCsub");
 	SConscript("squish/SCsub");
+if (env["freetype"]!="no"):
+	SConscript("freetype/SCsub");
 
 
 num = 0
 num = 0
 cur_base = ""
 cur_base = ""

+ 2 - 0
tools/freetype/SCsub → drivers/freetype/SCsub

@@ -66,4 +66,6 @@ if (env["freetype"]=="builtin"):
 #   lib = env.Library("freetype_builtin",ft_sources)
 #   lib = env.Library("freetype_builtin",ft_sources)
 #   env.Prepend(LIBS=[lib])
 #   env.Prepend(LIBS=[lib])
 
 
+
+
 Export('env')
 Export('env')

+ 0 - 0
tools/freetype/freetype/include/freetype/config/ftconfig.h → drivers/freetype/freetype/include/freetype/config/ftconfig.h


+ 0 - 0
tools/freetype/freetype/include/freetype/config/ftheader.h → drivers/freetype/freetype/include/freetype/config/ftheader.h


+ 0 - 0
tools/freetype/freetype/include/freetype/config/ftmodule.h → drivers/freetype/freetype/include/freetype/config/ftmodule.h


+ 0 - 0
tools/freetype/freetype/include/freetype/config/ftoption.h → drivers/freetype/freetype/include/freetype/config/ftoption.h


+ 0 - 0
tools/freetype/freetype/include/freetype/config/ftstdlib.h → drivers/freetype/freetype/include/freetype/config/ftstdlib.h


+ 0 - 0
tools/freetype/freetype/include/freetype/freetype.h → drivers/freetype/freetype/include/freetype/freetype.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftadvanc.h → drivers/freetype/freetype/include/freetype/ftadvanc.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftautoh.h → drivers/freetype/freetype/include/freetype/ftautoh.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftbbox.h → drivers/freetype/freetype/include/freetype/ftbbox.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftbdf.h → drivers/freetype/freetype/include/freetype/ftbdf.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftbitmap.h → drivers/freetype/freetype/include/freetype/ftbitmap.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftbzip2.h → drivers/freetype/freetype/include/freetype/ftbzip2.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftcache.h → drivers/freetype/freetype/include/freetype/ftcache.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftcffdrv.h → drivers/freetype/freetype/include/freetype/ftcffdrv.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftchapters.h → drivers/freetype/freetype/include/freetype/ftchapters.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftcid.h → drivers/freetype/freetype/include/freetype/ftcid.h


+ 0 - 0
tools/freetype/freetype/include/freetype/fterrdef.h → drivers/freetype/freetype/include/freetype/fterrdef.h


+ 0 - 0
tools/freetype/freetype/include/freetype/fterrors.h → drivers/freetype/freetype/include/freetype/fterrors.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftgasp.h → drivers/freetype/freetype/include/freetype/ftgasp.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftglyph.h → drivers/freetype/freetype/include/freetype/ftglyph.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftgxval.h → drivers/freetype/freetype/include/freetype/ftgxval.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftgzip.h → drivers/freetype/freetype/include/freetype/ftgzip.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftimage.h → drivers/freetype/freetype/include/freetype/ftimage.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftincrem.h → drivers/freetype/freetype/include/freetype/ftincrem.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftlcdfil.h → drivers/freetype/freetype/include/freetype/ftlcdfil.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftlist.h → drivers/freetype/freetype/include/freetype/ftlist.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftlzw.h → drivers/freetype/freetype/include/freetype/ftlzw.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftmac.h → drivers/freetype/freetype/include/freetype/ftmac.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftmm.h → drivers/freetype/freetype/include/freetype/ftmm.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftmodapi.h → drivers/freetype/freetype/include/freetype/ftmodapi.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftmoderr.h → drivers/freetype/freetype/include/freetype/ftmoderr.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftotval.h → drivers/freetype/freetype/include/freetype/ftotval.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftoutln.h → drivers/freetype/freetype/include/freetype/ftoutln.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftpfr.h → drivers/freetype/freetype/include/freetype/ftpfr.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftrender.h → drivers/freetype/freetype/include/freetype/ftrender.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftsizes.h → drivers/freetype/freetype/include/freetype/ftsizes.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftsnames.h → drivers/freetype/freetype/include/freetype/ftsnames.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftstroke.h → drivers/freetype/freetype/include/freetype/ftstroke.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftsynth.h → drivers/freetype/freetype/include/freetype/ftsynth.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftsystem.h → drivers/freetype/freetype/include/freetype/ftsystem.h


+ 0 - 0
tools/freetype/freetype/include/freetype/fttrigon.h → drivers/freetype/freetype/include/freetype/fttrigon.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftttdrv.h → drivers/freetype/freetype/include/freetype/ftttdrv.h


+ 0 - 0
tools/freetype/freetype/include/freetype/fttypes.h → drivers/freetype/freetype/include/freetype/fttypes.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftwinfnt.h → drivers/freetype/freetype/include/freetype/ftwinfnt.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ftxf86.h → drivers/freetype/freetype/include/freetype/ftxf86.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/autohint.h → drivers/freetype/freetype/include/freetype/internal/autohint.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/ftcalc.h → drivers/freetype/freetype/include/freetype/internal/ftcalc.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/ftdebug.h → drivers/freetype/freetype/include/freetype/internal/ftdebug.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/ftdriver.h → drivers/freetype/freetype/include/freetype/internal/ftdriver.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/ftgloadr.h → drivers/freetype/freetype/include/freetype/internal/ftgloadr.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/ftmemory.h → drivers/freetype/freetype/include/freetype/internal/ftmemory.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/ftobjs.h → drivers/freetype/freetype/include/freetype/internal/ftobjs.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/ftpic.h → drivers/freetype/freetype/include/freetype/internal/ftpic.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/ftrfork.h → drivers/freetype/freetype/include/freetype/internal/ftrfork.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/ftserv.h → drivers/freetype/freetype/include/freetype/internal/ftserv.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/ftstream.h → drivers/freetype/freetype/include/freetype/internal/ftstream.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/fttrace.h → drivers/freetype/freetype/include/freetype/internal/fttrace.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/ftvalid.h → drivers/freetype/freetype/include/freetype/internal/ftvalid.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/internal.h → drivers/freetype/freetype/include/freetype/internal/internal.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/psaux.h → drivers/freetype/freetype/include/freetype/internal/psaux.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/pshints.h → drivers/freetype/freetype/include/freetype/internal/pshints.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/services/svbdf.h → drivers/freetype/freetype/include/freetype/internal/services/svbdf.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/services/svcid.h → drivers/freetype/freetype/include/freetype/internal/services/svcid.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/services/svgldict.h → drivers/freetype/freetype/include/freetype/internal/services/svgldict.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/services/svgxval.h → drivers/freetype/freetype/include/freetype/internal/services/svgxval.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/services/svkern.h → drivers/freetype/freetype/include/freetype/internal/services/svkern.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/services/svmm.h → drivers/freetype/freetype/include/freetype/internal/services/svmm.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/services/svotval.h → drivers/freetype/freetype/include/freetype/internal/services/svotval.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/services/svpfr.h → drivers/freetype/freetype/include/freetype/internal/services/svpfr.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/services/svpostnm.h → drivers/freetype/freetype/include/freetype/internal/services/svpostnm.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/services/svprop.h → drivers/freetype/freetype/include/freetype/internal/services/svprop.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/services/svpscmap.h → drivers/freetype/freetype/include/freetype/internal/services/svpscmap.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/services/svpsinfo.h → drivers/freetype/freetype/include/freetype/internal/services/svpsinfo.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/services/svsfnt.h → drivers/freetype/freetype/include/freetype/internal/services/svsfnt.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/services/svttcmap.h → drivers/freetype/freetype/include/freetype/internal/services/svttcmap.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/services/svtteng.h → drivers/freetype/freetype/include/freetype/internal/services/svtteng.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/services/svttglyf.h → drivers/freetype/freetype/include/freetype/internal/services/svttglyf.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/services/svwinfnt.h → drivers/freetype/freetype/include/freetype/internal/services/svwinfnt.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/services/svxf86nm.h → drivers/freetype/freetype/include/freetype/internal/services/svxf86nm.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/sfnt.h → drivers/freetype/freetype/include/freetype/internal/sfnt.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/t1types.h → drivers/freetype/freetype/include/freetype/internal/t1types.h


+ 0 - 0
tools/freetype/freetype/include/freetype/internal/tttypes.h → drivers/freetype/freetype/include/freetype/internal/tttypes.h


+ 0 - 0
tools/freetype/freetype/include/freetype/t1tables.h → drivers/freetype/freetype/include/freetype/t1tables.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ttnameid.h → drivers/freetype/freetype/include/freetype/ttnameid.h


+ 0 - 0
tools/freetype/freetype/include/freetype/tttables.h → drivers/freetype/freetype/include/freetype/tttables.h


+ 0 - 0
tools/freetype/freetype/include/freetype/tttags.h → drivers/freetype/freetype/include/freetype/tttags.h


+ 0 - 0
tools/freetype/freetype/include/freetype/ttunpat.h → drivers/freetype/freetype/include/freetype/ttunpat.h


+ 0 - 0
tools/freetype/freetype/include/ftoption.h → drivers/freetype/freetype/include/ftoption.h


+ 0 - 0
tools/freetype/freetype/src/Jamfile → drivers/freetype/freetype/src/Jamfile


+ 0 - 0
tools/freetype/freetype/src/autofit/Jamfile → drivers/freetype/freetype/src/autofit/Jamfile


+ 0 - 0
tools/freetype/freetype/src/autofit/afangles.c → drivers/freetype/freetype/src/autofit/afangles.c


+ 0 - 0
tools/freetype/freetype/src/autofit/afangles.h → drivers/freetype/freetype/src/autofit/afangles.h


+ 0 - 0
tools/freetype/freetype/src/autofit/afcjk.c → drivers/freetype/freetype/src/autofit/afcjk.c


Some files were not shown because too many files changed in this diff