mikunyan 3.9.5 → 3.9.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1130) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/README.md +103 -76
  4. data/Rakefile +14 -6
  5. data/exe/mikunyan-image +92 -66
  6. data/exe/mikunyan-json +45 -59
  7. data/ext/decoders/crunch/crn_decomp.h +3826 -0
  8. data/ext/decoders/crunch/crn_defs.h +286 -0
  9. data/ext/decoders/crunch/crnlib.h +642 -0
  10. data/ext/decoders/crunch/dds_defs.h +149 -0
  11. data/ext/decoders/crunch/extconf.rb +9 -0
  12. data/ext/decoders/crunch/main.cpp +174 -0
  13. data/ext/decoders/native/astc.c +751 -358
  14. data/ext/decoders/native/astc.h +1 -1
  15. data/ext/decoders/native/color.h +87 -0
  16. data/ext/decoders/native/dxtc.c +44 -71
  17. data/ext/decoders/native/dxtc.h +2 -2
  18. data/ext/decoders/native/endianness.h +180 -0
  19. data/ext/decoders/native/etc.c +330 -158
  20. data/ext/decoders/native/etc.h +8 -4
  21. data/ext/decoders/native/extconf.rb +1 -1
  22. data/ext/decoders/native/fp16.h +36 -0
  23. data/ext/decoders/native/fp16/bitcasts.h +76 -0
  24. data/ext/decoders/native/fp16/fp16.h +451 -0
  25. data/ext/decoders/native/main.c +332 -80
  26. data/ext/decoders/native/pvrtc.c +258 -0
  27. data/ext/decoders/native/pvrtc.h +29 -0
  28. data/ext/decoders/native/rgb.c +96 -20
  29. data/ext/decoders/native/rgb.h +7 -1
  30. data/lib/mikunyan.rb +3 -7
  31. data/lib/mikunyan/asset.rb +302 -308
  32. data/lib/mikunyan/asset_bundle.rb +141 -91
  33. data/lib/mikunyan/base_object.rb +34 -0
  34. data/lib/mikunyan/binary_reader.rb +135 -147
  35. data/lib/mikunyan/constants.rb +506 -340
  36. data/lib/mikunyan/decoders.rb +7 -3
  37. data/lib/mikunyan/decoders/image_decoder.rb +499 -457
  38. data/lib/mikunyan/object_value.rb +96 -79
  39. data/lib/mikunyan/type_tree.rb +144 -73
  40. data/lib/mikunyan/types/text_asset.rb +19 -0
  41. data/lib/mikunyan/types/texture2d.rb +33 -0
  42. data/lib/mikunyan/typetrees/1/137ce611c2e1d71982d2c84bce12d0d6.json +1 -0
  43. data/lib/mikunyan/typetrees/1/86e34eb8ee7642b089fb98c9d81dd9b0.json +1 -0
  44. data/lib/mikunyan/typetrees/1/a372646834bcaf26eab1d21b29e39553.json +1 -0
  45. data/lib/mikunyan/typetrees/104/00ad972a9b8de1baeacb62e297cbb968.json +1 -0
  46. data/lib/mikunyan/typetrees/104/30a4b95a67419124ad203faff026115f.json +1 -0
  47. data/lib/mikunyan/typetrees/108/90536dd8f3f4fe3df5964930a9482336.json +1 -0
  48. data/lib/mikunyan/typetrees/108/c5e3a62999e4ef0417e42cffef82c4bb.json +1 -0
  49. data/lib/mikunyan/typetrees/109/486ba4e15dbd6aea8ac1a064305889c8.json +1 -0
  50. data/lib/mikunyan/typetrees/111/9eabac6ec66ffe818e008883728fcc1b.json +1 -0
  51. data/lib/mikunyan/typetrees/111/cc8f6e05143e049494c7eac0553f3883.json +1 -0
  52. data/lib/mikunyan/typetrees/115/2da9c96f9efc8b31a480d5b8858755f3.json +1 -0
  53. data/lib/mikunyan/typetrees/115/f46e8e30ecc293493f18ab27134210ee.json +1 -0
  54. data/lib/mikunyan/typetrees/121/ec82ba41da8a4a1621af9908b6786836.json +1 -0
  55. data/lib/mikunyan/typetrees/123/852794becbcf95f66992da2b96a69704.json +1 -0
  56. data/lib/mikunyan/typetrees/124/e0da148901d81b94249c67d75de59cc6.json +1 -0
  57. data/lib/mikunyan/typetrees/128/6a15532222689268bc8a148f4e84e7ab.json +1 -0
  58. data/lib/mikunyan/typetrees/128/9a83846bdc10f24de3183b3d1b510d5c.json +1 -0
  59. data/lib/mikunyan/typetrees/128/b14bcb0865632d1b2d6e215a000e4c0f.json +1 -0
  60. data/lib/mikunyan/typetrees/135/8c86f4ac6b7f47c045560d4383aadc8d.json +1 -0
  61. data/lib/mikunyan/typetrees/136/fbf6b031c32e461ee61be429e5fee7eb.json +1 -0
  62. data/lib/mikunyan/typetrees/137/2697e6f3893bf152ccfa6766c4c7f505.json +1 -0
  63. data/lib/mikunyan/typetrees/137/96a47566b4e135078f690a4a69935d58.json +1 -0
  64. data/lib/mikunyan/typetrees/137/b1b907f989fddc2c56485955b540ff3e.json +1 -0
  65. data/lib/mikunyan/typetrees/137/b78821b6aeb5b79c8961728a9f068024.json +1 -0
  66. data/lib/mikunyan/typetrees/137/ecc1595a8954f445d7681cf02ea158c2.json +1 -0
  67. data/lib/mikunyan/typetrees/142/97da5f4688e45a57c8b42d4f42497297.json +1 -0
  68. data/lib/mikunyan/typetrees/142/f284abb6f2df17ebedae2b6b50436810.json +1 -0
  69. data/lib/mikunyan/typetrees/150/74d387e7f1b0ef0e146e96940005546f.json +1 -0
  70. data/lib/mikunyan/typetrees/150/857195b5935cf8fb7c0b98cba9717eac.json +1 -0
  71. data/lib/mikunyan/typetrees/150/f123b055a61dfa7dc679d78cdaecd383.json +1 -0
  72. data/lib/mikunyan/typetrees/157/10355709bc95355f57466913ac850d0b.json +1 -0
  73. data/lib/mikunyan/typetrees/157/69b01db128625aa95f1f92fb890ff045.json +1 -0
  74. data/lib/mikunyan/typetrees/157/b6ac05d288ffb84268e85f2738366aa7.json +1 -0
  75. data/lib/mikunyan/typetrees/198/4b5dc9892b939558afad44bc1c94cb95.json +1 -0
  76. data/lib/mikunyan/typetrees/198/4dbfaa1def6adb569b550804b19b4305.json +1 -0
  77. data/lib/mikunyan/typetrees/198/879cd82f1c9caa2bb7914c6871319fc0.json +1 -0
  78. data/lib/mikunyan/typetrees/198/c3e96b683ca05a83aba6787fdbba45a6.json +1 -0
  79. data/lib/mikunyan/typetrees/198/d5d86f79c1252a3e0a705f20245b62b8.json +1 -0
  80. data/lib/mikunyan/typetrees/198/fa4023d185313a79ec5ee562b614c409.json +1 -0
  81. data/lib/mikunyan/typetrees/199/1bd80d4f81d414c0d14b0515fd8cd9e5.json +1 -0
  82. data/lib/mikunyan/typetrees/199/42f950f8898f13af3f02c7244e897db0.json +1 -0
  83. data/lib/mikunyan/typetrees/199/5abf5840ece9606f53c97f63452d995b.json +1 -0
  84. data/lib/mikunyan/typetrees/199/5fa34208d6cf04d6ae190f096d624677.json +1 -0
  85. data/lib/mikunyan/typetrees/199/c96a64061d3e391b7f3309bd4a644969.json +1 -0
  86. data/lib/mikunyan/typetrees/199/daea1bb1bba6613afb2cb001ca8fa0d4.json +1 -0
  87. data/lib/mikunyan/typetrees/20/073e485bdb4950dba97985230fc515dd.json +1 -0
  88. data/lib/mikunyan/typetrees/20/1696d256b3b20cfe9c87b67186d8e2b3.json +1 -0
  89. data/lib/mikunyan/typetrees/20/46fda2d131e65f9426462feecebc25c4.json +1 -0
  90. data/lib/mikunyan/typetrees/20/961be27d12d60b1b3421191d5256a876.json +1 -0
  91. data/lib/mikunyan/typetrees/200/26165a24a953362edb6a7078f6536c4b.json +1 -0
  92. data/lib/mikunyan/typetrees/21/225d280603d6b901bb660283ef2dc6c1.json +1 -0
  93. data/lib/mikunyan/typetrees/21/63d861fd9f999c93d61fe5659162061d.json +1 -0
  94. data/lib/mikunyan/typetrees/21/66405447c6973a81e978410c391172fe.json +1 -0
  95. data/lib/mikunyan/typetrees/21/d871346d990bbc294d02f4c366bf1b6d.json +1 -0
  96. data/lib/mikunyan/typetrees/210/1440a9413c35197e76f1f47223d5eab7.json +1 -0
  97. data/lib/mikunyan/typetrees/212/0f46b3d6160f7485467150dbf605a1a5.json +1 -0
  98. data/lib/mikunyan/typetrees/212/5fc4a64809a91d647f0b1220ca09f136.json +1 -0
  99. data/lib/mikunyan/typetrees/212/84c6ac46ef89030991cbbb3fd21d2889.json +1 -0
  100. data/lib/mikunyan/typetrees/212/91ffea0726900cb751e36f83816df13e.json +1 -0
  101. data/lib/mikunyan/typetrees/212/a98cccc4ebd5d08ae472761d4f6dc8b2.json +1 -0
  102. data/lib/mikunyan/typetrees/212/d1820f56f61b6f673e2f5301c4686d39.json +1 -0
  103. data/lib/mikunyan/typetrees/213/2f0ee1e689a979766d022d88d6007338.json +1 -0
  104. data/lib/mikunyan/typetrees/213/314dede0713638b3fad1628f6329dc62.json +1 -0
  105. data/lib/mikunyan/typetrees/213/76ce55d4dbaf38f5c674ea9f0a344951.json +1 -0
  106. data/lib/mikunyan/typetrees/213/8c8aa545a03edeb9030f8f5042d06122.json +1 -0
  107. data/lib/mikunyan/typetrees/213/e7c5c01b0369574e9346ce846e1e8e63.json +1 -0
  108. data/lib/mikunyan/typetrees/222/5750e5904e20e1e9b768424d8704a10d.json +1 -0
  109. data/lib/mikunyan/typetrees/222/9e0ab8d396f3249a3958dd930f81f61b.json +1 -0
  110. data/lib/mikunyan/typetrees/223/d8082d7a3661a3f9ca00a93a61606585.json +1 -0
  111. data/lib/mikunyan/typetrees/224/7e050781d08ca9d10bc74beb7e91c3b5.json +1 -0
  112. data/lib/mikunyan/typetrees/224/eb5e2816cebf56985ba81ee03349f325.json +1 -0
  113. data/lib/mikunyan/typetrees/225/5bc42b93159267aabba724a6a7923603.json +1 -0
  114. data/lib/mikunyan/typetrees/23/2838e2afe8d6a61d270093d4d54eb362.json +1 -0
  115. data/lib/mikunyan/typetrees/23/6da70b1b6e4efd541ada82b09c3b5c8b.json +1 -0
  116. data/lib/mikunyan/typetrees/23/af863b6969b9b82be9450f0574339f65.json +1 -0
  117. data/lib/mikunyan/typetrees/23/c92361750edbfbcada6f2537e8db21ad.json +1 -0
  118. data/lib/mikunyan/typetrees/23/d618295bd5f15441b5b80b1f57e92d09.json +1 -0
  119. data/lib/mikunyan/typetrees/23/f19f7e20c325589c346554ef7d1cadc9.json +1 -0
  120. data/lib/mikunyan/typetrees/241/06c982971191fe245e5ebf10100d830b.json +1 -0
  121. data/lib/mikunyan/typetrees/241/b55bcb08834f91481d00ecf2baf6b298.json +1 -0
  122. data/lib/mikunyan/typetrees/243/d68e4f940c79b84a66a3020175a2fc76.json +1 -0
  123. data/lib/mikunyan/typetrees/245/48b8a458c641bcd5191d251713454097.json +1 -0
  124. data/lib/mikunyan/typetrees/258/2d2b1d63eb2a68ed94bbf7f50fc21d7b.json +1 -0
  125. data/lib/mikunyan/typetrees/258/b35bf02952f2946208ff6b4deca3a6a9.json +1 -0
  126. data/lib/mikunyan/typetrees/28/01053c13f5acc24d9236a5e6e7e1410d.json +1 -0
  127. data/lib/mikunyan/typetrees/28/0d08414cfd5bdb0d22792011bda9ab26.json +1 -0
  128. data/lib/mikunyan/typetrees/28/11eb3417a626b4b8276ad6fe42d3dbd3.json +1 -0
  129. data/lib/mikunyan/typetrees/28/1e87d82d4fd058509a3c7866db0e7356.json +1 -0
  130. data/lib/mikunyan/typetrees/28/7230c9eb36a0c72a7187ad952551e1e5.json +1 -0
  131. data/lib/mikunyan/typetrees/28/ee6c40817d2951929cdb4f5a60874f5d.json +1 -0
  132. data/lib/mikunyan/typetrees/320/4edb00d2a9c65f6f25f5cdc31bb86380.json +1 -0
  133. data/lib/mikunyan/typetrees/320/941d49d79db52b4d31946d5082b518d4.json +1 -0
  134. data/lib/mikunyan/typetrees/328/2c5307574bfe212cbac3047511700fc5.json +1 -0
  135. data/lib/mikunyan/typetrees/328/f95fb25bc9075d2acd7b879adca49eda.json +1 -0
  136. data/lib/mikunyan/typetrees/329/093e4500a0a67d1ed84eb0116520fa2d.json +1 -0
  137. data/lib/mikunyan/typetrees/329/a7209c2a706f5ce5d5b6d405d08194d6.json +1 -0
  138. data/lib/mikunyan/typetrees/33/9d1630b1d7e3bc24abe46e5860a2a179.json +1 -0
  139. data/lib/mikunyan/typetrees/331/147b112c44d8942fa03fd5b2db85b74d.json +1 -0
  140. data/lib/mikunyan/typetrees/331/a7b540b6a58815a5d041bd2f340fed67.json +1 -0
  141. data/lib/mikunyan/typetrees/4/761ca81f78491542badc37f810ab3455.json +1 -0
  142. data/lib/mikunyan/typetrees/4/937a6b5c5f5b313185d252e38d145b17.json +1 -0
  143. data/lib/mikunyan/typetrees/43/3366c840a288282b3b12f2f3e038c473.json +1 -0
  144. data/lib/mikunyan/typetrees/43/434b934f757d042e20f52d8c2ae20843.json +1 -0
  145. data/lib/mikunyan/typetrees/43/6b594ba1ad7a129a106728bf12a2c575.json +1 -0
  146. data/lib/mikunyan/typetrees/43/6d698cb82bd752d1b83575c6e59915a8.json +1 -0
  147. data/lib/mikunyan/typetrees/43/97ec0712102a3ea3f1cf8c0a4e47c070.json +1 -0
  148. data/lib/mikunyan/typetrees/43/b5516dd9b9d6b7d5643b75df1847c5c9.json +1 -0
  149. data/lib/mikunyan/typetrees/48/266d53113fa30d2b858f2768f92eaa14.json +1 -0
  150. data/lib/mikunyan/typetrees/48/8db760073e1392061e4a36995f0735af.json +1 -0
  151. data/lib/mikunyan/typetrees/48/a30e3dcf6c6d25153d6f64e5e41caf4e.json +1 -0
  152. data/lib/mikunyan/typetrees/48/a70f7abc6586fb35b3a0641aa81e9375.json +1 -0
  153. data/lib/mikunyan/typetrees/48/ed2a06ce7fb8203f6efb5ab5e0ce20d5.json +1 -0
  154. data/lib/mikunyan/typetrees/49/486ba4e15dbd6aea8ac1a064305889c8.json +1 -0
  155. data/lib/mikunyan/typetrees/49/936739f45f26fd8b81a4ea70f2c8cad4.json +1 -0
  156. data/lib/mikunyan/typetrees/50/6e8b670a26a77e98186711bb06946b54.json +1 -0
  157. data/lib/mikunyan/typetrees/61/30520d6e00d721084910face9f4161f1.json +1 -0
  158. data/lib/mikunyan/typetrees/64/5b7f3f798459ea619e4927106fd1fe4b.json +1 -0
  159. data/lib/mikunyan/typetrees/64/80051ff78d79f99ebe47afb72cc66120.json +1 -0
  160. data/lib/mikunyan/typetrees/64/a4f61324ce0d2adbb58fa519e9537250.json +1 -0
  161. data/lib/mikunyan/typetrees/65/439e66a89c7fdef6f0927c9256c0773a.json +1 -0
  162. data/lib/mikunyan/typetrees/687078895/cae79c57c58bb3a331c1a3a78ff9cfef.json +1 -0
  163. data/lib/mikunyan/typetrees/687078895/cf2fdd6d6ec48e8832b545670b813675.json +1 -0
  164. data/lib/mikunyan/typetrees/74/1ece1117b1e6a8b84516b3eb77051cc3.json +1 -0
  165. data/lib/mikunyan/typetrees/74/81e28d3a4102fabc98ac701e6a192ad4.json +1 -0
  166. data/lib/mikunyan/typetrees/74/c184743520186f546000de20f4d19736.json +1 -0
  167. data/lib/mikunyan/typetrees/74/f665ce86182d9caf3ead9030330dcdd1.json +1 -0
  168. data/lib/mikunyan/typetrees/81/305e4aeacbb64b15862510dad47502cb.json +1 -0
  169. data/lib/mikunyan/typetrees/82/615d22f1dbb7206b1870a49854e33c55.json +1 -0
  170. data/lib/mikunyan/typetrees/83/57a6370a001d5449abd37c2184ec5138.json +1 -0
  171. data/lib/mikunyan/typetrees/83/b23449465e3763dd19335a88ea09ae99.json +1 -0
  172. data/lib/mikunyan/typetrees/84/78e42736c01cb0f007375d925e0eb8b0.json +1 -0
  173. data/lib/mikunyan/typetrees/89/1ef8dc1e91e0cd01bd07036e6665ea40.json +1 -0
  174. data/lib/mikunyan/typetrees/89/8ae46eedf9c00edaad35d0d09290bc8b.json +1 -0
  175. data/lib/mikunyan/typetrees/89/f92d618c5266ea3a8ca770b6eca728c8.json +1 -0
  176. data/lib/mikunyan/typetrees/90/06fc117ca6d965140ccc18ca840cc1a1.json +1 -0
  177. data/lib/mikunyan/typetrees/90/32844caee83b124ec87852294d39b8b6.json +1 -0
  178. data/lib/mikunyan/typetrees/90/b6bbd0e88d1feb636d89bd766ea5934f.json +1 -0
  179. data/lib/mikunyan/typetrees/91/01ccfe05c6fbc7ff03dcf8afa8213ff5.json +1 -0
  180. data/lib/mikunyan/typetrees/91/12873460c642bda0bf9e3d57283cd673.json +1 -0
  181. data/lib/mikunyan/typetrees/91/fc82e38aa4ec91a42bead3793b8ad3a8.json +1 -0
  182. data/lib/mikunyan/typetrees/92/e0da148901d81b94249c67d75de59cc6.json +1 -0
  183. data/lib/mikunyan/typetrees/95/75f8b558401cf01ba36d0e612cdbd8fa.json +1 -0
  184. data/lib/mikunyan/typetrees/95/c4c62993971a4c233bae8f8954b4509c.json +1 -0
  185. data/lib/mikunyan/typetrees/96/178a7faebee648639373e3fc701c4d42.json +1 -0
  186. data/lib/mikunyan/typetrees/96/32fa2c2b9d9e3f4a716af411fe635d29.json +1 -0
  187. data/lib/mikunyan/typetrees/96/a11f8eb485ea905be1a9eb49e42085e7.json +1 -0
  188. data/lib/mikunyan/typetrees/96/fb00968925d0a9c61e2630478746ac93.json +1 -0
  189. data/lib/mikunyan/version.rb +4 -2
  190. data/mikunyan.gemspec +22 -17
  191. metadata +228 -948
  192. data/lib/mikunyan/typetrees/0005ee889bd7f6b79a25da117f739c52.dat +0 -0
  193. data/lib/mikunyan/typetrees/005cae4626b69aa0d1bd6fd3677642d0.dat +0 -0
  194. data/lib/mikunyan/typetrees/0065ac6da4da61da4e46189f1b77b002.dat +0 -0
  195. data/lib/mikunyan/typetrees/00ad972a9b8de1baeacb62e297cbb968.dat +0 -0
  196. data/lib/mikunyan/typetrees/00b2dd52d07280ff931ca2ce840c6c5f.dat +0 -0
  197. data/lib/mikunyan/typetrees/00f3fced245b297f9ac50a0d4903fb6a.dat +0 -0
  198. data/lib/mikunyan/typetrees/01053c13f5acc24d9236a5e6e7e1410d.dat +0 -0
  199. data/lib/mikunyan/typetrees/01266d578502b6b76488f3bd3d604eef.dat +0 -0
  200. data/lib/mikunyan/typetrees/016a05ed91534852640fa073275aca15.dat +0 -0
  201. data/lib/mikunyan/typetrees/01ccfe05c6fbc7ff03dcf8afa8213ff5.dat +0 -0
  202. data/lib/mikunyan/typetrees/02121256d773b25c5090287b274c2b00.dat +0 -0
  203. data/lib/mikunyan/typetrees/02151504e19732024609e7cca6c0fc96.dat +0 -0
  204. data/lib/mikunyan/typetrees/026979ad7a2cb1623d33ebc2dcb307bc.dat +0 -0
  205. data/lib/mikunyan/typetrees/02d4f5f7486a5229b8f5dd49f538d23b.dat +0 -0
  206. data/lib/mikunyan/typetrees/02ff34fcfecd5a7519f8e4eccfcefc17.dat +0 -0
  207. data/lib/mikunyan/typetrees/037ba63dcd92d264f6321c61b115c80a.dat +0 -0
  208. data/lib/mikunyan/typetrees/0384181f7887c2df26d7de81361d3c24.dat +0 -0
  209. data/lib/mikunyan/typetrees/03882ede131aa51c0b2120a860363c45.dat +0 -0
  210. data/lib/mikunyan/typetrees/045e54722afb3e5b99ffc842b54ccd04.dat +0 -0
  211. data/lib/mikunyan/typetrees/046bff2bbcefd18a3c0b4cc1d32a342b.dat +0 -0
  212. data/lib/mikunyan/typetrees/049f614729255b717181bfd2310bfe39.dat +0 -0
  213. data/lib/mikunyan/typetrees/04ad34c7fb5894db97cb831635ea9464.dat +0 -0
  214. data/lib/mikunyan/typetrees/05377b3b7453e5f7a0a753ea7534b4b6.dat +0 -0
  215. data/lib/mikunyan/typetrees/054d6dd0949fc88be1ece98a89f48175.dat +0 -0
  216. data/lib/mikunyan/typetrees/06086ac852a0fdd488bb63eeb1a3f7be.dat +0 -0
  217. data/lib/mikunyan/typetrees/06eb94418931331dd508acc90ef39a0d.dat +0 -0
  218. data/lib/mikunyan/typetrees/07188f5574f3168b6584882cdc1906e4.dat +0 -0
  219. data/lib/mikunyan/typetrees/073ba87290db010f9d392b6926f26ffa.dat +0 -0
  220. data/lib/mikunyan/typetrees/0767fe19945b90006a374575a30a318d.dat +0 -0
  221. data/lib/mikunyan/typetrees/07b289e80f1d75c9c03ee649281af143.dat +0 -0
  222. data/lib/mikunyan/typetrees/07e972f95515e2dab33d93f8e59cde4d.dat +0 -0
  223. data/lib/mikunyan/typetrees/0816a72ba3f00b1bb13b23f8799619af.dat +0 -0
  224. data/lib/mikunyan/typetrees/0827148b052dd69232c20460ddde3d1a.dat +0 -0
  225. data/lib/mikunyan/typetrees/0857307b3a8cb783c311d8ff42959462.dat +0 -0
  226. data/lib/mikunyan/typetrees/086efb68ee41abe4e98e1ae93ae96290.dat +0 -0
  227. data/lib/mikunyan/typetrees/087e32a39c822978a1c5e410162b381b.dat +0 -0
  228. data/lib/mikunyan/typetrees/08a0f671ed575df2b956a9523f3389b4.dat +0 -0
  229. data/lib/mikunyan/typetrees/08b842bfb6779a99abd9772f354c4592.dat +0 -0
  230. data/lib/mikunyan/typetrees/09218ec64a12208744dfa28d3de424d5.dat +0 -0
  231. data/lib/mikunyan/typetrees/09403e79c0029e5f17528d3321a9c65a.dat +0 -0
  232. data/lib/mikunyan/typetrees/09a818b7453024f2d6eda315b98175bf.dat +0 -0
  233. data/lib/mikunyan/typetrees/0a5826fcb70aafc9a26f5e47e814f052.dat +0 -0
  234. data/lib/mikunyan/typetrees/0b6483cb76bd6cb09661f1999a14d7c3.dat +0 -0
  235. data/lib/mikunyan/typetrees/0b8eb6c7354ef2c2627f1911a201b5b2.dat +0 -0
  236. data/lib/mikunyan/typetrees/0be713b9a525f321879cf7985e5cb6a0.dat +0 -0
  237. data/lib/mikunyan/typetrees/0d1862c92c0019a9db5f10f5385be1ca.dat +0 -0
  238. data/lib/mikunyan/typetrees/0d37e988cc66cbb6f84a09d92fcc2fb1.dat +0 -0
  239. data/lib/mikunyan/typetrees/0d71112c6b0ce418bc75623a52f92e5c.dat +0 -0
  240. data/lib/mikunyan/typetrees/0dad589c25ae993410daa4813b24a978.dat +0 -0
  241. data/lib/mikunyan/typetrees/0e7a017b0eef40ee05c8e3355e289d48.dat +0 -0
  242. data/lib/mikunyan/typetrees/0e8c6e4f803514bccb43b7d8901ed3f3.dat +0 -0
  243. data/lib/mikunyan/typetrees/0eb12c7055a972aec53d53a646cc4fec.dat +0 -0
  244. data/lib/mikunyan/typetrees/0f7da8d76d164df704e661b2f926d0ba.dat +0 -0
  245. data/lib/mikunyan/typetrees/0fdbf6896f263df755a7392766cd7bd5.dat +0 -0
  246. data/lib/mikunyan/typetrees/10355709bc95355f57466913ac850d0b.dat +0 -0
  247. data/lib/mikunyan/typetrees/1047dc8a46bd55bbc47ee36971fbc899.dat +0 -0
  248. data/lib/mikunyan/typetrees/1101c105388a97c11253c9138a48b054.dat +0 -0
  249. data/lib/mikunyan/typetrees/116f6e5f5e2f9936f14b3e7afdaeebe0.dat +0 -0
  250. data/lib/mikunyan/typetrees/119a33484a175efb17550e468dab2c29.dat +0 -0
  251. data/lib/mikunyan/typetrees/11eb3417a626b4b8276ad6fe42d3dbd3.dat +0 -0
  252. data/lib/mikunyan/typetrees/1209f97dc24e29870a0b4d4c10691c51.dat +0 -0
  253. data/lib/mikunyan/typetrees/12873460c642bda0bf9e3d57283cd673.dat +0 -0
  254. data/lib/mikunyan/typetrees/12967e00d88a19565085202f8f7e8aae.dat +0 -0
  255. data/lib/mikunyan/typetrees/12c502cde72c7fa23c4f00e01ba92852.dat +0 -0
  256. data/lib/mikunyan/typetrees/136d01abbc91c99a320d66ce5fc6f77f.dat +0 -0
  257. data/lib/mikunyan/typetrees/137ce611c2e1d71982d2c84bce12d0d6.dat +0 -0
  258. data/lib/mikunyan/typetrees/13ad0b2f92f4248f339c2652b3f879d6.dat +0 -0
  259. data/lib/mikunyan/typetrees/13f0890d0c86a09d0cf0942446b5e6d3.dat +0 -0
  260. data/lib/mikunyan/typetrees/13f9a259302b7e528447dbac68c18621.dat +0 -0
  261. data/lib/mikunyan/typetrees/143bcbfec35489e37c72eaff4a352ac0.dat +0 -0
  262. data/lib/mikunyan/typetrees/144607134da52f2b16c382198714d681.dat +0 -0
  263. data/lib/mikunyan/typetrees/147e16de37e14923a45314e271221c54.dat +0 -0
  264. data/lib/mikunyan/typetrees/14ea9b41501766e6cda33f69772f1b67.dat +0 -0
  265. data/lib/mikunyan/typetrees/1547ef62e8cc49596b74b4259299ab7d.dat +0 -0
  266. data/lib/mikunyan/typetrees/167715f8020989bf87dc860ded480c9f.dat +0 -0
  267. data/lib/mikunyan/typetrees/168b7ccfe32e20d397ad9cc1ee64e88d.dat +0 -0
  268. data/lib/mikunyan/typetrees/16998ea62da750122066f949ab50157e.dat +0 -0
  269. data/lib/mikunyan/typetrees/16b1122494c0e77b196c413ac29842c6.dat +0 -0
  270. data/lib/mikunyan/typetrees/16e5b1b7ee14464356e9664219da0c82.dat +0 -0
  271. data/lib/mikunyan/typetrees/1747b0850e27d5e5afe2b3c5588e7181.dat +0 -0
  272. data/lib/mikunyan/typetrees/1762b46dd7a05651e197ae50eb8dc6ea.dat +0 -0
  273. data/lib/mikunyan/typetrees/17c3ea4c4fea71108c10fd27f2f36db1.dat +0 -0
  274. data/lib/mikunyan/typetrees/18372dbbd17b67380e4a62c927380a50.dat +0 -0
  275. data/lib/mikunyan/typetrees/1893d8e186073d53da657b023dc8bd12.dat +0 -0
  276. data/lib/mikunyan/typetrees/1980e6a59157d8bdee2bcaa3b7bcab95.dat +0 -0
  277. data/lib/mikunyan/typetrees/19d012ac862d35ae708b3e9819c144a6.dat +0 -0
  278. data/lib/mikunyan/typetrees/1a423ac0d72444d8b1e5648eea27de62.dat +0 -0
  279. data/lib/mikunyan/typetrees/1a443e14c645af0d1c787c747df78c79.dat +0 -0
  280. data/lib/mikunyan/typetrees/1a4924a6ba27c4cd346c378e252bbcd9.dat +0 -0
  281. data/lib/mikunyan/typetrees/1a8aa22f22aad282eb5847acc32c48c4.dat +0 -0
  282. data/lib/mikunyan/typetrees/1b15f8914d09a0f91015c60200600ad1.dat +0 -0
  283. data/lib/mikunyan/typetrees/1b81c9a9d553d513ad18b473cac9f3e5.dat +0 -0
  284. data/lib/mikunyan/typetrees/1c28236b6f2e0ac5cb3e915ba08809aa.dat +0 -0
  285. data/lib/mikunyan/typetrees/1c9aca6db12271b86e4759fcbd47ef4f.dat +0 -0
  286. data/lib/mikunyan/typetrees/1d188dac655495743ede8bf50e900348.dat +0 -0
  287. data/lib/mikunyan/typetrees/1d3212ed4ba9330b8cc6a4aa196a2b2f.dat +0 -0
  288. data/lib/mikunyan/typetrees/1d5aedbe4e95c8322fb5f141098c6e91.dat +0 -0
  289. data/lib/mikunyan/typetrees/1dd6a73cef747aa451d1eb4bc7ab6ba9.dat +0 -0
  290. data/lib/mikunyan/typetrees/1df2470081a677848028328c36afe347.dat +0 -0
  291. data/lib/mikunyan/typetrees/1e347d6a49dd26eca64146d8d1629c16.dat +0 -0
  292. data/lib/mikunyan/typetrees/1e831f2ccbb8f0cceabd75e4ae614edd.dat +0 -0
  293. data/lib/mikunyan/typetrees/1e8486720809f1f1134ad46a75855191.dat +0 -0
  294. data/lib/mikunyan/typetrees/1e87d82d4fd058509a3c7866db0e7356.dat +0 -0
  295. data/lib/mikunyan/typetrees/1eaa927fe597a5c984688ede0d7e0c46.dat +0 -0
  296. data/lib/mikunyan/typetrees/1ebcb3bc9f2a38130d9e3274f3c00201.dat +0 -0
  297. data/lib/mikunyan/typetrees/1ef8dc1e91e0cd01bd07036e6665ea40.dat +0 -0
  298. data/lib/mikunyan/typetrees/1f1262cc26714f10d5f84e0f8eb03864.dat +0 -0
  299. data/lib/mikunyan/typetrees/1f168f9bb657a2e84643dbc260a659e5.dat +0 -0
  300. data/lib/mikunyan/typetrees/1f61f675d1dd7911aa25c13d26476576.dat +0 -0
  301. data/lib/mikunyan/typetrees/1f6570e305da0841cf9545e1911c898b.dat +0 -0
  302. data/lib/mikunyan/typetrees/1f77b228205c78ee0df7e2b634863853.dat +0 -0
  303. data/lib/mikunyan/typetrees/1f994725ca628a20bb0526cedf9cb44b.dat +0 -0
  304. data/lib/mikunyan/typetrees/2030e4be48f1e6444ee7c802aa6ee04e.dat +0 -0
  305. data/lib/mikunyan/typetrees/204e3cd3604f3794a9ebc57816470b8b.dat +0 -0
  306. data/lib/mikunyan/typetrees/214291cadd50789a88176745966ff855.dat +0 -0
  307. data/lib/mikunyan/typetrees/214cccc3a5487f6e7d0e4dd13d2c7d9f.dat +0 -0
  308. data/lib/mikunyan/typetrees/2173d638d2217fa07eb74c6944dd831b.dat +0 -0
  309. data/lib/mikunyan/typetrees/21d00f71a60e4a3591c1c3d3dde7880f.dat +0 -0
  310. data/lib/mikunyan/typetrees/21d6ee4b99f9cbbf255d69f64c9d1459.dat +0 -0
  311. data/lib/mikunyan/typetrees/223200cd03b4c76caeaf422122a2b091.dat +0 -0
  312. data/lib/mikunyan/typetrees/224c10c05e99a377d1e41a2fa1c1dda1.dat +0 -0
  313. data/lib/mikunyan/typetrees/225d280603d6b901bb660283ef2dc6c1.dat +0 -0
  314. data/lib/mikunyan/typetrees/22a1ad8b8f62a891ca211417fe8d161b.dat +0 -0
  315. data/lib/mikunyan/typetrees/22a5fc27bdf2aeb77176acbab394d4f7.dat +0 -0
  316. data/lib/mikunyan/typetrees/22c6bb27058872e03ec09f60e1f71f77.dat +0 -0
  317. data/lib/mikunyan/typetrees/22de8a8e6131edd3951ff8d815999077.dat +0 -0
  318. data/lib/mikunyan/typetrees/22f105beba59b8a348fd1db5e1101ee6.dat +0 -0
  319. data/lib/mikunyan/typetrees/235608d8b8db7ffe00ee926ad1e4fcfb.dat +0 -0
  320. data/lib/mikunyan/typetrees/239f5922bb05f812c78d41a84451927a.dat +0 -0
  321. data/lib/mikunyan/typetrees/23aa0d39991cfaa3b448dc52e1b4e2f1.dat +0 -0
  322. data/lib/mikunyan/typetrees/23f7a8828f26b85351a2c73b9d042b58.dat +0 -0
  323. data/lib/mikunyan/typetrees/2409a93f8e4d219a23ac09a3771cd85e.dat +0 -0
  324. data/lib/mikunyan/typetrees/2413ff22e97a320f3db90e252bed5064.dat +0 -0
  325. data/lib/mikunyan/typetrees/2490347089301e3db2eac4055fd8f87d.dat +0 -0
  326. data/lib/mikunyan/typetrees/24e89a7207828509d5c5875a93b2106e.dat +0 -0
  327. data/lib/mikunyan/typetrees/252b1dbbc4b7cfed2594e04d6ff33e9a.dat +0 -0
  328. data/lib/mikunyan/typetrees/255352c3db1172a6a9c5c2605486d937.dat +0 -0
  329. data/lib/mikunyan/typetrees/26165a24a953362edb6a7078f6536c4b.dat +0 -0
  330. data/lib/mikunyan/typetrees/266d53113fa30d2b858f2768f92eaa14.dat +0 -0
  331. data/lib/mikunyan/typetrees/26b86854c33bca2efc9692ce14f5966d.dat +0 -0
  332. data/lib/mikunyan/typetrees/26edfe99eae8bb02d8148494ac056b19.dat +0 -0
  333. data/lib/mikunyan/typetrees/2706c8356160cd6aaa396532b3ce39ab.dat +0 -0
  334. data/lib/mikunyan/typetrees/270ad6077395c13a4cfafac5671a5620.dat +0 -0
  335. data/lib/mikunyan/typetrees/276165a162f9cbfeb3214464b7b8e7af.dat +0 -0
  336. data/lib/mikunyan/typetrees/27653c16987c2f00f7e701860db978b9.dat +0 -0
  337. data/lib/mikunyan/typetrees/27e91f156f1a8d11d4bcd66d3d6d52e8.dat +0 -0
  338. data/lib/mikunyan/typetrees/28460a98ae14a912f5c0393c9ebc21ba.dat +0 -0
  339. data/lib/mikunyan/typetrees/285301d63833986d582fb1893479d7f0.dat +0 -0
  340. data/lib/mikunyan/typetrees/2864d30fb7a07ba8c735165d90ed5ff2.dat +0 -0
  341. data/lib/mikunyan/typetrees/286928b2e061e5b81ab8f7095965a508.dat +0 -0
  342. data/lib/mikunyan/typetrees/2875b25dc4d545986bf5cb670c3769a0.dat +0 -0
  343. data/lib/mikunyan/typetrees/2892f2afcbbee74930c24875cff022b3.dat +0 -0
  344. data/lib/mikunyan/typetrees/28d4502541c70ba42b2303f87d8aea30.dat +0 -0
  345. data/lib/mikunyan/typetrees/28e15ac090050b5620a2b6b376f6be3d.dat +0 -0
  346. data/lib/mikunyan/typetrees/28fee9b8bbe71485d2aecff29c338906.dat +0 -0
  347. data/lib/mikunyan/typetrees/29418211d65c19bd8bd25a6d92cc89e1.dat +0 -0
  348. data/lib/mikunyan/typetrees/299723c380e0ae74b7740e291f44b5dd.dat +0 -0
  349. data/lib/mikunyan/typetrees/29a94a8e52beb2ddf2294ee984774759.dat +0 -0
  350. data/lib/mikunyan/typetrees/29e4301913d608e0be4aa608708bcf04.dat +0 -0
  351. data/lib/mikunyan/typetrees/2a819caa7d1cb8b5a354b3d2cdc21cf7.dat +0 -0
  352. data/lib/mikunyan/typetrees/2aa85eb9fb12fbc18406ad844d0dfce4.dat +0 -0
  353. data/lib/mikunyan/typetrees/2ad38f20aa997894b440f55bb2faa772.dat +0 -0
  354. data/lib/mikunyan/typetrees/2aebfac28b12b8d6fbf0d97563035a17.dat +0 -0
  355. data/lib/mikunyan/typetrees/2b9a59c22c5788fb05c2751753769e73.dat +0 -0
  356. data/lib/mikunyan/typetrees/2bf1eebd069f0d939216d45cc299be85.dat +0 -0
  357. data/lib/mikunyan/typetrees/2c303ef7be71806aaffa0121527d7fea.dat +0 -0
  358. data/lib/mikunyan/typetrees/2d0f68bd23c44c2815f9d5376ace084f.dat +0 -0
  359. data/lib/mikunyan/typetrees/2d2b1d63eb2a68ed94bbf7f50fc21d7b.dat +0 -0
  360. data/lib/mikunyan/typetrees/2d33f228d257f7b0b88c98914786292c.dat +0 -0
  361. data/lib/mikunyan/typetrees/2da9c96f9efc8b31a480d5b8858755f3.dat +0 -0
  362. data/lib/mikunyan/typetrees/2dbcc357c62060bea7491f02a0a3d0fa.dat +0 -0
  363. data/lib/mikunyan/typetrees/2dd9afa6072e9ccae001437684a2eae5.dat +0 -0
  364. data/lib/mikunyan/typetrees/2def4fa21af26d3102178151c2b47141.dat +0 -0
  365. data/lib/mikunyan/typetrees/2ef918365da75913b10d30a85c9a815e.dat +0 -0
  366. data/lib/mikunyan/typetrees/2f02075ebca922e67afa3ddddc951609.dat +0 -0
  367. data/lib/mikunyan/typetrees/2f0ee1e689a979766d022d88d6007338.dat +0 -0
  368. data/lib/mikunyan/typetrees/2f25cddba4c1ccf16383b175860f1817.dat +0 -0
  369. data/lib/mikunyan/typetrees/2f3af372d1cb4f523d9b630c7d796e66.dat +0 -0
  370. data/lib/mikunyan/typetrees/2f903e13950e7204e5adb9d0359bd5b2.dat +0 -0
  371. data/lib/mikunyan/typetrees/304725e57bc52f76ceaa856632058097.dat +0 -0
  372. data/lib/mikunyan/typetrees/305e4aeacbb64b15862510dad47502cb.dat +0 -0
  373. data/lib/mikunyan/typetrees/30667f06a99e7931816757b4b7fbce5c.dat +0 -0
  374. data/lib/mikunyan/typetrees/306f0c2739dc8ad54fb4a1a44d1a3880.dat +0 -0
  375. data/lib/mikunyan/typetrees/30a40cec9f8c45e9aeca61bb77e596ec.dat +0 -0
  376. data/lib/mikunyan/typetrees/30a60d48ac05138e74c99389277a6a1d.dat +0 -0
  377. data/lib/mikunyan/typetrees/30bd9b8cf9127e0899f5f5ddc0a7ef6b.dat +0 -0
  378. data/lib/mikunyan/typetrees/30e5283aee3520fef10b77ffad62c83d.dat +0 -0
  379. data/lib/mikunyan/typetrees/310b66fa6f7980b50a9afc5ae3de4be7.dat +0 -0
  380. data/lib/mikunyan/typetrees/313e0ef8529b6cf61e4628fea22c1248.dat +0 -0
  381. data/lib/mikunyan/typetrees/313f624e8093f279302b3b6525bbb83a.dat +0 -0
  382. data/lib/mikunyan/typetrees/31a3036cdbecf796277c319a4537c802.dat +0 -0
  383. data/lib/mikunyan/typetrees/32094882bae6171c02d75bd88c4d43e1.dat +0 -0
  384. data/lib/mikunyan/typetrees/3283853e944bcba5a34dbc0848eec183.dat +0 -0
  385. data/lib/mikunyan/typetrees/330078ad6b3dd7f2ddb7acc3e27016bd.dat +0 -0
  386. data/lib/mikunyan/typetrees/3383c534169866b1d8b813ef0c7efa0a.dat +0 -0
  387. data/lib/mikunyan/typetrees/3383de6791220633b8bf013ca6c7698c.dat +0 -0
  388. data/lib/mikunyan/typetrees/33c22162b5b5f467fe7a7006ec52a136.dat +0 -0
  389. data/lib/mikunyan/typetrees/34f82447344517eacb2e4f407ad31706.dat +0 -0
  390. data/lib/mikunyan/typetrees/35143c3dc21459692fdaf21d2e208b06.dat +0 -0
  391. data/lib/mikunyan/typetrees/3516f0737a1242d1296fb738f8e40f76.dat +0 -0
  392. data/lib/mikunyan/typetrees/351ec242900b73e5560978fbb0d0cf82.dat +0 -0
  393. data/lib/mikunyan/typetrees/351f9bb942a4da561dcc5fef0ef510fa.dat +0 -0
  394. data/lib/mikunyan/typetrees/35b5aac7e54392457593cab60408b045.dat +0 -0
  395. data/lib/mikunyan/typetrees/35f443f871a6e42f9927fa28f8624097.dat +0 -0
  396. data/lib/mikunyan/typetrees/35fe4dba66818845b49463deb48b4734.dat +0 -0
  397. data/lib/mikunyan/typetrees/3616ba8255b2e0b96f89f1d32a86917d.dat +0 -0
  398. data/lib/mikunyan/typetrees/36f7b2db46f99efbdbf3c762b0b382d1.dat +0 -0
  399. data/lib/mikunyan/typetrees/370b0f89c6f401663e2eb09de9796164.dat +0 -0
  400. data/lib/mikunyan/typetrees/3729a4fed3f20838308759acc8a3f2a4.dat +0 -0
  401. data/lib/mikunyan/typetrees/37efb94307307a222a4b44847853eb41.dat +0 -0
  402. data/lib/mikunyan/typetrees/38a0b7bcc276529c80d90d35e4d84b8b.dat +0 -0
  403. data/lib/mikunyan/typetrees/3a500d83b71456e038d03ae52811afd9.dat +0 -0
  404. data/lib/mikunyan/typetrees/3a6bcd3696897d807684f3618ad3703c.dat +0 -0
  405. data/lib/mikunyan/typetrees/3a7ca5d09a7c50a9a8fc4016c0d9eacf.dat +0 -0
  406. data/lib/mikunyan/typetrees/3acd9a6db557e2793568933508522dff.dat +0 -0
  407. data/lib/mikunyan/typetrees/3b0d63b530177b95b8456ba44dbbeb5b.dat +0 -0
  408. data/lib/mikunyan/typetrees/3b26cb0c7d7e87bb45886cb857409b54.dat +0 -0
  409. data/lib/mikunyan/typetrees/3b43dde4518e4846a3d21126d51cb10f.dat +0 -0
  410. data/lib/mikunyan/typetrees/3b8b6e6bb5334a23b9fdc673bf73adf7.dat +0 -0
  411. data/lib/mikunyan/typetrees/3b9086da85ee83d3b154eb2ea7fcba05.dat +0 -0
  412. data/lib/mikunyan/typetrees/3c11da6c3ab6191099ff9deeef7469ef.dat +0 -0
  413. data/lib/mikunyan/typetrees/3c22e0cc9d3429687479f46554eab311.dat +0 -0
  414. data/lib/mikunyan/typetrees/3c2ce35247b35fd2f612ba19e32d5f44.dat +0 -0
  415. data/lib/mikunyan/typetrees/3c6a89d0e033d366453210256ef1d7d3.dat +0 -0
  416. data/lib/mikunyan/typetrees/3c7741a17041c5316eee28e6894a1cbd.dat +0 -0
  417. data/lib/mikunyan/typetrees/3c87bdb0795e3e66f4b309308b847d3c.dat +0 -0
  418. data/lib/mikunyan/typetrees/3d0a9ade9f227dc11c8b499c261794e8.dat +0 -0
  419. data/lib/mikunyan/typetrees/3d0f69809d8a2f86ea31f70e7319a44a.dat +0 -0
  420. data/lib/mikunyan/typetrees/3d612124d62c9db4ff7642f6570decd6.dat +0 -0
  421. data/lib/mikunyan/typetrees/3d914550764c2274e8c62817ee10d65b.dat +0 -0
  422. data/lib/mikunyan/typetrees/3e10119f7d2d4d7e643a43d856c0dcfb.dat +0 -0
  423. data/lib/mikunyan/typetrees/3e26b7a0e24abd3fd61d61cf59b6c4de.dat +0 -0
  424. data/lib/mikunyan/typetrees/3eced59289a820b4fa3bd784dbcc21f5.dat +0 -0
  425. data/lib/mikunyan/typetrees/3ffd1baba4bd4f48922b8cbdef0e2a03.dat +0 -0
  426. data/lib/mikunyan/typetrees/3fffe3ab5176cce0865f5ff4f2fa427d.dat +0 -0
  427. data/lib/mikunyan/typetrees/406a3dc2b89329c85e3a9847abbe8fe5.dat +0 -0
  428. data/lib/mikunyan/typetrees/40da10691c0dcc34b5660762da133b32.dat +0 -0
  429. data/lib/mikunyan/typetrees/412c400c20dea4a9fc447f1a44404e68.dat +0 -0
  430. data/lib/mikunyan/typetrees/418787f0cbb25432ee54f9837940729a.dat +0 -0
  431. data/lib/mikunyan/typetrees/4197459266a6342554ae11d2361e03bd.dat +0 -0
  432. data/lib/mikunyan/typetrees/41c90ae9d2ff8f897261f8d5233c154e.dat +0 -0
  433. data/lib/mikunyan/typetrees/41cdd7329b57ba13590d9321a595218f.dat +0 -0
  434. data/lib/mikunyan/typetrees/41fae1321bd7ad1650d7cecc8b7738f4.dat +0 -0
  435. data/lib/mikunyan/typetrees/42cb37e0be59eee623e414924928a40b.dat +0 -0
  436. data/lib/mikunyan/typetrees/434b934f757d042e20f52d8c2ae20843.dat +0 -0
  437. data/lib/mikunyan/typetrees/43688f077be008681d7eb9c994a18319.dat +0 -0
  438. data/lib/mikunyan/typetrees/43796121850ca62303af099e74b78099.dat +0 -0
  439. data/lib/mikunyan/typetrees/439e66a89c7fdef6f0927c9256c0773a.dat +0 -0
  440. data/lib/mikunyan/typetrees/442339d34eb0fadbe32ec143c60178f9.dat +0 -0
  441. data/lib/mikunyan/typetrees/448f646b445110ec08e0fa261c60874b.dat +0 -0
  442. data/lib/mikunyan/typetrees/44e2e865d4b8ca1e2ff1a674fe72520c.dat +0 -0
  443. data/lib/mikunyan/typetrees/45346f514b26cc508276ebd72faa6efc.dat +0 -0
  444. data/lib/mikunyan/typetrees/45b09dc0aed1f613c87ca0244816df75.dat +0 -0
  445. data/lib/mikunyan/typetrees/46236a8c8f841316135a0708a271d46b.dat +0 -0
  446. data/lib/mikunyan/typetrees/46c7e33b8dcc4199930c0b6e936c806d.dat +0 -0
  447. data/lib/mikunyan/typetrees/46cbdd6fc1deba025fb300d3ab19d3f1.dat +0 -0
  448. data/lib/mikunyan/typetrees/46e5682e0f5a4297bf46ffb5fe276535.dat +0 -0
  449. data/lib/mikunyan/typetrees/46fda2d131e65f9426462feecebc25c4.dat +0 -0
  450. data/lib/mikunyan/typetrees/471d5e9908ef24e3f514e9c015278dcc.dat +0 -0
  451. data/lib/mikunyan/typetrees/47e415e4ded437316718ef638dadd1bb.dat +0 -0
  452. data/lib/mikunyan/typetrees/47ec19649a1286158a8473b98a437ad9.dat +0 -0
  453. data/lib/mikunyan/typetrees/4837f860c05f8a94a4f956b92e3dad20.dat +0 -0
  454. data/lib/mikunyan/typetrees/4855c8964e40430d995b0b5a16b06c29.dat +0 -0
  455. data/lib/mikunyan/typetrees/486ba4e15dbd6aea8ac1a064305889c8.dat +0 -0
  456. data/lib/mikunyan/typetrees/486fa2a06d3c4322486ff9d1ae9a91d8.dat +0 -0
  457. data/lib/mikunyan/typetrees/48d16bd72d4e00f18fcf7f164ca78fcf.dat +0 -0
  458. data/lib/mikunyan/typetrees/4978b2bc5bfb76f1d26d687ea1bd8be3.dat +0 -0
  459. data/lib/mikunyan/typetrees/49bb43122aea696618d75afae92c2b3d.dat +0 -0
  460. data/lib/mikunyan/typetrees/49ff511929094ac12ffaa4ab38ed7bd1.dat +0 -0
  461. data/lib/mikunyan/typetrees/4b93aa1a138b912b0c421019169acf04.dat +0 -0
  462. data/lib/mikunyan/typetrees/4bb640239fe9179b3fe914ef2ad73248.dat +0 -0
  463. data/lib/mikunyan/typetrees/4bfc6b1eb274517782a296ebc8d1af84.dat +0 -0
  464. data/lib/mikunyan/typetrees/4c4cafd75c2bdccfb2af56ac8cc9c6de.dat +0 -0
  465. data/lib/mikunyan/typetrees/4c974799da79b8bb90685d05d744a927.dat +0 -0
  466. data/lib/mikunyan/typetrees/4c9ee0b79c5e5bcbd0628aa9ea5398e4.dat +0 -0
  467. data/lib/mikunyan/typetrees/4c9efaab9658908236c454765ba987c8.dat +0 -0
  468. data/lib/mikunyan/typetrees/4d47eb52c44b5042b1d33f9885218658.dat +0 -0
  469. data/lib/mikunyan/typetrees/4da3f794df175c929b97594573801119.dat +0 -0
  470. data/lib/mikunyan/typetrees/4dbfaa1def6adb569b550804b19b4305.dat +0 -0
  471. data/lib/mikunyan/typetrees/4e2656508795cad0cb5c8aa02bd550b6.dat +0 -0
  472. data/lib/mikunyan/typetrees/4e3ad1f5059719dbf410367459b499a5.dat +0 -0
  473. data/lib/mikunyan/typetrees/4e588b6332554634ea7e07f6680f0582.dat +0 -0
  474. data/lib/mikunyan/typetrees/4ea79602e4aa87588eee6d1905d8cb7a.dat +0 -0
  475. data/lib/mikunyan/typetrees/4eabbb423148bfffb763dbee212b366b.dat +0 -0
  476. data/lib/mikunyan/typetrees/4f127c0d7cb01c946ae357e54fae15e1.dat +0 -0
  477. data/lib/mikunyan/typetrees/4f92691a2b77d52dbc397527bff35e5a.dat +0 -0
  478. data/lib/mikunyan/typetrees/5092b508377b9c6d5ad9895b3d286788.dat +0 -0
  479. data/lib/mikunyan/typetrees/515d8c2462ffd1457616311bf40b514f.dat +0 -0
  480. data/lib/mikunyan/typetrees/51963c3dcc24197eabb30cc6868420d9.dat +0 -0
  481. data/lib/mikunyan/typetrees/51a13aeaa0d05081dc075fcbb2f63ef8.dat +0 -0
  482. data/lib/mikunyan/typetrees/51c84e1e88d9b0111efef8b6e10c4a32.dat +0 -0
  483. data/lib/mikunyan/typetrees/52b9481201679837cd249e4a88b7e191.dat +0 -0
  484. data/lib/mikunyan/typetrees/52e5341311c906096706ed87a43d93a7.dat +0 -0
  485. data/lib/mikunyan/typetrees/5306e362d8eb0dd3ad5636b4ed4552a7.dat +0 -0
  486. data/lib/mikunyan/typetrees/538345acf19ef6ab1d9baaa1fa798ea4.dat +0 -0
  487. data/lib/mikunyan/typetrees/53dd52a23ef6605f90d1e659f26de1d7.dat +0 -0
  488. data/lib/mikunyan/typetrees/549eb077bec973227cd80a75ad8936ee.dat +0 -0
  489. data/lib/mikunyan/typetrees/54ec8f0635016644e98d13e28d89a99f.dat +0 -0
  490. data/lib/mikunyan/typetrees/54f9e32744f326f7a0bad79d35247e39.dat +0 -0
  491. data/lib/mikunyan/typetrees/5540f11fd4650f927a3ddea613e3fac4.dat +0 -0
  492. data/lib/mikunyan/typetrees/5627f7a0d565659b25cb38a17f6465cd.dat +0 -0
  493. data/lib/mikunyan/typetrees/56afddc7f2dabfd6c1b92f818c212973.dat +0 -0
  494. data/lib/mikunyan/typetrees/571c0f2afe47acf1cd520f332d803b55.dat +0 -0
  495. data/lib/mikunyan/typetrees/578296e9395d8cd2cdb48a693fbcef63.dat +0 -0
  496. data/lib/mikunyan/typetrees/581f43365e98d398f5a716a8662bb6c2.dat +0 -0
  497. data/lib/mikunyan/typetrees/5839854f435cc7e9094966fb28f1d4fd.dat +0 -0
  498. data/lib/mikunyan/typetrees/583dd2bd3110da224e35404a92a6b223.dat +0 -0
  499. data/lib/mikunyan/typetrees/58ef73d2332f4214c1edee344bebe42a.dat +0 -0
  500. data/lib/mikunyan/typetrees/59827bcd10f00f02e580cc25fd9b35dd.dat +0 -0
  501. data/lib/mikunyan/typetrees/5a49bcd872a89bb1868c4eff8906b310.dat +0 -0
  502. data/lib/mikunyan/typetrees/5aa0b5d1e3115ca6e2087ab05a7bba32.dat +0 -0
  503. data/lib/mikunyan/typetrees/5b1b6bf0de1c285996cbfcf535f79a8b.dat +0 -0
  504. data/lib/mikunyan/typetrees/5bbb1d896df4d71b93d2eb023283c967.dat +0 -0
  505. data/lib/mikunyan/typetrees/5bc42b93159267aabba724a6a7923603.dat +0 -0
  506. data/lib/mikunyan/typetrees/5bcd76d798e7b9f2f3ffd398fd2aa6d0.dat +0 -0
  507. data/lib/mikunyan/typetrees/5be518883c8348ae95891bc413f25d9a.dat +0 -0
  508. data/lib/mikunyan/typetrees/5c5443aa48dc982498dc45b407dd366c.dat +0 -0
  509. data/lib/mikunyan/typetrees/5c56c5326122dbfc17f05b4bd1073819.dat +0 -0
  510. data/lib/mikunyan/typetrees/5db1b04c981af23853d34d9c3b3e4e04.dat +0 -0
  511. data/lib/mikunyan/typetrees/5e04ed38a99206bb912ef5540d987422.dat +0 -0
  512. data/lib/mikunyan/typetrees/5e3043c1e8b48dc540b5587049a5652a.dat +0 -0
  513. data/lib/mikunyan/typetrees/5e4ba266c81110b8a145f252b27434fe.dat +0 -0
  514. data/lib/mikunyan/typetrees/5e6c5cfe60546fff82d8f510201e1333.dat +0 -0
  515. data/lib/mikunyan/typetrees/5efa4c14815cf0fce98ec9ccc0a5cd0f.dat +0 -0
  516. data/lib/mikunyan/typetrees/5efb55d345c70f1e0ab1086d54664f1b.dat +0 -0
  517. data/lib/mikunyan/typetrees/5fab403b08c59ff6a1cae93a9297e7ea.dat +0 -0
  518. data/lib/mikunyan/typetrees/5fb5352926a129871956f20d77d944ea.dat +0 -0
  519. data/lib/mikunyan/typetrees/5fc4c3a218278ab4061cbdc2b3421051.dat +0 -0
  520. data/lib/mikunyan/typetrees/600abd4d46cc5440a8c9fc82e53617c5.dat +0 -0
  521. data/lib/mikunyan/typetrees/605682f38c4566637070ca76d9c7d2fe.dat +0 -0
  522. data/lib/mikunyan/typetrees/60dad57ee0f8f8b133ea8cb45b9ec36e.dat +0 -0
  523. data/lib/mikunyan/typetrees/618e59f5518f89d1b3a5c7394befc2a2.dat +0 -0
  524. data/lib/mikunyan/typetrees/619374d5c7f049786553fa386d48f88b.dat +0 -0
  525. data/lib/mikunyan/typetrees/61a1f8107fe55e8dc70b53ee2eff2756.dat +0 -0
  526. data/lib/mikunyan/typetrees/61ac6bba7ed5747525d406d2d0585a95.dat +0 -0
  527. data/lib/mikunyan/typetrees/61fe5cedbfcc1fc0104298e4c582bfac.dat +0 -0
  528. data/lib/mikunyan/typetrees/620f42f8420121766d34f6447784f183.dat +0 -0
  529. data/lib/mikunyan/typetrees/626e47f12c9e82cbe8d22e58e9c22441.dat +0 -0
  530. data/lib/mikunyan/typetrees/6286036292a215a5bb0bcb1dd22f9363.dat +0 -0
  531. data/lib/mikunyan/typetrees/62e541c3b7db7e26fd3d18076463a677.dat +0 -0
  532. data/lib/mikunyan/typetrees/62fa22027c3b351611164287e25fd49f.dat +0 -0
  533. data/lib/mikunyan/typetrees/6348b3796b6b02138fc1dfafb5b20b0d.dat +0 -0
  534. data/lib/mikunyan/typetrees/63f2ec883b52eee871736caedebed659.dat +0 -0
  535. data/lib/mikunyan/typetrees/641020e7e2ce4264829d051c6fe93352.dat +0 -0
  536. data/lib/mikunyan/typetrees/6435a529e2ad3f76e629c15d69227f03.dat +0 -0
  537. data/lib/mikunyan/typetrees/643e11867d6e720ee84a107eb84644bd.dat +0 -0
  538. data/lib/mikunyan/typetrees/645b27b9c2e45aeb8f35a172ff464989.dat +0 -0
  539. data/lib/mikunyan/typetrees/6485f962bc35ac4b9c73ccc6e9a54a91.dat +0 -0
  540. data/lib/mikunyan/typetrees/64eff32a9399a62c0c1ff38ffc206094.dat +0 -0
  541. data/lib/mikunyan/typetrees/657663fcc23615b4f420398b9cf66800.dat +0 -0
  542. data/lib/mikunyan/typetrees/65d43587d7c352e4bd0630c5e2d2b298.dat +0 -0
  543. data/lib/mikunyan/typetrees/66405447c6973a81e978410c391172fe.dat +0 -0
  544. data/lib/mikunyan/typetrees/66699f4e7c97d82ff8b9383b2509b87e.dat +0 -0
  545. data/lib/mikunyan/typetrees/668204d5ecec40adf49520ed6a9025d2.dat +0 -0
  546. data/lib/mikunyan/typetrees/66c04efe53dbe7127cfdf869a8f95b15.dat +0 -0
  547. data/lib/mikunyan/typetrees/66e56c6f103e8a727c7ae530a8f7455d.dat +0 -0
  548. data/lib/mikunyan/typetrees/66fcee7a9b922f2ff5b0d9b52d46547c.dat +0 -0
  549. data/lib/mikunyan/typetrees/6764d788de27a14bb8ce1638fde37482.dat +0 -0
  550. data/lib/mikunyan/typetrees/676cc4c231281a90a6a7cd15c124eff4.dat +0 -0
  551. data/lib/mikunyan/typetrees/676f41d3949568666a56b6761578e00c.dat +0 -0
  552. data/lib/mikunyan/typetrees/678a2b17764e129def610fbc5b8c42bf.dat +0 -0
  553. data/lib/mikunyan/typetrees/67dc4bcb545456d2d3c96334a159cc9a.dat +0 -0
  554. data/lib/mikunyan/typetrees/67de679f93c1a1fada22b4ffaafbf382.dat +0 -0
  555. data/lib/mikunyan/typetrees/6826552d2f82ad461f4aef84f4d94ea3.dat +0 -0
  556. data/lib/mikunyan/typetrees/6883009ec58a82ea61000b9c42c5c162.dat +0 -0
  557. data/lib/mikunyan/typetrees/68d2447015cd020e38d89e52e297f90b.dat +0 -0
  558. data/lib/mikunyan/typetrees/68dffa1eee93c91703996387b600aa7e.dat +0 -0
  559. data/lib/mikunyan/typetrees/6932d6d1d46264c8680a181056f98be2.dat +0 -0
  560. data/lib/mikunyan/typetrees/6974f6c74321933ec4ba7437a55be2c3.dat +0 -0
  561. data/lib/mikunyan/typetrees/69930e70a6ce1751fde0232474bd6ee0.dat +0 -0
  562. data/lib/mikunyan/typetrees/69b01db128625aa95f1f92fb890ff045.dat +0 -0
  563. data/lib/mikunyan/typetrees/69c8dbb0802cc4bc9be68d5c7309b764.dat +0 -0
  564. data/lib/mikunyan/typetrees/69d2caf8f9638b6169d920c89d9ef16f.dat +0 -0
  565. data/lib/mikunyan/typetrees/6a315ab47bbb18fc937ba08523937b61.dat +0 -0
  566. data/lib/mikunyan/typetrees/6a6f68020de4f8d31c56c86f0382f285.dat +0 -0
  567. data/lib/mikunyan/typetrees/6ac2d1181bb850de49408801e9642c7c.dat +0 -0
  568. data/lib/mikunyan/typetrees/6ad9191fff669ba9974499b49a164eb6.dat +0 -0
  569. data/lib/mikunyan/typetrees/6b0764702e7fa567f1b7e41c78cc2429.dat +0 -0
  570. data/lib/mikunyan/typetrees/6bc25415a9108f87531e4c7946928d9b.dat +0 -0
  571. data/lib/mikunyan/typetrees/6bd7d7520290d78de5f270d96e24bb2b.dat +0 -0
  572. data/lib/mikunyan/typetrees/6bdc295cd9692eca0774303098f1d146.dat +0 -0
  573. data/lib/mikunyan/typetrees/6bf84760b5b66259d18266ef96ef7de1.dat +0 -0
  574. data/lib/mikunyan/typetrees/6c0f58fbee223f3b8a8fac3394f703bf.dat +0 -0
  575. data/lib/mikunyan/typetrees/6c7dcb0569480fe5a3393817b73dc97e.dat +0 -0
  576. data/lib/mikunyan/typetrees/6caeaf097185ade2eb31f23d1085537f.dat +0 -0
  577. data/lib/mikunyan/typetrees/6ccd29968422b0c727655900a021b33e.dat +0 -0
  578. data/lib/mikunyan/typetrees/6d1b97337aac9cb7094c7e1041b3e875.dat +0 -0
  579. data/lib/mikunyan/typetrees/6d5c997e9b5456804ba113755fc21d77.dat +0 -0
  580. data/lib/mikunyan/typetrees/6d624ed7be5b7d2bfe7a5333bdd41dae.dat +0 -0
  581. data/lib/mikunyan/typetrees/6dc0d34c2c0e79e0039a0ce24b8d7ad7.dat +0 -0
  582. data/lib/mikunyan/typetrees/6dcbd8595bad0e6a28405a02cf214475.dat +0 -0
  583. data/lib/mikunyan/typetrees/6e5277573492549897ee4815066ae959.dat +0 -0
  584. data/lib/mikunyan/typetrees/6ec5696dc525f7bf85a7bb2e1ae000a9.dat +0 -0
  585. data/lib/mikunyan/typetrees/6ed2fb56a9c16fd1781896a923bc5110.dat +0 -0
  586. data/lib/mikunyan/typetrees/6ef34d0e751e6b1699a5ea302b822e33.dat +0 -0
  587. data/lib/mikunyan/typetrees/6f0618d26354f0289c7090aaf688981a.dat +0 -0
  588. data/lib/mikunyan/typetrees/6f10d8f832d5adde6982d4515b3f0bb3.dat +0 -0
  589. data/lib/mikunyan/typetrees/6f5cd06250f9dcc3ca6c3bca26c54a4a.dat +0 -0
  590. data/lib/mikunyan/typetrees/6fe7137b38c0f129e598c03aabcd1b7d.dat +0 -0
  591. data/lib/mikunyan/typetrees/706686d4d71b0e1bf7c80acdaa4ee6f5.dat +0 -0
  592. data/lib/mikunyan/typetrees/70694abce333e1b33ac59f2073897f8c.dat +0 -0
  593. data/lib/mikunyan/typetrees/708b7450c6da65399971dc7713450987.dat +0 -0
  594. data/lib/mikunyan/typetrees/710ba136b5e726ce760e399a154d3147.dat +0 -0
  595. data/lib/mikunyan/typetrees/715d61497b6835c6d6051c1782d084d8.dat +0 -0
  596. data/lib/mikunyan/typetrees/7230c9eb36a0c72a7187ad952551e1e5.dat +0 -0
  597. data/lib/mikunyan/typetrees/72a04b61fcb3921ca9eae80f2e8116f2.dat +0 -0
  598. data/lib/mikunyan/typetrees/730963c6e93acb528bb26d1152f2f185.dat +0 -0
  599. data/lib/mikunyan/typetrees/736709e4aa82fa6e43c313608fdab426.dat +0 -0
  600. data/lib/mikunyan/typetrees/7426e29c09461093e756fbae4d601f21.dat +0 -0
  601. data/lib/mikunyan/typetrees/742c910494e1117e52cc42600eedf188.dat +0 -0
  602. data/lib/mikunyan/typetrees/742dfb0ecafe88a375d25ddf3b57c48f.dat +0 -0
  603. data/lib/mikunyan/typetrees/7487684e77cbd197aaf389864da1d8c7.dat +0 -0
  604. data/lib/mikunyan/typetrees/74d387e7f1b0ef0e146e96940005546f.dat +0 -0
  605. data/lib/mikunyan/typetrees/74dee2a3d385f2275898fdb717601239.dat +0 -0
  606. data/lib/mikunyan/typetrees/74e21134ffaafd89e66055c6276511eb.dat +0 -0
  607. data/lib/mikunyan/typetrees/7516312baadcdf604129e59e48ddd279.dat +0 -0
  608. data/lib/mikunyan/typetrees/75545c074fd129c54b22e1a6bcdcb66f.dat +0 -0
  609. data/lib/mikunyan/typetrees/7596aa057c69a1ec1a3a89ad75428393.dat +0 -0
  610. data/lib/mikunyan/typetrees/75be9be17431b833cd73a47d360d8ccf.dat +0 -0
  611. data/lib/mikunyan/typetrees/75d2f1d383a6d305cf13e74d9fbcbe27.dat +0 -0
  612. data/lib/mikunyan/typetrees/75e5f675169cf0850fafafa08a65cb38.dat +0 -0
  613. data/lib/mikunyan/typetrees/7602eb8dc1aab6b53a21f0eec61dcf50.dat +0 -0
  614. data/lib/mikunyan/typetrees/761ca81f78491542badc37f810ab3455.dat +0 -0
  615. data/lib/mikunyan/typetrees/762765b0cbe6e45e90e5327a46f736f3.dat +0 -0
  616. data/lib/mikunyan/typetrees/766ecf7bc48297e7896ab27f26a20718.dat +0 -0
  617. data/lib/mikunyan/typetrees/76ce55d4dbaf38f5c674ea9f0a344951.dat +0 -0
  618. data/lib/mikunyan/typetrees/76f4b627feb164db63eb7309397cc41c.dat +0 -0
  619. data/lib/mikunyan/typetrees/774f723655447fbac1acb3d6e2efe779.dat +0 -0
  620. data/lib/mikunyan/typetrees/77e140a777f2dcacb51121e0a5bd1f53.dat +0 -0
  621. data/lib/mikunyan/typetrees/7820575911fe2da513f40293adce9a18.dat +0 -0
  622. data/lib/mikunyan/typetrees/7827d12c70d793eea089e3d7f39d261d.dat +0 -0
  623. data/lib/mikunyan/typetrees/783160b4237e2d925847373d2e3e1f74.dat +0 -0
  624. data/lib/mikunyan/typetrees/78b7ad80f74e5183d7232e985f897e07.dat +0 -0
  625. data/lib/mikunyan/typetrees/78d8adfab8d2f5e87dc9f0940edf643e.dat +0 -0
  626. data/lib/mikunyan/typetrees/796f96b562ba5f95590515f1ff2b4ad4.dat +0 -0
  627. data/lib/mikunyan/typetrees/7a8e9c0bbba2cc55cba94498d74ce288.dat +0 -0
  628. data/lib/mikunyan/typetrees/7a92461726e9f3f6530e31cf5af5d1bf.dat +0 -0
  629. data/lib/mikunyan/typetrees/7a929c15d05fa9e0429b1b0b1aebc4fa.dat +0 -0
  630. data/lib/mikunyan/typetrees/7af10101ba0f53047f2ef70d8a9c804b.dat +0 -0
  631. data/lib/mikunyan/typetrees/7b060099aa81c5b21d273334dca40500.dat +0 -0
  632. data/lib/mikunyan/typetrees/7b2c23a9c82c5c46e142acfea65b3c97.dat +0 -0
  633. data/lib/mikunyan/typetrees/7b7447a6cf3fc8277777e805eba85851.dat +0 -0
  634. data/lib/mikunyan/typetrees/7bc51621c4b5daf39c657881089220a1.dat +0 -0
  635. data/lib/mikunyan/typetrees/7bdd8f909403558edc7cfc68ea95b815.dat +0 -0
  636. data/lib/mikunyan/typetrees/7c40ce9e4c671f7594f3d4fae7c32466.dat +0 -0
  637. data/lib/mikunyan/typetrees/7c5cf6d08d3a08f2a7974b31506de880.dat +0 -0
  638. data/lib/mikunyan/typetrees/7c6240188efe9290095ed1a669f90ec1.dat +0 -0
  639. data/lib/mikunyan/typetrees/7c68f879768df44f439ae870b70b6a9e.dat +0 -0
  640. data/lib/mikunyan/typetrees/7c6dc2b255110b522e6c300e8632f2a1.dat +0 -0
  641. data/lib/mikunyan/typetrees/7cbb1c953f2ed3ca40125e473bf2fce0.dat +0 -0
  642. data/lib/mikunyan/typetrees/7cdec7ef01e50eed77502d4e277c3e0d.dat +0 -0
  643. data/lib/mikunyan/typetrees/7cf0af7e0c7d50808a569121e7a4c0de.dat +0 -0
  644. data/lib/mikunyan/typetrees/7d2188e085d3917ebec9a1067d74de59.dat +0 -0
  645. data/lib/mikunyan/typetrees/7d7186ff509eeb1be635ead41f130cbb.dat +0 -0
  646. data/lib/mikunyan/typetrees/7db9444f76a2b8f439e4581d2274d36b.dat +0 -0
  647. data/lib/mikunyan/typetrees/7e050781d08ca9d10bc74beb7e91c3b5.dat +0 -0
  648. data/lib/mikunyan/typetrees/7e328a225b72b97191b52d631ccf62d2.dat +0 -0
  649. data/lib/mikunyan/typetrees/7ec49b5572da843e0e7d21ab5459a2da.dat +0 -0
  650. data/lib/mikunyan/typetrees/7ef50d120c6291f8451b25ad8abf0965.dat +0 -0
  651. data/lib/mikunyan/typetrees/7f52d4deb56f283a259b5e24c4bf3f54.dat +0 -0
  652. data/lib/mikunyan/typetrees/7f5bc8091a8db0e9aa2b5fbf64e7951b.dat +0 -0
  653. data/lib/mikunyan/typetrees/7f814eabb66e0fb6a82a15ef17f7e1d3.dat +0 -0
  654. data/lib/mikunyan/typetrees/7fab9e77215788a4f643d5f7397ffbb3.dat +0 -0
  655. data/lib/mikunyan/typetrees/7fb1270153bd6ccfa8bc7546dda95254.dat +0 -0
  656. data/lib/mikunyan/typetrees/805ccd3567f53eef88ad4ad0bfa2d5fe.dat +0 -0
  657. data/lib/mikunyan/typetrees/806230bcf014183c8e3ad32dfd4280ed.dat +0 -0
  658. data/lib/mikunyan/typetrees/80ba7945b19e87c90c6aa46fb4c7b9b2.dat +0 -0
  659. data/lib/mikunyan/typetrees/8146f1f01d4bf220c339260799ed1bb6.dat +0 -0
  660. data/lib/mikunyan/typetrees/818ddfe606de30c07daa36d729f982e2.dat +0 -0
  661. data/lib/mikunyan/typetrees/8198e72b2e2a96b9cfa38636b5565e13.dat +0 -0
  662. data/lib/mikunyan/typetrees/81d6f63da53d28f32efd4d3f6b1d3da8.dat +0 -0
  663. data/lib/mikunyan/typetrees/81e28d3a4102fabc98ac701e6a192ad4.dat +0 -0
  664. data/lib/mikunyan/typetrees/827f095b42d421f9185c642342736534.dat +0 -0
  665. data/lib/mikunyan/typetrees/82cbe6ba9f2fd496d8e14747a764dc4f.dat +0 -0
  666. data/lib/mikunyan/typetrees/82ef0bad8dda8ba9bd5e1c02d979553c.dat +0 -0
  667. data/lib/mikunyan/typetrees/833f8aadff717234b49269a5132edc7c.dat +0 -0
  668. data/lib/mikunyan/typetrees/8401d562403dab942459c07642072dd6.dat +0 -0
  669. data/lib/mikunyan/typetrees/841a9336c1bf3f743885c5872cc07610.dat +0 -0
  670. data/lib/mikunyan/typetrees/84441ff585c6e370e29c822a10ffaca8.dat +0 -0
  671. data/lib/mikunyan/typetrees/845046c14ae4f0948a7d3dbc4a0c539e.dat +0 -0
  672. data/lib/mikunyan/typetrees/8473edbc0acb04069b62cedcb384b5b3.dat +0 -0
  673. data/lib/mikunyan/typetrees/849b9d0ee2b45ed2b7ad871a6e9e7829.dat +0 -0
  674. data/lib/mikunyan/typetrees/849d2b6794bdc167b0ed4680bad500a8.dat +0 -0
  675. data/lib/mikunyan/typetrees/84c6ac46ef89030991cbbb3fd21d2889.dat +0 -0
  676. data/lib/mikunyan/typetrees/852794becbcf95f66992da2b96a69704.dat +0 -0
  677. data/lib/mikunyan/typetrees/863223fe4e4f151f9fac463e584de569.dat +0 -0
  678. data/lib/mikunyan/typetrees/86897fc97905918dc891437fa7a15696.dat +0 -0
  679. data/lib/mikunyan/typetrees/86d77ad7cf81dd25dd72cba6c8c6469f.dat +0 -0
  680. data/lib/mikunyan/typetrees/86e3dfad5ee7276a4684d1a52abff92e.dat +0 -0
  681. data/lib/mikunyan/typetrees/87a093027ec05bed0b579a2358a5b05d.dat +0 -0
  682. data/lib/mikunyan/typetrees/87dade7c5c3deedeb0ce5d9a8841f158.dat +0 -0
  683. data/lib/mikunyan/typetrees/87f77e11a02b179bb214bd76d685b401.dat +0 -0
  684. data/lib/mikunyan/typetrees/8925033300616905004fa9e086f1cbc9.dat +0 -0
  685. data/lib/mikunyan/typetrees/896dbaf3b3aebe84868b2f32670d760f.dat +0 -0
  686. data/lib/mikunyan/typetrees/89e4db8e910533e9ee1d1aea4ff83e90.dat +0 -0
  687. data/lib/mikunyan/typetrees/8a5260f6b3834d07a94ab067294b0cc5.dat +0 -0
  688. data/lib/mikunyan/typetrees/8b15ee3625eb1303de45e98f5be1f26a.dat +0 -0
  689. data/lib/mikunyan/typetrees/8b8d4b439b97c4ced21e607f897bafd8.dat +0 -0
  690. data/lib/mikunyan/typetrees/8ba111f9d4192ab8bc45d1660fd86fc6.dat +0 -0
  691. data/lib/mikunyan/typetrees/8c484a566ae9d66ee0aceea5a42e3789.dat +0 -0
  692. data/lib/mikunyan/typetrees/8c55b3391474b0260c3d86e0c2bcd993.dat +0 -0
  693. data/lib/mikunyan/typetrees/8c628dc93bfed0b3426a4bac24a61747.dat +0 -0
  694. data/lib/mikunyan/typetrees/8c76f4279782912a6b3aa48b66ed01b7.dat +0 -0
  695. data/lib/mikunyan/typetrees/8c86f4ac6b7f47c045560d4383aadc8d.dat +0 -0
  696. data/lib/mikunyan/typetrees/8d0a59169a1ccf55f552c37131047e9c.dat +0 -0
  697. data/lib/mikunyan/typetrees/8d3c252a2ef87c9fce3fb31e19ba56a8.dat +0 -0
  698. data/lib/mikunyan/typetrees/8d9b6bdaddb4b93dfcd710699c75727e.dat +0 -0
  699. data/lib/mikunyan/typetrees/8dd2e23af15a28379c28908e65221abe.dat +0 -0
  700. data/lib/mikunyan/typetrees/8df95c0391bc4e4f4e0a42aba29ab8a2.dat +0 -0
  701. data/lib/mikunyan/typetrees/8ea24924f881c1cd4138c7788c0ef205.dat +0 -0
  702. data/lib/mikunyan/typetrees/8fbd7a1c59a8d433c600d62fa2740c9d.dat +0 -0
  703. data/lib/mikunyan/typetrees/904f143a242ea542145368df1fc29c24.dat +0 -0
  704. data/lib/mikunyan/typetrees/9075bdf87ce7fe1d17fed3456a6a834b.dat +0 -0
  705. data/lib/mikunyan/typetrees/912cebe0cd9b0a9e0d0a548bfa2fd382.dat +0 -0
  706. data/lib/mikunyan/typetrees/914d9c276e68b21df32efb3447e983bf.dat +0 -0
  707. data/lib/mikunyan/typetrees/91ffea0726900cb751e36f83816df13e.dat +0 -0
  708. data/lib/mikunyan/typetrees/921d3a8ec14bca7a3ac12be64e59d740.dat +0 -0
  709. data/lib/mikunyan/typetrees/922285a96e080d3b0fb9d1483ace0c71.dat +0 -0
  710. data/lib/mikunyan/typetrees/924f3272ed53ff58e2379a7684f5069a.dat +0 -0
  711. data/lib/mikunyan/typetrees/927fb27ec5aa6f52f67992bafc6e1df8.dat +0 -0
  712. data/lib/mikunyan/typetrees/92a27f6a5e14dc6ab8018923723c818c.dat +0 -0
  713. data/lib/mikunyan/typetrees/92f1b9794cb255b2fbf962648186a962.dat +0 -0
  714. data/lib/mikunyan/typetrees/936739f45f26fd8b81a4ea70f2c8cad4.dat +0 -0
  715. data/lib/mikunyan/typetrees/936ac825c5beb010bed3b6b7953f4dd2.dat +0 -0
  716. data/lib/mikunyan/typetrees/937a6b5c5f5b313185d252e38d145b17.dat +0 -0
  717. data/lib/mikunyan/typetrees/93c3d14c8b88c38e3aa39de936d38caa.dat +0 -0
  718. data/lib/mikunyan/typetrees/940c9db2511f9898769e11849d71f82f.dat +0 -0
  719. data/lib/mikunyan/typetrees/94a19169d56c4f123092fd0d1e4bdba1.dat +0 -0
  720. data/lib/mikunyan/typetrees/94d6c861f2b382fd81a12d2a1b1e7ce2.dat +0 -0
  721. data/lib/mikunyan/typetrees/954706197f5ed745cd14444d281f1516.dat +0 -0
  722. data/lib/mikunyan/typetrees/959ce281abde8687d3ab1adce9e00f5a.dat +0 -0
  723. data/lib/mikunyan/typetrees/961be27d12d60b1b3421191d5256a876.dat +0 -0
  724. data/lib/mikunyan/typetrees/964c223b82bb8bac12cd3e53186a3e13.dat +0 -0
  725. data/lib/mikunyan/typetrees/9657457af3bc45d81a0b5871a0d18e77.dat +0 -0
  726. data/lib/mikunyan/typetrees/96785e58aac89a09fce6ca2c9448311b.dat +0 -0
  727. data/lib/mikunyan/typetrees/96a47566b4e135078f690a4a69935d58.dat +0 -0
  728. data/lib/mikunyan/typetrees/96bc046967bdbe77c417e21eb49ce1ae.dat +0 -0
  729. data/lib/mikunyan/typetrees/96c46d945b3cc21e2a5ca09659ae4ef2.dat +0 -0
  730. data/lib/mikunyan/typetrees/974cb1de01d7acb61e52fe38b84e0ee0.dat +0 -0
  731. data/lib/mikunyan/typetrees/97da5f4688e45a57c8b42d4f42497297.dat +0 -0
  732. data/lib/mikunyan/typetrees/97dc11471130df660f6d50adbeb2d686.dat +0 -0
  733. data/lib/mikunyan/typetrees/97ec0712102a3ea3f1cf8c0a4e47c070.dat +0 -0
  734. data/lib/mikunyan/typetrees/9805cf0348f163ad092ab00ca9d122d1.dat +0 -0
  735. data/lib/mikunyan/typetrees/983db003d56cd893ea50a9b80e743a79.dat +0 -0
  736. data/lib/mikunyan/typetrees/99359255da094b94c150311921ba4420.dat +0 -0
  737. data/lib/mikunyan/typetrees/996817b009f16e87aaae3624bce113c2.dat +0 -0
  738. data/lib/mikunyan/typetrees/999a8dbc0e53be755905751739c9e11c.dat +0 -0
  739. data/lib/mikunyan/typetrees/99bd795c8f9317e294a68c7fbe03ca20.dat +0 -0
  740. data/lib/mikunyan/typetrees/9a17ee635b6dc8432d0ec80c4ad73e29.dat +0 -0
  741. data/lib/mikunyan/typetrees/9a83846bdc10f24de3183b3d1b510d5c.dat +0 -0
  742. data/lib/mikunyan/typetrees/9aed068deda3d33814c4fb67736e29a2.dat +0 -0
  743. data/lib/mikunyan/typetrees/9af59502167704cb56d2208a8f4cb9d4.dat +0 -0
  744. data/lib/mikunyan/typetrees/9b387d50420c652bc1655e5246825221.dat +0 -0
  745. data/lib/mikunyan/typetrees/9b3c138987aed9be83010b14bab944c5.dat +0 -0
  746. data/lib/mikunyan/typetrees/9ba48aaf9d1e25c3df443b187b038f86.dat +0 -0
  747. data/lib/mikunyan/typetrees/9bcd9c6543c17c98a8822bd42ec93276.dat +0 -0
  748. data/lib/mikunyan/typetrees/9ca11a3c3ac28b3faadefc2077eeed2c.dat +0 -0
  749. data/lib/mikunyan/typetrees/9cd47fa65c9a8be7ae36db2dc33968b2.dat +0 -0
  750. data/lib/mikunyan/typetrees/9d1630b1d7e3bc24abe46e5860a2a179.dat +0 -0
  751. data/lib/mikunyan/typetrees/9e0ab8d396f3249a3958dd930f81f61b.dat +0 -0
  752. data/lib/mikunyan/typetrees/9e26f96591d351c8dfe911b5dc239000.dat +0 -0
  753. data/lib/mikunyan/typetrees/9eabac6ec66ffe818e008883728fcc1b.dat +0 -0
  754. data/lib/mikunyan/typetrees/9ec70d7af96c9625d1bfca15d188b85c.dat +0 -0
  755. data/lib/mikunyan/typetrees/9ee328006f16e91aebcb4f27698f145a.dat +0 -0
  756. data/lib/mikunyan/typetrees/9f1c6f94c1da7e8f10bb554b37c6790b.dat +0 -0
  757. data/lib/mikunyan/typetrees/9f459ec8887c3967985546f1fde8df43.dat +0 -0
  758. data/lib/mikunyan/typetrees/9f6e88bbe6df9df9cf7291b5706b5552.dat +0 -0
  759. data/lib/mikunyan/typetrees/9fc1437f6cfe5c490d2e978f16ab14c6.dat +0 -0
  760. data/lib/mikunyan/typetrees/9fc31ad55662eaea988a01e22a644c39.dat +0 -0
  761. data/lib/mikunyan/typetrees/a02319b1d2e24272d1b421900c6ad759.dat +0 -0
  762. data/lib/mikunyan/typetrees/a0efb292088d42a70bf1e896a86b432c.dat +0 -0
  763. data/lib/mikunyan/typetrees/a13e161c148750300e73c4a6fce7bfbd.dat +0 -0
  764. data/lib/mikunyan/typetrees/a1537a31e824cbbd6c05da4642c985b8.dat +0 -0
  765. data/lib/mikunyan/typetrees/a1976c4b66d47015022b085de5b49ccb.dat +0 -0
  766. data/lib/mikunyan/typetrees/a19b930d9a846346a5d8b896c5e96486.dat +0 -0
  767. data/lib/mikunyan/typetrees/a1ade835112d0f2821871fa3c6e4e587.dat +0 -0
  768. data/lib/mikunyan/typetrees/a1c1ffb08b1cc7f3f88f09356496a286.dat +0 -0
  769. data/lib/mikunyan/typetrees/a1d647cb11661f7cf6547453ea5f9861.dat +0 -0
  770. data/lib/mikunyan/typetrees/a1ed39a19efb6f3ebc0a032dc6d587c9.dat +0 -0
  771. data/lib/mikunyan/typetrees/a2612890399b22f059e37145e4db6ff9.dat +0 -0
  772. data/lib/mikunyan/typetrees/a2dc9dbb5b830efd10b60100b47d8d36.dat +0 -0
  773. data/lib/mikunyan/typetrees/a3125dde8c910a6d078682616f144a80.dat +0 -0
  774. data/lib/mikunyan/typetrees/a3523f5739a17bb6054dde6c088584ce.dat +0 -0
  775. data/lib/mikunyan/typetrees/a372646834bcaf26eab1d21b29e39553.dat +0 -0
  776. data/lib/mikunyan/typetrees/a3c506becc8f7d25351b47778de7ebb5.dat +0 -0
  777. data/lib/mikunyan/typetrees/a3d63d57b4f43b62a77e83e05699a5f6.dat +0 -0
  778. data/lib/mikunyan/typetrees/a439ae65edce4289e3ff832904fea27d.dat +0 -0
  779. data/lib/mikunyan/typetrees/a443a7ce5365c746c6e9c64036662d13.dat +0 -0
  780. data/lib/mikunyan/typetrees/a46a51168885aa63162102ca3f63007a.dat +0 -0
  781. data/lib/mikunyan/typetrees/a47e8a7b7a1ef3aba7372439af5d26a7.dat +0 -0
  782. data/lib/mikunyan/typetrees/a49b27a93f3de2ad5ef668735e5042b2.dat +0 -0
  783. data/lib/mikunyan/typetrees/a4f194097b08bc4c5019c3a4ea6f5cbd.dat +0 -0
  784. data/lib/mikunyan/typetrees/a52792d409265e0e596cf29f070ecb5d.dat +0 -0
  785. data/lib/mikunyan/typetrees/a545a5020d58adc9f675e7c540cc8528.dat +0 -0
  786. data/lib/mikunyan/typetrees/a5610d8eea1dd355fe6d1abe467ef169.dat +0 -0
  787. data/lib/mikunyan/typetrees/a5c609a17035f4d56f2ae04d1b39a920.dat +0 -0
  788. data/lib/mikunyan/typetrees/a5c7631994dff71adc95b7f89031b93b.dat +0 -0
  789. data/lib/mikunyan/typetrees/a607b371095d71157668890ef7ba9916.dat +0 -0
  790. data/lib/mikunyan/typetrees/a60842f261bd4d64035c8ec28d3479e8.dat +0 -0
  791. data/lib/mikunyan/typetrees/a6eed3721efd15a26738b18db46be12f.dat +0 -0
  792. data/lib/mikunyan/typetrees/a70f7abc6586fb35b3a0641aa81e9375.dat +0 -0
  793. data/lib/mikunyan/typetrees/a780b20860600360dca50aabf28af3a8.dat +0 -0
  794. data/lib/mikunyan/typetrees/a7ab35bd41beb7749427a39f92a03d4b.dat +0 -0
  795. data/lib/mikunyan/typetrees/a83755f3cbd13d1fb2fee65b71f3d548.dat +0 -0
  796. data/lib/mikunyan/typetrees/a8d5288ef078923b2de828fe161efa45.dat +0 -0
  797. data/lib/mikunyan/typetrees/a9151a17a865b711150442f2d88c1562.dat +0 -0
  798. data/lib/mikunyan/typetrees/ab4e5036e05e74cdac2d53b6019bc9eb.dat +0 -0
  799. data/lib/mikunyan/typetrees/ab84ab1a36bb2a6b65af81284f111350.dat +0 -0
  800. data/lib/mikunyan/typetrees/abaa04359c1280b858eeac4cd31a7aea.dat +0 -0
  801. data/lib/mikunyan/typetrees/abce5e1c4492692e276ff3d9365f9465.dat +0 -0
  802. data/lib/mikunyan/typetrees/abd3c4b2ff616cc78d42c5941d8569e0.dat +0 -0
  803. data/lib/mikunyan/typetrees/ac0b1a1717abe360c1a00057f5d2abb6.dat +0 -0
  804. data/lib/mikunyan/typetrees/ac5efb9153fd30cd5e78552e69f83830.dat +0 -0
  805. data/lib/mikunyan/typetrees/ac907a47e9d727d24ca82a3ee68dd8df.dat +0 -0
  806. data/lib/mikunyan/typetrees/acf82061a06bb855c2a2a6e73a2b97fb.dat +0 -0
  807. data/lib/mikunyan/typetrees/ad2ca9a0fe21a7cf9793d8ace16bb3cd.dat +0 -0
  808. data/lib/mikunyan/typetrees/add53ee9a755d72f14f4d673d2dac56b.dat +0 -0
  809. data/lib/mikunyan/typetrees/adf5eba4e81b1d740ea0068a30aa8a37.dat +0 -0
  810. data/lib/mikunyan/typetrees/ae12c8f4663719b3d423361a8b8a62d2.dat +0 -0
  811. data/lib/mikunyan/typetrees/aeadce2965a198a87587c0beac675004.dat +0 -0
  812. data/lib/mikunyan/typetrees/aeeebbdbd802239fdfc3aaf98ffc5d01.dat +0 -0
  813. data/lib/mikunyan/typetrees/af863b6969b9b82be9450f0574339f65.dat +0 -0
  814. data/lib/mikunyan/typetrees/af9a16c5c3d9f5104290fff6305334e2.dat +0 -0
  815. data/lib/mikunyan/typetrees/aff142075870161380a891d11baeb767.dat +0 -0
  816. data/lib/mikunyan/typetrees/b093ef1cb958a6b1cf5a00c31b6e05c4.dat +0 -0
  817. data/lib/mikunyan/typetrees/b0adafbe24f8148ebf01794ee6679925.dat +0 -0
  818. data/lib/mikunyan/typetrees/b0f22973848e1cf655dfdf8064bfa400.dat +0 -0
  819. data/lib/mikunyan/typetrees/b14bcb0865632d1b2d6e215a000e4c0f.dat +0 -0
  820. data/lib/mikunyan/typetrees/b1fe84b5bfdc47e2b1b930db296afb2f.dat +0 -0
  821. data/lib/mikunyan/typetrees/b20231c215c4c1b82b98bb49418c5cbe.dat +0 -0
  822. data/lib/mikunyan/typetrees/b204c22c22b1a08f780435c2cb4e6e36.dat +0 -0
  823. data/lib/mikunyan/typetrees/b23ac00b23adf1bb2b3d7c5553ad5dad.dat +0 -0
  824. data/lib/mikunyan/typetrees/b288ea39c72d3b3d238cb4f3fc076d0a.dat +0 -0
  825. data/lib/mikunyan/typetrees/b2c14391e281903c5a5157289977d33f.dat +0 -0
  826. data/lib/mikunyan/typetrees/b2cc7a58ffc0556ece83264e81dff623.dat +0 -0
  827. data/lib/mikunyan/typetrees/b2f39a1d526b8a4c6aad16cff7ca9ea8.dat +0 -0
  828. data/lib/mikunyan/typetrees/b2fbe9f493982acd18f063f7ab5a81aa.dat +0 -0
  829. data/lib/mikunyan/typetrees/b31c04cde0ffadc258d46846966594b1.dat +0 -0
  830. data/lib/mikunyan/typetrees/b3290db9f9d2e2862a1367d32838130e.dat +0 -0
  831. data/lib/mikunyan/typetrees/b354679381971a70db4d0035cc730543.dat +0 -0
  832. data/lib/mikunyan/typetrees/b35bf02952f2946208ff6b4deca3a6a9.dat +0 -0
  833. data/lib/mikunyan/typetrees/b36337bd6d2e99167473b8a383361c21.dat +0 -0
  834. data/lib/mikunyan/typetrees/b38ca8dbedd791b7ca3ca07095a9f312.dat +0 -0
  835. data/lib/mikunyan/typetrees/b38d9554723d82e3bc95c076ca902704.dat +0 -0
  836. data/lib/mikunyan/typetrees/b3fdd03ac222c685fe75187c0b44c489.dat +0 -0
  837. data/lib/mikunyan/typetrees/b494c2cb6c527914e903d8d6e17f30e9.dat +0 -0
  838. data/lib/mikunyan/typetrees/b519ba66b3244a4bfaf9a65938d61b67.dat +0 -0
  839. data/lib/mikunyan/typetrees/b51e06b75a0e28a9f2f242726a3814d4.dat +0 -0
  840. data/lib/mikunyan/typetrees/b53f2d12e7a6d302f50ad4162070fe13.dat +0 -0
  841. data/lib/mikunyan/typetrees/b684fb202e70b6d6c9fa64988e29576e.dat +0 -0
  842. data/lib/mikunyan/typetrees/b6bbd0e88d1feb636d89bd766ea5934f.dat +0 -0
  843. data/lib/mikunyan/typetrees/b6cc407b2d3c753bf79661a477113977.dat +0 -0
  844. data/lib/mikunyan/typetrees/b7056b24cf06fc6058b412a2c2dad2bb.dat +0 -0
  845. data/lib/mikunyan/typetrees/b78821b6aeb5b79c8961728a9f068024.dat +0 -0
  846. data/lib/mikunyan/typetrees/b79aed1f22f656993386add127833156.dat +0 -0
  847. data/lib/mikunyan/typetrees/b7b8ff0c7ec96a3bd77eabf9525d4f06.dat +0 -0
  848. data/lib/mikunyan/typetrees/b7d7910ac57c74d889686f738faa2129.dat +0 -0
  849. data/lib/mikunyan/typetrees/b7e5c868b4ec8e08bd3742a41789553f.dat +0 -0
  850. data/lib/mikunyan/typetrees/b927314c9878d83dca779ce9d6fc4903.dat +0 -0
  851. data/lib/mikunyan/typetrees/b9505154d75e141fc175dd698fcd1cef.dat +0 -0
  852. data/lib/mikunyan/typetrees/b97c898309dcb4b179b92f5dd4a828aa.dat +0 -0
  853. data/lib/mikunyan/typetrees/b980908065249a4bec8305d81d7ac7b7.dat +0 -0
  854. data/lib/mikunyan/typetrees/b9a41dcaf8b39c9e9f35bd4213787e0c.dat +0 -0
  855. data/lib/mikunyan/typetrees/ba1996aca11b1fbb146d9b0b3d8655ad.dat +0 -0
  856. data/lib/mikunyan/typetrees/ba26d1ee9f8242f4e94643f714aa18e1.dat +0 -0
  857. data/lib/mikunyan/typetrees/ba47ad58f6906c6bfe5bbf2de86de146.dat +0 -0
  858. data/lib/mikunyan/typetrees/ba716592649b6cfbc9f19c254a4d4517.dat +0 -0
  859. data/lib/mikunyan/typetrees/bb85fb2b191dd4282476910c85388c01.dat +0 -0
  860. data/lib/mikunyan/typetrees/bbd1f586c5ef70e20cb22656e8ce820b.dat +0 -0
  861. data/lib/mikunyan/typetrees/bc40049689b7cec9aa3d55e2ea8de2cf.dat +0 -0
  862. data/lib/mikunyan/typetrees/bc44f3fd1f7a53385f632e6a3ddb1713.dat +0 -0
  863. data/lib/mikunyan/typetrees/bc55158477811012972fb0d4b572d900.dat +0 -0
  864. data/lib/mikunyan/typetrees/bc6a0079c1aaf2c88aa0baef8cafb07b.dat +0 -0
  865. data/lib/mikunyan/typetrees/bc6ec2e437d1c2fdf300138d6cd908c4.dat +0 -0
  866. data/lib/mikunyan/typetrees/bcbec448e806266dcc4c28030f3860f1.dat +0 -0
  867. data/lib/mikunyan/typetrees/bcdcbeafe799355f39a43b263d10389b.dat +0 -0
  868. data/lib/mikunyan/typetrees/bd08188c47e3a9732b1233b9979acead.dat +0 -0
  869. data/lib/mikunyan/typetrees/bd3e65b436ca9bddcf08b9369dc166c9.dat +0 -0
  870. data/lib/mikunyan/typetrees/bd9937fc95c43ace4f598498922efdf4.dat +0 -0
  871. data/lib/mikunyan/typetrees/bda8c24186074c70bb3983fe48af6d0a.dat +0 -0
  872. data/lib/mikunyan/typetrees/bdad82ac8e818a48cc8c8c353fd1b232.dat +0 -0
  873. data/lib/mikunyan/typetrees/be2b49e54ae8d3aac75bd34a6d87e5e5.dat +0 -0
  874. data/lib/mikunyan/typetrees/be521590c2a7e119c31979e36c98789e.dat +0 -0
  875. data/lib/mikunyan/typetrees/be9c29138eea51e485e58ae7d0ee5eda.dat +0 -0
  876. data/lib/mikunyan/typetrees/bea7fa6dbf25a492093fec0b0b12c49f.dat +0 -0
  877. data/lib/mikunyan/typetrees/bea915a8ab3d9b55e80c969a22e692d3.dat +0 -0
  878. data/lib/mikunyan/typetrees/bf70bb56d86ace6047252688d663d8c4.dat +0 -0
  879. data/lib/mikunyan/typetrees/bf9dd695d7f2b4c1f07279f58362d4a5.dat +0 -0
  880. data/lib/mikunyan/typetrees/bfc41466cf63095c9a89e4defeea56f5.dat +0 -0
  881. data/lib/mikunyan/typetrees/c097c2178bc05715274a8513f32f5e2d.dat +0 -0
  882. data/lib/mikunyan/typetrees/c135fdff1ecf351ff2968c0c575a93fc.dat +0 -0
  883. data/lib/mikunyan/typetrees/c184743520186f546000de20f4d19736.dat +0 -0
  884. data/lib/mikunyan/typetrees/c1bd7854033214a22ac0e141089fbb2d.dat +0 -0
  885. data/lib/mikunyan/typetrees/c1e394cb8e3b83562307194fb6d429af.dat +0 -0
  886. data/lib/mikunyan/typetrees/c2c15e3018e440dfbc88ab67b75f4c1d.dat +0 -0
  887. data/lib/mikunyan/typetrees/c2ca897ba3f0d195562afbc35c837335.dat +0 -0
  888. data/lib/mikunyan/typetrees/c31b92b7eee9c5c57313fb562eba9dc2.dat +0 -0
  889. data/lib/mikunyan/typetrees/c3a49c5484231f188d2dbf0ce906983e.dat +0 -0
  890. data/lib/mikunyan/typetrees/c3a8bc8f5809ef66c48301555ad887c9.dat +0 -0
  891. data/lib/mikunyan/typetrees/c3bd45c36189c3769b3605e3e68074b6.dat +0 -0
  892. data/lib/mikunyan/typetrees/c3d60ce6816f9ca79e378c42fa1dce89.dat +0 -0
  893. data/lib/mikunyan/typetrees/c40f47d114996fd5b6fcad6dccf63698.dat +0 -0
  894. data/lib/mikunyan/typetrees/c42229e0ac25eba7b65d00c6bf5a14c4.dat +0 -0
  895. data/lib/mikunyan/typetrees/c45f92b4ac045c96d0360b5f6a3b1dc4.dat +0 -0
  896. data/lib/mikunyan/typetrees/c4aa8047d41bec5b2fa0fafd4d334064.dat +0 -0
  897. data/lib/mikunyan/typetrees/c4c62993971a4c233bae8f8954b4509c.dat +0 -0
  898. data/lib/mikunyan/typetrees/c545e03ac5b8e05354a606a32d652451.dat +0 -0
  899. data/lib/mikunyan/typetrees/c58ca61dd3a7ba754ce32006f4824d1c.dat +0 -0
  900. data/lib/mikunyan/typetrees/c593e13a55803ee78c43e19ed6675bcb.dat +0 -0
  901. data/lib/mikunyan/typetrees/c63da93518d9d5df594b4099f3e01567.dat +0 -0
  902. data/lib/mikunyan/typetrees/c65c019fd81d3915b9a3c8051b15953f.dat +0 -0
  903. data/lib/mikunyan/typetrees/c714531f729b9151841641b4bdd70994.dat +0 -0
  904. data/lib/mikunyan/typetrees/c8300105c5f2c3f44c2e11603f5ed908.dat +0 -0
  905. data/lib/mikunyan/typetrees/c838052a240cb84f4f6e2439f5bbdc53.dat +0 -0
  906. data/lib/mikunyan/typetrees/c91cee33fcf7382fead17e755bd7d40c.dat +0 -0
  907. data/lib/mikunyan/typetrees/c9531c7582f449d66888b906ac3c1d52.dat +0 -0
  908. data/lib/mikunyan/typetrees/c963ff70381de0acb5457051e36286c3.dat +0 -0
  909. data/lib/mikunyan/typetrees/c96a64061d3e391b7f3309bd4a644969.dat +0 -0
  910. data/lib/mikunyan/typetrees/ca2b42eb4ee5875caf48adf3239dd23b.dat +0 -0
  911. data/lib/mikunyan/typetrees/caeb4cbab1b7b97f81befe2c8e3f8f3f.dat +0 -0
  912. data/lib/mikunyan/typetrees/cb2bfcd356194433b46de145d0dfc4d8.dat +0 -0
  913. data/lib/mikunyan/typetrees/cb419960ac03a9307354fbf2ad2bda01.dat +0 -0
  914. data/lib/mikunyan/typetrees/cba283a78b20bbd9f0dd18c977b69d8e.dat +0 -0
  915. data/lib/mikunyan/typetrees/cbd196f0addd9143d0c36315c3c00349.dat +0 -0
  916. data/lib/mikunyan/typetrees/cbd6b8b86e0d05798e704eb7c8fff126.dat +0 -0
  917. data/lib/mikunyan/typetrees/cc38b2aee76814e979699396b0a1cfdf.dat +0 -0
  918. data/lib/mikunyan/typetrees/cc8f6e05143e049494c7eac0553f3883.dat +0 -0
  919. data/lib/mikunyan/typetrees/ccafc28ff2fb62c0cdf1694dddad079b.dat +0 -0
  920. data/lib/mikunyan/typetrees/ccd083c7c396a7a74c669ea21372897b.dat +0 -0
  921. data/lib/mikunyan/typetrees/cd04f39396ad93511bc1502e8e00ebb4.dat +0 -0
  922. data/lib/mikunyan/typetrees/cd0b1e6d795a4dc2b94ed471a625657e.dat +0 -0
  923. data/lib/mikunyan/typetrees/cd1cec16765c251d9e919147cf6d75c7.dat +0 -0
  924. data/lib/mikunyan/typetrees/cd299f8158c5d24d299bc2279a86222d.dat +0 -0
  925. data/lib/mikunyan/typetrees/cd3b5a93c404b34df1fac33b45db8014.dat +0 -0
  926. data/lib/mikunyan/typetrees/cd7036db3b0bbff750fff707bdce6daf.dat +0 -0
  927. data/lib/mikunyan/typetrees/cdecd039c577a343625b366d85a65f6b.dat +0 -0
  928. data/lib/mikunyan/typetrees/cdf9eaa879b1eb8edb28e8d7fa3781ce.dat +0 -0
  929. data/lib/mikunyan/typetrees/ce791e8dc4d4746cf247a6ac354e6f3e.dat +0 -0
  930. data/lib/mikunyan/typetrees/ce9c15fa0aa98a21872deef3bb0abf34.dat +0 -0
  931. data/lib/mikunyan/typetrees/ceb5d2c8db7960822dc7d09aa88560e9.dat +0 -0
  932. data/lib/mikunyan/typetrees/cf068435a0d00c8aed4a68588d17d84d.dat +0 -0
  933. data/lib/mikunyan/typetrees/cfcb6a2bde1d6c4a4d79aeda69a03c07.dat +0 -0
  934. data/lib/mikunyan/typetrees/cfcf0bf1fa4aa6ec8af172c71511c4c5.dat +0 -0
  935. data/lib/mikunyan/typetrees/d09ffdff0a7e59357e132c6ae6fbc684.dat +0 -0
  936. data/lib/mikunyan/typetrees/d0c0ea0c6027a67ea3393d78532a38fb.dat +0 -0
  937. data/lib/mikunyan/typetrees/d19c5b14d3d7fe6cdbba6b28f26bc5f4.dat +0 -0
  938. data/lib/mikunyan/typetrees/d1e5ac65e1fefbcda6d8529c7ccda50b.dat +0 -0
  939. data/lib/mikunyan/typetrees/d2235066094fe1c59efb053510588202.dat +0 -0
  940. data/lib/mikunyan/typetrees/d2e60ea70fea8a46f75f8a0b79e37085.dat +0 -0
  941. data/lib/mikunyan/typetrees/d327ffd20422395c6d4d0c7a2c64a4a4.dat +0 -0
  942. data/lib/mikunyan/typetrees/d34b5033c863b49dfd4099d9f3e33fe3.dat +0 -0
  943. data/lib/mikunyan/typetrees/d3e0b0fbe2d0a17d3800a352918ab265.dat +0 -0
  944. data/lib/mikunyan/typetrees/d463e5d17a1b3f4e2e2f1eb758afc38e.dat +0 -0
  945. data/lib/mikunyan/typetrees/d49ddfcb81983289b99cecbffd99d8d2.dat +0 -0
  946. data/lib/mikunyan/typetrees/d4e580aaf357b26f4871f454ab582ad2.dat +0 -0
  947. data/lib/mikunyan/typetrees/d50ed13362e98df8096b2f735131fce5.dat +0 -0
  948. data/lib/mikunyan/typetrees/d5b7bfdef1a7f9dcf49d5de2c66fb8fd.dat +0 -0
  949. data/lib/mikunyan/typetrees/d5d86f79c1252a3e0a705f20245b62b8.dat +0 -0
  950. data/lib/mikunyan/typetrees/d5e4d09396f117b44668f6c8641951fc.dat +0 -0
  951. data/lib/mikunyan/typetrees/d618295bd5f15441b5b80b1f57e92d09.dat +0 -0
  952. data/lib/mikunyan/typetrees/d624d87c75f079cf5797d57ac192e10d.dat +0 -0
  953. data/lib/mikunyan/typetrees/d666be4e5ffab140996a508b8f06b603.dat +0 -0
  954. data/lib/mikunyan/typetrees/d677ef142571961a07528e617aae530a.dat +0 -0
  955. data/lib/mikunyan/typetrees/d67a1e2b0bd2c0b45c1a642fa73fd86e.dat +0 -0
  956. data/lib/mikunyan/typetrees/d6b5627bef78f5332bb56ae8c96f34ab.dat +0 -0
  957. data/lib/mikunyan/typetrees/d6d471fc0db035cd0defecbfa79a4e28.dat +0 -0
  958. data/lib/mikunyan/typetrees/d77f09bf46daff2b01a707c22fcbc7ce.dat +0 -0
  959. data/lib/mikunyan/typetrees/d7aa5e4b473e8db1304692781a1f3b36.dat +0 -0
  960. data/lib/mikunyan/typetrees/d7beb51f676a59524f08312b07fa50f7.dat +0 -0
  961. data/lib/mikunyan/typetrees/d8082d7a3661a3f9ca00a93a61606585.dat +0 -0
  962. data/lib/mikunyan/typetrees/d8129cfedf80a401fc1b3ce0483b6193.dat +0 -0
  963. data/lib/mikunyan/typetrees/d819fe24897f62ed37bcd142f64cec80.dat +0 -0
  964. data/lib/mikunyan/typetrees/d82c324c1e384bdc4d7aabbdbf8dd810.dat +0 -0
  965. data/lib/mikunyan/typetrees/d871346d990bbc294d02f4c366bf1b6d.dat +0 -0
  966. data/lib/mikunyan/typetrees/d898fab65c5d063bc9112924123b5a04.dat +0 -0
  967. data/lib/mikunyan/typetrees/d8e8eeb43589ccd7019398e56f6c16b0.dat +0 -0
  968. data/lib/mikunyan/typetrees/d8f1b25bf145804bd41da2d64684d605.dat +0 -0
  969. data/lib/mikunyan/typetrees/d9333d68827fe2bdc8fa96fe1ce7999e.dat +0 -0
  970. data/lib/mikunyan/typetrees/d9b4fdc987ccf6d8f51cad51e0c670c6.dat +0 -0
  971. data/lib/mikunyan/typetrees/d9b73d39e28f3c5a204fa213d75eaea7.dat +0 -0
  972. data/lib/mikunyan/typetrees/da0763bf72eacb89ecd40739beb1ba31.dat +0 -0
  973. data/lib/mikunyan/typetrees/da3150094bf1eec8e02a26c939a77d05.dat +0 -0
  974. data/lib/mikunyan/typetrees/da594265aaa32ec1513c20e38a22fa2e.dat +0 -0
  975. data/lib/mikunyan/typetrees/da773af1b759eb7b7e78287900688f5d.dat +0 -0
  976. data/lib/mikunyan/typetrees/dad240b3d990c591b278699ec10e2713.dat +0 -0
  977. data/lib/mikunyan/typetrees/daea1bb1bba6613afb2cb001ca8fa0d4.dat +0 -0
  978. data/lib/mikunyan/typetrees/dafc7f89ba2f5601cd2526021334cfcd.dat +0 -0
  979. data/lib/mikunyan/typetrees/db088f9c2f2224da9f488879467856e5.dat +0 -0
  980. data/lib/mikunyan/typetrees/db262b9303bf96c55e2659bd9160e777.dat +0 -0
  981. data/lib/mikunyan/typetrees/db26e3ff617afe3cca8a02d00552384e.dat +0 -0
  982. data/lib/mikunyan/typetrees/dbc0e1ec44a805978e86400d908d4d5a.dat +0 -0
  983. data/lib/mikunyan/typetrees/dc20bb5dce8aed56990dd70f922fead8.dat +0 -0
  984. data/lib/mikunyan/typetrees/dc400e4ff2bb2f6cdca60904df0222f2.dat +0 -0
  985. data/lib/mikunyan/typetrees/dca16d4c10b4556ce0e9c6c86477b440.dat +0 -0
  986. data/lib/mikunyan/typetrees/dca74f64d0c6c5f509f6c2ce5004d66c.dat +0 -0
  987. data/lib/mikunyan/typetrees/dcc6d28c8eb43df915f267cc86333b22.dat +0 -0
  988. data/lib/mikunyan/typetrees/dccb16892b1b29f371d169ba3aadeb12.dat +0 -0
  989. data/lib/mikunyan/typetrees/dd60b1a6007dbd03008831cfd65e8022.dat +0 -0
  990. data/lib/mikunyan/typetrees/dd7e75f0d9d8a22fbe5235e6a80fc5ea.dat +0 -0
  991. data/lib/mikunyan/typetrees/dd8a8dc899d108bd73ea860b3c7b4b15.dat +0 -0
  992. data/lib/mikunyan/typetrees/ddb7ea81de202d2cefc209032a964347.dat +0 -0
  993. data/lib/mikunyan/typetrees/de60f732e8b03f6e641f80eccb420cce.dat +0 -0
  994. data/lib/mikunyan/typetrees/de8a0e72e5ae4d3290885d747ee2f795.dat +0 -0
  995. data/lib/mikunyan/typetrees/dedb7920e007cccc3ca975508f6311cd.dat +0 -0
  996. data/lib/mikunyan/typetrees/df01f78f4cb2cbed36b07db19999441e.dat +0 -0
  997. data/lib/mikunyan/typetrees/df2881fda3119da4394887df7b8e88de.dat +0 -0
  998. data/lib/mikunyan/typetrees/df50c70d41d6f24fa723847c2c7407f6.dat +0 -0
  999. data/lib/mikunyan/typetrees/df54f5406f3668f71b1ece65e3d4562f.dat +0 -0
  1000. data/lib/mikunyan/typetrees/dfccf24e87b7a76d31300cfce8a0c8c3.dat +0 -0
  1001. data/lib/mikunyan/typetrees/dff9668a0370d6e3f16d48d636add5bf.dat +0 -0
  1002. data/lib/mikunyan/typetrees/e03bc577acb91ed2706fbeb58f51241a.dat +0 -0
  1003. data/lib/mikunyan/typetrees/e0cc825cdb14661932d6c4bf8eeb597a.dat +0 -0
  1004. data/lib/mikunyan/typetrees/e0da148901d81b94249c67d75de59cc6.dat +0 -0
  1005. data/lib/mikunyan/typetrees/e13585c1bbc23c440db580ed3d0362dd.dat +0 -0
  1006. data/lib/mikunyan/typetrees/e1931794ed428aa347fe3d987a8b5e6d.dat +0 -0
  1007. data/lib/mikunyan/typetrees/e1e986a1b885972b1ff7b6905a2afbea.dat +0 -0
  1008. data/lib/mikunyan/typetrees/e232e87951beb0fc3097191cb5aa968f.dat +0 -0
  1009. data/lib/mikunyan/typetrees/e241f28178d3e724ea66416e5fe2736e.dat +0 -0
  1010. data/lib/mikunyan/typetrees/e28c7475d2cb1a19cc7d210255f13d9a.dat +0 -0
  1011. data/lib/mikunyan/typetrees/e28e40019ee35b908e56695a08f3c2dd.dat +0 -0
  1012. data/lib/mikunyan/typetrees/e2dc296f9670fe78e3841d5fb16526f9.dat +0 -0
  1013. data/lib/mikunyan/typetrees/e35dc2334427143c92b135fe05dc7499.dat +0 -0
  1014. data/lib/mikunyan/typetrees/e4184d1639fc6d9a8101b66019fdb80b.dat +0 -0
  1015. data/lib/mikunyan/typetrees/e42d5322b636717b1e982e6b9c08157e.dat +0 -0
  1016. data/lib/mikunyan/typetrees/e4de96c0565383286459bb71ac3d4b85.dat +0 -0
  1017. data/lib/mikunyan/typetrees/e5c6784d6aabe45f9896a4e094d5d72d.dat +0 -0
  1018. data/lib/mikunyan/typetrees/e5f032f87a6e3b55a01f41073c64f14c.dat +0 -0
  1019. data/lib/mikunyan/typetrees/e5f31cd4b52fedfd9e332593b92efbf2.dat +0 -0
  1020. data/lib/mikunyan/typetrees/e605ecd82fcbccc59af10e5c18e21be0.dat +0 -0
  1021. data/lib/mikunyan/typetrees/e66580394f7a6f4e216dbea294359b03.dat +0 -0
  1022. data/lib/mikunyan/typetrees/e684e7e25dd1208ec3941c7772968ada.dat +0 -0
  1023. data/lib/mikunyan/typetrees/e6b0a13d67395893ae32d073391c98af.dat +0 -0
  1024. data/lib/mikunyan/typetrees/e6ccb0d2545a8b68470d8d4d75d1f393.dat +0 -0
  1025. data/lib/mikunyan/typetrees/e70da99ccfbec08ec2d115a9f0ef2fd5.dat +0 -0
  1026. data/lib/mikunyan/typetrees/e7920ac1d49d79dc3f687686799e0ecb.dat +0 -0
  1027. data/lib/mikunyan/typetrees/e7c5c01b0369574e9346ce846e1e8e63.dat +0 -0
  1028. data/lib/mikunyan/typetrees/e81731c627c30de466ff682b23d7c632.dat +0 -0
  1029. data/lib/mikunyan/typetrees/e82f8100e40450d13763382e74934faa.dat +0 -0
  1030. data/lib/mikunyan/typetrees/e8745221bf0bd118c59f77acbe2de613.dat +0 -0
  1031. data/lib/mikunyan/typetrees/e8dfd8445172115d9ccd6f118c1beaef.dat +0 -0
  1032. data/lib/mikunyan/typetrees/e913b190fb6ca58cd5cbb51754561bd1.dat +0 -0
  1033. data/lib/mikunyan/typetrees/e91d61574d8fb627100d63a6ad9bfcab.dat +0 -0
  1034. data/lib/mikunyan/typetrees/e95f93e7dffba80b23fbc5b44496b51e.dat +0 -0
  1035. data/lib/mikunyan/typetrees/e96e85f943700fbdb57bb61d19aa730d.dat +0 -0
  1036. data/lib/mikunyan/typetrees/e9c3c929e25ebe9de9505392a9426ec4.dat +0 -0
  1037. data/lib/mikunyan/typetrees/e9f83061bf74a880b666d0539803c172.dat +0 -0
  1038. data/lib/mikunyan/typetrees/ea9335449f130234d8486da657354acd.dat +0 -0
  1039. data/lib/mikunyan/typetrees/eaf04b5cbffbbebfe7fe8a866f5ed3e3.dat +0 -0
  1040. data/lib/mikunyan/typetrees/eb2806c128b82c691ff963bc0fa37038.dat +0 -0
  1041. data/lib/mikunyan/typetrees/eb4711bbcbb00a279d29cd0cb734f6f1.dat +0 -0
  1042. data/lib/mikunyan/typetrees/eb4bb38a272b5d85f159bc696932c343.dat +0 -0
  1043. data/lib/mikunyan/typetrees/eb5cf6f66af0538b78f704b634162faa.dat +0 -0
  1044. data/lib/mikunyan/typetrees/eb5e2816cebf56985ba81ee03349f325.dat +0 -0
  1045. data/lib/mikunyan/typetrees/eb86f10c75a157897597106e42951b00.dat +0 -0
  1046. data/lib/mikunyan/typetrees/eba8e3a474fde830eedf44a13f03493b.dat +0 -0
  1047. data/lib/mikunyan/typetrees/ebc5a7a5411c30dea91bd80b1fcb71dd.dat +0 -0
  1048. data/lib/mikunyan/typetrees/ebd4d04d411da3b590de51463d7584f6.dat +0 -0
  1049. data/lib/mikunyan/typetrees/ec25d4a542c858ee7230bd1ff1768977.dat +0 -0
  1050. data/lib/mikunyan/typetrees/ec6c2973d8ad71bc666598added919e2.dat +0 -0
  1051. data/lib/mikunyan/typetrees/eca5aeef2c82a4fdf70258dadca6323a.dat +0 -0
  1052. data/lib/mikunyan/typetrees/ed16c17652451d76127c1d415347ed23.dat +0 -0
  1053. data/lib/mikunyan/typetrees/ed679b72116efeb79d041d5e3dee85ca.dat +0 -0
  1054. data/lib/mikunyan/typetrees/ed76a79b75aebeb69ee5ad327b2c26d5.dat +0 -0
  1055. data/lib/mikunyan/typetrees/ee8f51d166e4c36c87fa7528d9466862.dat +0 -0
  1056. data/lib/mikunyan/typetrees/eebf7a0e1e861754c32f9d1e60da7441.dat +0 -0
  1057. data/lib/mikunyan/typetrees/eef9fa4e8d272cd355b412791b976ddc.dat +0 -0
  1058. data/lib/mikunyan/typetrees/ef03a9a9742d133cf3384f086e38d520.dat +0 -0
  1059. data/lib/mikunyan/typetrees/ef442cab6e5b2a46e824bfc89123f18d.dat +0 -0
  1060. data/lib/mikunyan/typetrees/f096c494641d018027771df703dae7e6.dat +0 -0
  1061. data/lib/mikunyan/typetrees/f0b195f17349096039608cb289e89556.dat +0 -0
  1062. data/lib/mikunyan/typetrees/f0c6a3bed58042425e17e3588613bb51.dat +0 -0
  1063. data/lib/mikunyan/typetrees/f0dca30b01b82a4ab96277658e0d881b.dat +0 -0
  1064. data/lib/mikunyan/typetrees/f0e0e320fc2816897ac3195551d8e4c5.dat +0 -0
  1065. data/lib/mikunyan/typetrees/f0e3106a5e7d38edfe031abc0c11ce2a.dat +0 -0
  1066. data/lib/mikunyan/typetrees/f123b055a61dfa7dc679d78cdaecd383.dat +0 -0
  1067. data/lib/mikunyan/typetrees/f18647acbd67659ea3f45a97872f757b.dat +0 -0
  1068. data/lib/mikunyan/typetrees/f1d3f171c0a6aa755d45ffe681516b65.dat +0 -0
  1069. data/lib/mikunyan/typetrees/f2357d4424504d3797409ff6565e8e68.dat +0 -0
  1070. data/lib/mikunyan/typetrees/f262f66cbdb4e8ec53bc0c21902fff33.dat +0 -0
  1071. data/lib/mikunyan/typetrees/f26318c9a762d9dfe2990bc5c55b5210.dat +0 -0
  1072. data/lib/mikunyan/typetrees/f284abb6f2df17ebedae2b6b50436810.dat +0 -0
  1073. data/lib/mikunyan/typetrees/f2962bad2e61ec5e86287cfa284af6b4.dat +0 -0
  1074. data/lib/mikunyan/typetrees/f2f0f99209263f27fcf761c6c20c5f2a.dat +0 -0
  1075. data/lib/mikunyan/typetrees/f334a53f9a22db7ab446d9e59e60e53f.dat +0 -0
  1076. data/lib/mikunyan/typetrees/f3998c4215bd94309ae5a56c52838094.dat +0 -0
  1077. data/lib/mikunyan/typetrees/f42ed84d2873663c47f7c18efd8435c2.dat +0 -0
  1078. data/lib/mikunyan/typetrees/f46f884b442e214dc17a8df302020320.dat +0 -0
  1079. data/lib/mikunyan/typetrees/f532b7426ff24ff9247beee7720e3f42.dat +0 -0
  1080. data/lib/mikunyan/typetrees/f54f7f1d24fb230b26b5fcfdf259cbe5.dat +0 -0
  1081. data/lib/mikunyan/typetrees/f560c0e71bafc0222f509e6af590fed6.dat +0 -0
  1082. data/lib/mikunyan/typetrees/f5b27e405af2e548e271d0f29a4fc21c.dat +0 -0
  1083. data/lib/mikunyan/typetrees/f5b5fea04cce293cc62cf0f76ec5de49.dat +0 -0
  1084. data/lib/mikunyan/typetrees/f5b73814acb8f989f4895cdcf9e3adfe.dat +0 -0
  1085. data/lib/mikunyan/typetrees/f615a0c0f5849665cedca12a8fd64020.dat +0 -0
  1086. data/lib/mikunyan/typetrees/f628e2d5cd5f7460380920e45b6a9266.dat +0 -0
  1087. data/lib/mikunyan/typetrees/f6718cde49aeab7f67aefb7da858bbab.dat +0 -0
  1088. data/lib/mikunyan/typetrees/f6ac78e7f50065f7c64f720fdeaa9390.dat +0 -0
  1089. data/lib/mikunyan/typetrees/f6cd0e46d404dd7cbd7ad89ae2a4d7a9.dat +0 -0
  1090. data/lib/mikunyan/typetrees/f7ea57efda613d6963a53144446638cf.dat +0 -0
  1091. data/lib/mikunyan/typetrees/f7f1afe8ae04ddc34d023a09ed279e8d.dat +0 -0
  1092. data/lib/mikunyan/typetrees/f811a923135bc4ee86dd31237b2ab06a.dat +0 -0
  1093. data/lib/mikunyan/typetrees/f8377d7fe2ca5564e137d9f82a5b7fe5.dat +0 -0
  1094. data/lib/mikunyan/typetrees/f83f9a801dfbac3b28bcee57ff29182f.dat +0 -0
  1095. data/lib/mikunyan/typetrees/f92d618c5266ea3a8ca770b6eca728c8.dat +0 -0
  1096. data/lib/mikunyan/typetrees/f983b0102ccb04ded5fd745943e862be.dat +0 -0
  1097. data/lib/mikunyan/typetrees/f9a5bbb8c5391b4f94fc32542ab1f981.dat +0 -0
  1098. data/lib/mikunyan/typetrees/faa71a41455d0e928529ff5b0b036af3.dat +0 -0
  1099. data/lib/mikunyan/typetrees/fab5d0fd4c471ada3931c6ec7cf983ec.dat +0 -0
  1100. data/lib/mikunyan/typetrees/fab9ae76e42df0fda7b88a0b103ac202.dat +0 -0
  1101. data/lib/mikunyan/typetrees/face58ace35dbc4d23883cc9f9625a4f.dat +0 -0
  1102. data/lib/mikunyan/typetrees/fad2d0a58e9174708176102b418facf1.dat +0 -0
  1103. data/lib/mikunyan/typetrees/faf23bf08eb2a9759598748b2ed55c7a.dat +0 -0
  1104. data/lib/mikunyan/typetrees/fb0635f60817266fc2448281f0e1bf8e.dat +0 -0
  1105. data/lib/mikunyan/typetrees/fb734904d47701a0f2042181d6018c2f.dat +0 -0
  1106. data/lib/mikunyan/typetrees/fbc6f8d82d3c39fe76174186e3b47e3b.dat +0 -0
  1107. data/lib/mikunyan/typetrees/fbf6b031c32e461ee61be429e5fee7eb.dat +0 -0
  1108. data/lib/mikunyan/typetrees/fc3125dbdb8e1f0607d135c1ae3414cb.dat +0 -0
  1109. data/lib/mikunyan/typetrees/fc4d5e15f8c386c584aba84f72df32a6.dat +0 -0
  1110. data/lib/mikunyan/typetrees/fccd9eb5f018e78d8dca6e9a2b63d656.dat +0 -0
  1111. data/lib/mikunyan/typetrees/fcd09d1b65ada0699f1ee9ef752d98bb.dat +0 -0
  1112. data/lib/mikunyan/typetrees/fce816c697c05580074a53812ffb4d26.dat +0 -0
  1113. data/lib/mikunyan/typetrees/fcf3c3ff8300095cad677c7d6fcad3c1.dat +0 -0
  1114. data/lib/mikunyan/typetrees/fd27a2cde103557bda73e902a622cd9d.dat +0 -0
  1115. data/lib/mikunyan/typetrees/fd6f5cd3c75d7a3b4be7ca15f4d7ae9e.dat +0 -0
  1116. data/lib/mikunyan/typetrees/fd961e9e4f3f3e5a32d3a30299105968.dat +0 -0
  1117. data/lib/mikunyan/typetrees/fdd42e830fb415af977c2b2222b5d948.dat +0 -0
  1118. data/lib/mikunyan/typetrees/fe0412c56eaa9e664d20b9ae98864e48.dat +0 -0
  1119. data/lib/mikunyan/typetrees/fe3443710f1e93ed0fdb39a499dcad2e.dat +0 -0
  1120. data/lib/mikunyan/typetrees/fe69769eea751f4dae4470a2d2a4f033.dat +0 -0
  1121. data/lib/mikunyan/typetrees/fe94ca842ca0f4d66581e7d021fc5445.dat +0 -0
  1122. data/lib/mikunyan/typetrees/feb462635cb14d7fc886781f76647359.dat +0 -0
  1123. data/lib/mikunyan/typetrees/febce05d662e846d44276cb3ead554a9.dat +0 -0
  1124. data/lib/mikunyan/typetrees/fefc3f27b196eb018086c22cba376f75.dat +0 -0
  1125. data/lib/mikunyan/typetrees/ff001a2e51937aa5add9eaf9cd3d8ae4.dat +0 -0
  1126. data/lib/mikunyan/typetrees/ff382d6c2780a3e68481688cce904104.dat +0 -0
  1127. data/lib/mikunyan/typetrees/ff3a8cf3da343f8722464c416e3479ee.dat +0 -0
  1128. data/lib/mikunyan/typetrees/ff8fa01e9243c910f7d7301b7586a1b1.dat +0 -0
  1129. data/lib/mikunyan/typetrees/ffdc51773b4c4ce79ff982449bbbabff.dat +0 -0
  1130. data/lib/mikunyan/typetrees/ffe1577ae998664adc2a48d23e3af64e.dat +0 -0
data/exe/mikunyan-json CHANGED
@@ -1,84 +1,70 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
2
4
  require 'mikunyan'
3
5
  require 'base64'
4
6
 
5
7
  def obj64(obj)
6
- if obj.class == Hash
7
- obj.map{|k, v| [k, obj64(v)]}.to_h
8
- elsif obj.class == Array
9
- obj.map{|e| obj64(e)}
10
- elsif obj.class == String
11
- if obj.encoding == Encoding::UTF_8
12
- obj
13
- else
14
- Base64::strict_encode64(obj)
15
- end
8
+ if obj.is_a?(Hash)
9
+ obj.map{|k, v| [k, obj64(v)]}.to_h
10
+ elsif obj.is_a?(Array)
11
+ obj.map{|e| obj64(e)}
12
+ elsif obj.is_a?(String)
13
+ if obj.encoding == Encoding::UTF_8
14
+ obj
16
15
  else
17
- obj
16
+ Base64.strict_encode64(obj)
18
17
  end
18
+ else
19
+ obj
20
+ end
19
21
  end
20
22
 
21
- opts = {:as_asset => false, :pretty => false, :yaml => false}
23
+ opts = { as_asset: false, pretty: false, yaml: false }
22
24
  arg = nil
23
25
  i = 0
24
26
  while i < ARGV.count
25
- if ARGV[i].start_with?('-')
26
- case ARGV[i]
27
- when '--as-asset', '-a'
28
- opts[:as_asset] = true
29
- when '--pretty', '-p'
30
- opts[:pretty] = true
31
- when '--yaml', '-y'
32
- opts[:yaml] = true
33
- else
34
- warn("Unknown option: #{ARGV[i]}")
35
- end
27
+ if ARGV[i].start_with?('-')
28
+ case ARGV[i]
29
+ when '--as-asset', '-a'
30
+ opts[:as_asset] = true
31
+ when '--pretty', '-p'
32
+ opts[:pretty] = true
33
+ when '--yaml', '-y'
34
+ opts[:yaml] = true
36
35
  else
37
- arg = ARGV[i] unless arg
36
+ warn("Unknown option: #{ARGV[i]}")
38
37
  end
39
- i += 1
38
+ else
39
+ arg ||= ARGV[i]
40
+ end
41
+ i += 1
40
42
  end
41
43
 
42
- if opts[:pretty] && opts[:yaml]
43
- warn("Option --pretty is ignored if --yaml is specified.")
44
- end
44
+ warn('Option --pretty is ignored if --yaml is specified.') if opts[:pretty] && opts[:yaml]
45
45
 
46
46
  unless File.file?(arg)
47
- warn("File not found: #{arg}")
48
- exit(1)
47
+ warn("File not found: #{arg}")
48
+ exit(1)
49
49
  end
50
50
 
51
- assets = {}
52
-
53
- if opts[:as_asset]
54
- asset = Mikunyan::Asset.file(arg, arg.match(/([^\/]*?)(\.[^.]*)?\z/)[1])
55
- objs = []
56
- asset.path_ids.each do |e|
57
- obj = asset.parse_object_simple(e)
58
- objs << obj
59
- end
60
- assets[asset.name] = objs
61
- else
62
- bundle = Mikunyan::AssetBundle.file(arg)
63
- bundle.assets.each do |asset|
64
- objs = []
65
- asset.path_ids.each do |e|
66
- obj = asset.parse_object_simple(e)
67
- objs << obj
68
- end
69
- assets[asset.name] = objs
70
- end
71
- end
51
+ assets = opts[:as_asset] ? [Mikunyan::Asset.file(arg)] : Mikunyan::AssetBundle.file(arg).assets
52
+ assets = assets.map{|asset| [asset.name, asset.each_object.map(&:parse_simple)]}.to_h
72
53
 
73
54
  if opts[:yaml]
74
- require 'yaml'
75
- puts YAML.dump(assets)
55
+ require 'yaml'
56
+ puts YAML.dump(assets)
76
57
  else
58
+ begin
59
+ require 'usamin'
60
+ require 'usamin/overwrite'
61
+ rescue LoadError
77
62
  require 'json'
78
- assets = assets.map{|k, v| [k, obj64(v)]}.to_h
79
- if opts[:pretty]
80
- puts JSON.pretty_generate(assets)
81
- else
82
- puts JSON.generate(assets)
83
- end
63
+ end
64
+ assets = assets.map{|k, v| [k, obj64(v)]}.to_h
65
+ if opts[:pretty]
66
+ puts JSON.pretty_generate(assets)
67
+ else
68
+ puts JSON.generate(assets)
69
+ end
84
70
  end
@@ -0,0 +1,3826 @@
1
+ // File: crn_decomp.h - Fast CRN->DXTc texture transcoder header file library
2
+ // Copyright (c) 2010-2016 Richard Geldreich, Jr. and Binomial LLC
3
+ // See Copyright Notice and license at the end of this file.
4
+ //
5
+ // This single header file contains *all* of the code necessary to unpack .CRN files to raw DXTn bits.
6
+ // It does NOT depend on the crn compression library.
7
+ //
8
+ // Note: This is a single file, stand-alone C++ library which is controlled by the use of the following macro:
9
+ // If CRND_INCLUDE_CRND_H is NOT defined, the header is included.
10
+ //
11
+ // Important: If compiling with gcc, be sure strict aliasing is disabled: -fno-strict-aliasing
12
+ #ifndef CRND_INCLUDE_CRND_H
13
+ #define CRND_INCLUDE_CRND_H
14
+
15
+ // Include crn_defs.h (only to bring in some basic CRN-related types and structures).
16
+ #include "crn_defs.h"
17
+
18
+ #include <cstdlib>
19
+ #include <cstdio>
20
+ #ifdef WIN32
21
+ #include <memory.h>
22
+ #elif defined(__APPLE__)
23
+ #include <malloc/malloc.h>
24
+ #define malloc_usable_size malloc_size
25
+ #elif defined(__FreeBSD__)
26
+ #include <malloc_np.h>
27
+ #else
28
+ #include <malloc.h>
29
+ #endif
30
+ #include <cstdarg>
31
+ #include <new> // needed for placement new, _msize, _expand
32
+
33
+ #define CRND_RESTRICT __restrict
34
+
35
+ #ifdef _MSC_VER
36
+ #pragma warning(disable : 4127) // warning C4127: conditional expression is constant
37
+ #endif
38
+
39
+ #ifdef CRND_DEVEL
40
+ #ifndef _WIN32_WINNT
41
+ #define _WIN32_WINNT 0x500
42
+ #endif
43
+ #ifndef WIN32_LEAN_AND_MEAN
44
+ #define WIN32_LEAN_AND_MEAN
45
+ #endif
46
+ #ifndef
47
+ #define NOMINMAX
48
+ #endif
49
+ #include "windows.h" // only for IsDebuggerPresent(), DebugBreak(), and OutputDebugStringA()
50
+ #endif
51
+
52
+ // File: crnd_types.h
53
+ namespace crnd {
54
+ const crn_uint8 cUINT8_MIN = 0;
55
+ const crn_uint8 cUINT8_MAX = 0xFFU;
56
+ const uint16 cUINT16_MIN = 0;
57
+ const uint16 cUINT16_MAX = 0xFFFFU;
58
+ const uint32 cUINT32_MIN = 0;
59
+ const uint32 cUINT32_MAX = 0xFFFFFFFFU;
60
+
61
+ const int8 cINT8_MIN = -128;
62
+ const int8 cINT8_MAX = 127;
63
+ const int16 cINT16_MIN = -32768;
64
+ const int16 cINT16_MAX = 32767;
65
+ const int32 cINT32_MIN = (-2147483647 - 1);
66
+ const int32 cINT32_MAX = 2147483647;
67
+
68
+ enum eClear { cClear };
69
+
70
+ const uint32 cIntBits = 32U;
71
+
72
+ template <typename T>
73
+ struct int_traits {
74
+ enum { cMin = crnd::cINT32_MIN,
75
+ cMax = crnd::cINT32_MAX,
76
+ cSigned = true };
77
+ };
78
+
79
+ template <>
80
+ struct int_traits<int8> {
81
+ enum { cMin = crnd::cINT8_MIN,
82
+ cMax = crnd::cINT8_MAX,
83
+ cSigned = true };
84
+ };
85
+ template <>
86
+ struct int_traits<int16> {
87
+ enum { cMin = crnd::cINT16_MIN,
88
+ cMax = crnd::cINT16_MAX,
89
+ cSigned = true };
90
+ };
91
+ template <>
92
+ struct int_traits<int32> {
93
+ enum { cMin = crnd::cINT32_MIN,
94
+ cMax = crnd::cINT32_MAX,
95
+ cSigned = true };
96
+ };
97
+
98
+ template <>
99
+ struct int_traits<uint8> {
100
+ enum { cMin = 0,
101
+ cMax = crnd::cUINT8_MAX,
102
+ cSigned = false };
103
+ };
104
+ template <>
105
+ struct int_traits<uint16> {
106
+ enum { cMin = 0,
107
+ cMax = crnd::cUINT16_MAX,
108
+ cSigned = false };
109
+ };
110
+ template <>
111
+ struct int_traits<uint32> {
112
+ enum { cMin = 0,
113
+ cMax = crnd::cUINT32_MAX,
114
+ cSigned = false };
115
+ };
116
+
117
+ struct empty_type {};
118
+
119
+ } // namespace crnd
120
+
121
+ // File: crnd_platform.h
122
+ namespace crnd {
123
+
124
+ bool crnd_is_debugger_present();
125
+ void crnd_debug_break();
126
+ void crnd_output_debug_string(const char* p);
127
+
128
+ // actually in crnd_assert.cpp
129
+ void crnd_assert(const char* pExp, const char* pFile, unsigned line);
130
+ void crnd_fail(const char* pExp, const char* pFile, unsigned line);
131
+
132
+ } // namespace crnd
133
+
134
+ // File: crnd_assert.h
135
+ namespace crnd {
136
+ void crnd_assert(const char* pExp, const char* pFile, unsigned line);
137
+
138
+ #ifdef NDEBUG
139
+ #define CRND_ASSERT(x) ((void)0)
140
+ #undef CRND_ASSERTS_ENABLED
141
+ #else
142
+ #define CRND_ASSERT(_exp) (void)((!!(_exp)) || (crnd::crnd_assert(#_exp, __FILE__, __LINE__), 0))
143
+ #define CRND_ASSERTS_ENABLED
144
+ #endif
145
+
146
+ void crnd_trace(const char* pFmt, va_list args);
147
+ void crnd_trace(const char* pFmt, ...);
148
+
149
+ } // namespace crnd
150
+
151
+ // File: crnd_helpers.h
152
+ namespace crnd {
153
+ namespace helpers {
154
+ template <typename T>
155
+ struct rel_ops {
156
+ friend bool operator!=(const T& x, const T& y) { return (!(x == y)); }
157
+ friend bool operator>(const T& x, const T& y) { return (y < x); }
158
+ friend bool operator<=(const T& x, const T& y) { return (!(y < x)); }
159
+ friend bool operator>=(const T& x, const T& y) { return (!(x < y)); }
160
+ };
161
+
162
+ template <typename T>
163
+ inline T* construct(T* p) {
164
+ return new (static_cast<void*>(p)) T;
165
+ }
166
+
167
+ template <typename T, typename U>
168
+ inline T* construct(T* p, const U& init) {
169
+ return new (static_cast<void*>(p)) T(init);
170
+ }
171
+
172
+ template <typename T>
173
+ void construct_array(T* p, uint32 n) {
174
+ T* q = p + n;
175
+ for (; p != q; ++p)
176
+ new (static_cast<void*>(p)) T;
177
+ }
178
+
179
+ template <typename T, typename U>
180
+ void construct_array(T* p, uint32 n, const U& init) {
181
+ T* q = p + n;
182
+ for (; p != q; ++p)
183
+ new (static_cast<void*>(p)) T(init);
184
+ }
185
+
186
+ template <typename T>
187
+ inline void destruct(T* p) {
188
+ p->~T();
189
+ }
190
+
191
+ template <typename T>
192
+ inline void destruct_array(T* p, uint32 n) {
193
+ T* q = p + n;
194
+ for (; p != q; ++p)
195
+ p->~T();
196
+ }
197
+
198
+ } // namespace helpers
199
+
200
+ } // namespace crnd
201
+
202
+ // File: crnd_traits.h
203
+ namespace crnd {
204
+ template <typename T>
205
+ struct scalar_type {
206
+ enum { cFlag = false };
207
+ static inline void construct(T* p) { helpers::construct(p); }
208
+ static inline void construct(T* p, const T& init) { helpers::construct(p, init); }
209
+ static inline void construct_array(T* p, uint32 n) { helpers::construct_array(p, n); }
210
+ static inline void destruct(T* p) { helpers::destruct(p); }
211
+ static inline void destruct_array(T* p, uint32 n) { helpers::destruct_array(p, n); }
212
+ };
213
+
214
+ template <typename T>
215
+ struct scalar_type<T*> {
216
+ enum { cFlag = true };
217
+ static inline void construct(T** p) { memset(p, 0, sizeof(T*)); }
218
+ static inline void construct(T** p, T* init) { *p = init; }
219
+ static inline void construct_array(T** p, uint32 n) { memset(p, 0, sizeof(T*) * n); }
220
+ static inline void destruct(T**) {}
221
+ static inline void destruct_array(T**, uint32) {}
222
+ };
223
+
224
+ #define CRND_DEFINE_BUILT_IN_TYPE(X) \
225
+ template <> \
226
+ struct scalar_type<X> { \
227
+ enum { cFlag = true }; \
228
+ static inline void construct(X* p) { memset(p, 0, sizeof(X)); } \
229
+ static inline void construct(X* p, const X& init) { memcpy(p, &init, sizeof(X)); } \
230
+ static inline void construct_array(X* p, uint32 n) { memset(p, 0, sizeof(X) * n); } \
231
+ static inline void destruct(X*) {} \
232
+ static inline void destruct_array(X*, uint32) {} \
233
+ };
234
+
235
+ CRND_DEFINE_BUILT_IN_TYPE(bool)
236
+ CRND_DEFINE_BUILT_IN_TYPE(char)
237
+ CRND_DEFINE_BUILT_IN_TYPE(unsigned char)
238
+ CRND_DEFINE_BUILT_IN_TYPE(short)
239
+ CRND_DEFINE_BUILT_IN_TYPE(unsigned short)
240
+ CRND_DEFINE_BUILT_IN_TYPE(int)
241
+ CRND_DEFINE_BUILT_IN_TYPE(unsigned int)
242
+ CRND_DEFINE_BUILT_IN_TYPE(long)
243
+ CRND_DEFINE_BUILT_IN_TYPE(unsigned long)
244
+ CRND_DEFINE_BUILT_IN_TYPE(long long)
245
+ CRND_DEFINE_BUILT_IN_TYPE(unsigned long long)
246
+ CRND_DEFINE_BUILT_IN_TYPE(float)
247
+ CRND_DEFINE_BUILT_IN_TYPE(double)
248
+ CRND_DEFINE_BUILT_IN_TYPE(long double)
249
+
250
+ #undef CRND_DEFINE_BUILT_IN_TYPE
251
+
252
+ // See: http://erdani.org/publications/cuj-2004-06.pdf
253
+
254
+ template <typename T>
255
+ struct bitwise_movable {
256
+ enum { cFlag = false };
257
+ };
258
+
259
+ // Defines type Q as bitwise movable.
260
+ #define CRND_DEFINE_BITWISE_MOVABLE(Q) \
261
+ template <> \
262
+ struct bitwise_movable<Q> { \
263
+ enum { cFlag = true }; \
264
+ };
265
+
266
+ // From yasli_traits.h:
267
+ // Credit goes to Boost;
268
+ // also found in the C++ Templates book by Vandevoorde and Josuttis
269
+
270
+ typedef char (&yes_t)[1];
271
+ typedef char (&no_t)[2];
272
+
273
+ template <class U>
274
+ yes_t class_test(int U::*);
275
+ template <class U>
276
+ no_t class_test(...);
277
+
278
+ template <class T>
279
+ struct is_class {
280
+ enum { value = (sizeof(class_test<T>(0)) == sizeof(yes_t)) };
281
+ };
282
+
283
+ template <typename T>
284
+ struct is_pointer {
285
+ enum { value = false };
286
+ };
287
+
288
+ template <typename T>
289
+ struct is_pointer<T*> {
290
+ enum { value = true };
291
+ };
292
+
293
+ #define CRND_IS_POD(T) __is_pod(T)
294
+
295
+ } // namespace crnd
296
+
297
+ // File: crnd_mem.h
298
+ namespace crnd {
299
+ void* crnd_malloc(size_t size, size_t* pActual_size = NULL);
300
+ void* crnd_realloc(void* p, size_t size, size_t* pActual_size = NULL, bool movable = true);
301
+ void crnd_free(void* p);
302
+ size_t crnd_msize(void* p);
303
+
304
+ template <typename T>
305
+ inline T* crnd_new() {
306
+ T* p = static_cast<T*>(crnd_malloc(sizeof(T)));
307
+ if (!p)
308
+ return NULL;
309
+
310
+ return helpers::construct(p);
311
+ }
312
+
313
+ template <typename T>
314
+ inline T* crnd_new(const T& init) {
315
+ T* p = static_cast<T*>(crnd_malloc(sizeof(T)));
316
+ if (!p)
317
+ return NULL;
318
+
319
+ return helpers::construct(p, init);
320
+ }
321
+
322
+ template <typename T>
323
+ inline T* crnd_new_array(uint32 num) {
324
+ if (!num)
325
+ num = 1;
326
+
327
+ uint8* q = static_cast<uint8*>(crnd_malloc(CRND_MIN_ALLOC_ALIGNMENT + sizeof(T) * num));
328
+ if (!q)
329
+ return NULL;
330
+
331
+ T* p = reinterpret_cast<T*>(q + CRND_MIN_ALLOC_ALIGNMENT);
332
+
333
+ reinterpret_cast<uint32*>(p)[-1] = num;
334
+ reinterpret_cast<uint32*>(p)[-2] = ~num;
335
+
336
+ helpers::construct_array(p, num);
337
+ return p;
338
+ }
339
+
340
+ template <typename T>
341
+ inline void crnd_delete(T* p) {
342
+ if (p) {
343
+ helpers::destruct(p);
344
+ crnd_free(p);
345
+ }
346
+ }
347
+
348
+ template <typename T>
349
+ inline void crnd_delete_array(T* p) {
350
+ if (p) {
351
+ const uint32 num = reinterpret_cast<uint32*>(p)[-1];
352
+ CRND_ASSERT(num && (num == ~reinterpret_cast<uint32*>(p)[-2]));
353
+
354
+ helpers::destruct_array(p, num);
355
+
356
+ crnd_free(reinterpret_cast<uint8*>(p) - CRND_MIN_ALLOC_ALIGNMENT);
357
+ }
358
+ }
359
+
360
+ } // namespace crnd
361
+
362
+ // File: crnd_math.h
363
+ namespace crnd {
364
+ namespace math {
365
+ const float cNearlyInfinite = 1.0e+37f;
366
+
367
+ const float cDegToRad = 0.01745329252f;
368
+ const float cRadToDeg = 57.29577951f;
369
+
370
+ extern uint32 g_bitmasks[32];
371
+
372
+ // Yes I know these should probably be pass by ref, not val:
373
+ // http://www.stepanovpapers.com/notes.pdf
374
+ // Just don't use them on non-simple (non built-in) types!
375
+ template <typename T>
376
+ inline T minimum(T a, T b) {
377
+ return (a < b) ? a : b;
378
+ }
379
+
380
+ template <typename T>
381
+ inline T minimum(T a, T b, T c) {
382
+ return minimum(minimum(a, b), c);
383
+ }
384
+
385
+ template <typename T>
386
+ inline T maximum(T a, T b) {
387
+ return (a > b) ? a : b;
388
+ }
389
+
390
+ template <typename T>
391
+ inline T maximum(T a, T b, T c) {
392
+ return maximum(maximum(a, b), c);
393
+ }
394
+
395
+ template <typename T>
396
+ inline T clamp(T value, T low, T high) {
397
+ return (value < low) ? low : ((value > high) ? high : value);
398
+ }
399
+
400
+ template <typename T>
401
+ inline T square(T value) {
402
+ return value * value;
403
+ }
404
+
405
+ inline bool is_power_of_2(uint32 x) {
406
+ return x && ((x & (x - 1U)) == 0U);
407
+ }
408
+
409
+ // From "Hackers Delight"
410
+ inline int next_pow2(uint32 val) {
411
+ val--;
412
+ val |= val >> 16;
413
+ val |= val >> 8;
414
+ val |= val >> 4;
415
+ val |= val >> 2;
416
+ val |= val >> 1;
417
+ return val + 1;
418
+ }
419
+
420
+ // Returns the total number of bits needed to encode v.
421
+ inline uint32 total_bits(uint32 v) {
422
+ uint32 l = 0;
423
+ while (v > 0U) {
424
+ v >>= 1;
425
+ l++;
426
+ }
427
+ return l;
428
+ }
429
+
430
+ inline uint floor_log2i(uint v) {
431
+ uint l = 0;
432
+ while (v > 1U) {
433
+ v >>= 1;
434
+ l++;
435
+ }
436
+ return l;
437
+ }
438
+
439
+ inline uint ceil_log2i(uint v) {
440
+ uint l = floor_log2i(v);
441
+ if ((l != cIntBits) && (v > (1U << l)))
442
+ l++;
443
+ return l;
444
+ }
445
+ }
446
+ }
447
+
448
+ // File: crnd_utils.h
449
+ namespace crnd {
450
+ namespace utils {
451
+ template <typename T>
452
+ inline void zero_object(T& obj) {
453
+ memset(&obj, 0, sizeof(obj));
454
+ }
455
+
456
+ template <typename T>
457
+ inline void zero_this(T* pObj) {
458
+ memset(pObj, 0, sizeof(*pObj));
459
+ }
460
+
461
+ template <typename T>
462
+ inline void swap(T& left, T& right) {
463
+ T temp(left);
464
+ left = right;
465
+ right = temp;
466
+ }
467
+
468
+ inline void invert_buf(void* pBuf, uint32 size) {
469
+ uint8* p = static_cast<uint8*>(pBuf);
470
+
471
+ const uint32 half_size = size >> 1;
472
+ for (uint32 i = 0; i < half_size; i++)
473
+ swap(p[i], p[size - 1U - i]);
474
+ }
475
+
476
+ static inline uint16 swap16(uint16 x) {
477
+ return static_cast<uint16>((x << 8) | (x >> 8));
478
+ }
479
+ static inline uint32 swap32(uint32 x) {
480
+ return ((x << 24) | ((x << 8) & 0x00FF0000) | ((x >> 8) & 0x0000FF00) | (x >> 24));
481
+ }
482
+
483
+ uint32 compute_max_mips(uint32 width, uint32 height);
484
+
485
+ } // namespace utils
486
+
487
+ } // namespace crnd
488
+
489
+ // File: crnd_vector.h
490
+ namespace crnd {
491
+ struct elemental_vector {
492
+ void* m_p;
493
+ uint32 m_size;
494
+ uint32 m_capacity;
495
+
496
+ typedef void (*object_mover)(void* pDst, void* pSrc, uint32 num);
497
+
498
+ bool increase_capacity(uint32 min_new_capacity, bool grow_hint, uint32 element_size, object_mover pRelocate);
499
+ };
500
+
501
+ #ifdef _MSC_VER
502
+ #pragma warning(push)
503
+ #pragma warning(disable : 4127) // warning C4127: conditional expression is constant
504
+ #endif
505
+
506
+ template <typename T>
507
+ class vector : public helpers::rel_ops<vector<T> > {
508
+ public:
509
+ typedef T* iterator;
510
+ typedef const T* const_iterator;
511
+ typedef T value_type;
512
+ typedef T& reference;
513
+ typedef const T& const_reference;
514
+ typedef T* pointer;
515
+ typedef const T* const_pointer;
516
+
517
+ inline vector()
518
+ : m_p(NULL),
519
+ m_size(0),
520
+ m_capacity(0),
521
+ m_alloc_failed(false) {
522
+ }
523
+
524
+ inline vector(const vector& other)
525
+ : m_p(NULL),
526
+ m_size(0),
527
+ m_capacity(0),
528
+ m_alloc_failed(false) {
529
+ *this = other;
530
+ }
531
+
532
+ inline vector(uint32 size)
533
+ : m_p(NULL),
534
+ m_size(0),
535
+ m_capacity(0),
536
+ m_alloc_failed(false) {
537
+ resize(size);
538
+ }
539
+
540
+ inline ~vector() {
541
+ clear();
542
+ }
543
+
544
+ // I don't like this. Not at all. But exceptions, or just failing suck worse.
545
+ inline bool get_alloc_failed() const { return m_alloc_failed; }
546
+ inline void clear_alloc_failed() { m_alloc_failed = false; }
547
+
548
+ inline bool assign(const vector& other) {
549
+ if (this == &other)
550
+ return true;
551
+
552
+ if (m_capacity == other.m_size)
553
+ resize(0);
554
+ else {
555
+ clear();
556
+
557
+ if (!increase_capacity(other.m_size, false))
558
+ return false;
559
+ }
560
+
561
+ if (scalar_type<T>::cFlag)
562
+ memcpy(m_p, other.m_p, other.m_size * sizeof(T));
563
+ else {
564
+ T* pDst = m_p;
565
+ const T* pSrc = other.m_p;
566
+ for (uint32 i = other.m_size; i > 0; i--)
567
+ helpers::construct(pDst++, *pSrc++);
568
+ }
569
+
570
+ m_size = other.m_size;
571
+
572
+ return true;
573
+ }
574
+
575
+ inline vector& operator=(const vector& other) {
576
+ assign(other);
577
+ return *this;
578
+ }
579
+
580
+ inline const T* begin() const { return m_p; }
581
+ T* begin() { return m_p; }
582
+
583
+ inline const T* end() const { return m_p + m_size; }
584
+ T* end() { return m_p + m_size; }
585
+
586
+ inline bool empty() const { return !m_size; }
587
+ inline uint32 size() const { return m_size; }
588
+ inline uint32 capacity() const { return m_capacity; }
589
+
590
+ inline const T& operator[](uint32 i) const {
591
+ CRND_ASSERT(i < m_size);
592
+ return m_p[i];
593
+ }
594
+ inline T& operator[](uint32 i) {
595
+ CRND_ASSERT(i < m_size);
596
+ return m_p[i];
597
+ }
598
+
599
+ inline const T& front() const {
600
+ CRND_ASSERT(m_size);
601
+ return m_p[0];
602
+ }
603
+ inline T& front() {
604
+ CRND_ASSERT(m_size);
605
+ return m_p[0];
606
+ }
607
+
608
+ inline const T& back() const {
609
+ CRND_ASSERT(m_size);
610
+ return m_p[m_size - 1];
611
+ }
612
+ inline T& back() {
613
+ CRND_ASSERT(m_size);
614
+ return m_p[m_size - 1];
615
+ }
616
+
617
+ inline void clear() {
618
+ if (m_p) {
619
+ scalar_type<T>::destruct_array(m_p, m_size);
620
+ crnd_free(m_p);
621
+ m_p = NULL;
622
+ m_size = 0;
623
+ m_capacity = 0;
624
+ }
625
+
626
+ m_alloc_failed = false;
627
+ }
628
+
629
+ inline bool reserve(uint32 new_capacity) {
630
+ if (!increase_capacity(new_capacity, false))
631
+ return false;
632
+
633
+ return true;
634
+ }
635
+
636
+ inline bool resize(uint32 new_size) {
637
+ if (m_size != new_size) {
638
+ if (new_size < m_size)
639
+ scalar_type<T>::destruct_array(m_p + new_size, m_size - new_size);
640
+ else {
641
+ if (new_size > m_capacity) {
642
+ if (!increase_capacity(new_size, new_size == (m_size + 1)))
643
+ return false;
644
+ }
645
+
646
+ scalar_type<T>::construct_array(m_p + m_size, new_size - m_size);
647
+ }
648
+
649
+ m_size = new_size;
650
+ }
651
+
652
+ return true;
653
+ }
654
+
655
+ inline bool push_back(const T& obj) {
656
+ CRND_ASSERT(!m_p || (&obj < m_p) || (&obj >= (m_p + m_size)));
657
+
658
+ if (m_size >= m_capacity) {
659
+ if (!increase_capacity(m_size + 1, true))
660
+ return false;
661
+ }
662
+
663
+ scalar_type<T>::construct(m_p + m_size, obj);
664
+ m_size++;
665
+
666
+ return true;
667
+ }
668
+
669
+ inline void pop_back() {
670
+ CRND_ASSERT(m_size);
671
+
672
+ if (m_size) {
673
+ m_size--;
674
+ scalar_type<T>::destruct(&m_p[m_size]);
675
+ }
676
+ }
677
+
678
+ inline void insert(uint32 index, const T* p, uint32 n) {
679
+ CRND_ASSERT(index <= m_size);
680
+ if (!n)
681
+ return;
682
+
683
+ const uint32 orig_size = m_size;
684
+ resize(m_size + n);
685
+
686
+ const T* pSrc = m_p + orig_size - 1;
687
+ T* pDst = const_cast<T*>(pSrc) + n;
688
+
689
+ const uint32 num_to_move = orig_size - index;
690
+
691
+ for (uint32 i = 0; i < num_to_move; i++) {
692
+ CRND_ASSERT((pDst - m_p) < (int)m_size);
693
+ *pDst-- = *pSrc--;
694
+ }
695
+
696
+ pSrc = p;
697
+ pDst = m_p + index;
698
+
699
+ for (uint32 i = 0; i < n; i++) {
700
+ CRND_ASSERT((pDst - m_p) < (int)m_size);
701
+ *pDst++ = *p++;
702
+ }
703
+ }
704
+
705
+ inline void erase(uint32 start, uint32 n) {
706
+ CRND_ASSERT((start + n) <= m_size);
707
+
708
+ if (!n)
709
+ return;
710
+
711
+ const uint32 num_to_move = m_size - (start + n);
712
+
713
+ T* pDst = m_p + start;
714
+ T* pDst_end = pDst + num_to_move;
715
+ const T* pSrc = m_p + start + n;
716
+
717
+ while (pDst != pDst_end)
718
+ *pDst++ = *pSrc++;
719
+
720
+ scalar_type<T>::destruct_array(pDst_end, n);
721
+
722
+ m_size -= n;
723
+ }
724
+
725
+ inline void erase(uint32 index) {
726
+ erase(index, 1);
727
+ }
728
+
729
+ inline void erase(T* p) {
730
+ CRND_ASSERT((p >= m_p) && (p < (m_p + m_size)));
731
+ erase(p - m_p);
732
+ }
733
+
734
+ inline bool operator==(const vector& rhs) const {
735
+ if (m_size != rhs.m_size)
736
+ return false;
737
+ else if (m_size) {
738
+ if (scalar_type<T>::cFlag)
739
+ return memcmp(m_p, rhs.m_p, sizeof(T) * m_size) == 0;
740
+ else {
741
+ const T* pSrc = m_p;
742
+ const T* pDst = rhs.m_p;
743
+ for (uint32 i = m_size; i; i--)
744
+ if (!(*pSrc++ == *pDst++))
745
+ return false;
746
+ }
747
+ }
748
+
749
+ return true;
750
+ }
751
+
752
+ inline bool operator<(const vector& rhs) const {
753
+ const uint32 min_size = math::minimum(m_size, rhs.m_size);
754
+
755
+ const T* pSrc = m_p;
756
+ const T* pSrc_end = m_p + min_size;
757
+ const T* pDst = rhs.m_p;
758
+
759
+ while ((pSrc < pSrc_end) && (*pSrc == *pDst)) {
760
+ pSrc++;
761
+ pDst++;
762
+ }
763
+
764
+ if (pSrc < pSrc_end)
765
+ return *pSrc < *pDst;
766
+
767
+ return m_size < rhs.m_size;
768
+ }
769
+
770
+ void swap(vector& other) {
771
+ utils::swap(m_p, other.m_p);
772
+ utils::swap(m_size, other.m_size);
773
+ utils::swap(m_capacity, other.m_capacity);
774
+ }
775
+
776
+ private:
777
+ T* m_p;
778
+ uint32 m_size;
779
+ uint32 m_capacity;
780
+ bool m_alloc_failed;
781
+
782
+ template <typename Q>
783
+ struct is_vector {
784
+ enum { cFlag = false };
785
+ };
786
+ template <typename Q>
787
+ struct is_vector<vector<Q> > {
788
+ enum { cFlag = true };
789
+ };
790
+
791
+ static void object_mover(void* pDst_void, void* pSrc_void, uint32 num) {
792
+ T* pSrc = static_cast<T*>(pSrc_void);
793
+ T* const pSrc_end = pSrc + num;
794
+ T* pDst = static_cast<T*>(pDst_void);
795
+
796
+ while (pSrc != pSrc_end) {
797
+ helpers::construct<T>(pDst, *pSrc);
798
+ pSrc->~T();
799
+ pSrc++;
800
+ pDst++;
801
+ }
802
+ }
803
+
804
+ inline bool increase_capacity(uint32 min_new_capacity, bool grow_hint) {
805
+ if (!reinterpret_cast<elemental_vector*>(this)->increase_capacity(
806
+ min_new_capacity, grow_hint, sizeof(T),
807
+ ((scalar_type<T>::cFlag) || (is_vector<T>::cFlag) || (bitwise_movable<T>::cFlag) || CRND_IS_POD(T)) ? NULL : object_mover)) {
808
+ m_alloc_failed = true;
809
+ return false;
810
+ }
811
+ return true;
812
+ }
813
+ };
814
+
815
+ #ifdef _MSC_VER
816
+ #pragma warning(pop)
817
+ #endif
818
+
819
+ extern void vector_test();
820
+
821
+ } // namespace crnd
822
+
823
+ // File: crnd_private.h
824
+ namespace crnd {
825
+ const crn_header* crnd_get_header(const void* pData, uint32 data_size);
826
+
827
+ } // namespace crnd
828
+
829
+ // File: checksum.h
830
+ namespace crnd {
831
+ // crc16() intended for small buffers - doesn't use an acceleration table.
832
+ const uint16 cInitCRC16 = 0;
833
+ uint16 crc16(const void* pBuf, uint32 len, uint16 crc = cInitCRC16);
834
+
835
+ } // namespace crnd
836
+
837
+ // File: crnd_color.h
838
+ namespace crnd {
839
+ template <typename component_type>
840
+ struct color_quad_component_traits {
841
+ enum {
842
+ cSigned = false,
843
+ cFloat = false,
844
+ cMin = cUINT8_MIN,
845
+ cMax = cUINT8_MAX
846
+ };
847
+ };
848
+
849
+ template <>
850
+ struct color_quad_component_traits<int16> {
851
+ enum {
852
+ cSigned = true,
853
+ cFloat = false,
854
+ cMin = cINT16_MIN,
855
+ cMax = cINT16_MAX
856
+ };
857
+ };
858
+
859
+ template <>
860
+ struct color_quad_component_traits<uint16> {
861
+ enum {
862
+ cSigned = false,
863
+ cFloat = false,
864
+ cMin = cUINT16_MIN,
865
+ cMax = cUINT16_MAX
866
+ };
867
+ };
868
+
869
+ template <>
870
+ struct color_quad_component_traits<int32> {
871
+ enum {
872
+ cSigned = true,
873
+ cFloat = false,
874
+ cMin = cINT32_MIN,
875
+ cMax = cINT32_MAX
876
+ };
877
+ };
878
+
879
+ template <>
880
+ struct color_quad_component_traits<uint32> {
881
+ enum {
882
+ cSigned = false,
883
+ cFloat = false,
884
+ cMin = cUINT32_MIN,
885
+ cMax = cUINT32_MAX
886
+ };
887
+ };
888
+
889
+ template <>
890
+ struct color_quad_component_traits<float> {
891
+ enum {
892
+ cSigned = false,
893
+ cFloat = true,
894
+ cMin = cINT32_MIN,
895
+ cMax = cINT32_MAX
896
+ };
897
+ };
898
+
899
+ template <>
900
+ struct color_quad_component_traits<double> {
901
+ enum {
902
+ cSigned = false,
903
+ cFloat = true,
904
+ cMin = cINT32_MIN,
905
+ cMax = cINT32_MAX
906
+ };
907
+ };
908
+
909
+ #ifdef _MSC_VER
910
+ #pragma warning(push)
911
+ #pragma warning(disable : 4201) // warning C4201: nonstandard extension used : nameless struct/union
912
+ #pragma warning(disable : 4127) // warning C4127: conditional expression is constant
913
+ #endif
914
+
915
+ template <typename component_type, typename parameter_type>
916
+ class color_quad : public helpers::rel_ops<color_quad<component_type, parameter_type> > {
917
+ static parameter_type clamp(parameter_type v) {
918
+ if (component_traits::cFloat)
919
+ return v;
920
+ else {
921
+ if (v < component_traits::cMin)
922
+ return component_traits::cMin;
923
+ else if (v > component_traits::cMax)
924
+ return component_traits::cMax;
925
+ return v;
926
+ }
927
+ }
928
+
929
+ public:
930
+ typedef component_type component_t;
931
+ typedef parameter_type parameter_t;
932
+ typedef color_quad_component_traits<component_type> component_traits;
933
+
934
+ enum { cNumComps = 4 };
935
+
936
+ union {
937
+ struct
938
+ {
939
+ component_type r;
940
+ component_type g;
941
+ component_type b;
942
+ component_type a;
943
+ };
944
+
945
+ component_type c[cNumComps];
946
+ };
947
+
948
+ inline color_quad() {
949
+ }
950
+
951
+ inline color_quad(eClear)
952
+ : r(0), g(0), b(0), a(0) {
953
+ }
954
+
955
+ inline color_quad(const color_quad& other)
956
+ : r(other.r), g(other.g), b(other.b), a(other.a) {
957
+ }
958
+
959
+ inline color_quad(parameter_type y, parameter_type alpha = component_traits::cMax) {
960
+ set(y, alpha);
961
+ }
962
+
963
+ inline color_quad(parameter_type red, parameter_type green, parameter_type blue, parameter_type alpha = component_traits::cMax) {
964
+ set(red, green, blue, alpha);
965
+ }
966
+
967
+ template <typename other_component_type, typename other_parameter_type>
968
+ inline color_quad(const color_quad<other_component_type, other_parameter_type>& other)
969
+ : r(clamp(other.r)), g(clamp(other.g)), b(clamp(other.b)), a(clamp(other.a)) {
970
+ }
971
+
972
+ inline void clear() {
973
+ r = 0;
974
+ g = 0;
975
+ b = 0;
976
+ a = 0;
977
+ }
978
+
979
+ inline color_quad& operator=(const color_quad& other) {
980
+ r = other.r;
981
+ g = other.g;
982
+ b = other.b;
983
+ a = other.a;
984
+ return *this;
985
+ }
986
+
987
+ template <typename other_component_type, typename other_parameter_type>
988
+ inline color_quad& operator=(const color_quad<other_component_type, other_parameter_type>& other) {
989
+ r = clamp(other.r);
990
+ g = clamp(other.g);
991
+ b = clamp(other.b);
992
+ a = clamp(other.a);
993
+ return *this;
994
+ }
995
+
996
+ inline color_quad& set(parameter_type y, parameter_type alpha = component_traits::cMax) {
997
+ y = clamp(y);
998
+ r = static_cast<component_type>(y);
999
+ g = static_cast<component_type>(y);
1000
+ b = static_cast<component_type>(y);
1001
+ a = static_cast<component_type>(alpha);
1002
+ return *this;
1003
+ }
1004
+
1005
+ inline color_quad& set(parameter_type red, parameter_type green, parameter_type blue, parameter_type alpha = component_traits::cMax) {
1006
+ r = static_cast<component_type>(clamp(red));
1007
+ g = static_cast<component_type>(clamp(green));
1008
+ b = static_cast<component_type>(clamp(blue));
1009
+ a = static_cast<component_type>(clamp(alpha));
1010
+ return *this;
1011
+ }
1012
+
1013
+ inline color_quad& set_noclamp_rgba(parameter_type red, parameter_type green, parameter_type blue, parameter_type alpha) {
1014
+ r = static_cast<component_type>(red);
1015
+ g = static_cast<component_type>(green);
1016
+ b = static_cast<component_type>(blue);
1017
+ a = static_cast<component_type>(alpha);
1018
+ return *this;
1019
+ }
1020
+
1021
+ inline color_quad& set_noclamp_rgb(parameter_type red, parameter_type green, parameter_type blue) {
1022
+ r = static_cast<component_type>(red);
1023
+ g = static_cast<component_type>(green);
1024
+ b = static_cast<component_type>(blue);
1025
+ return *this;
1026
+ }
1027
+
1028
+ static inline parameter_type get_min_comp() { return component_traits::cMin; }
1029
+ static inline parameter_type get_max_comp() { return component_traits::cMax; }
1030
+ static inline bool get_comps_are_signed() { return component_traits::cSigned; }
1031
+
1032
+ inline component_type operator[](uint32 i) const {
1033
+ CRND_ASSERT(i < cNumComps);
1034
+ return c[i];
1035
+ }
1036
+ inline component_type& operator[](uint32 i) {
1037
+ CRND_ASSERT(i < cNumComps);
1038
+ return c[i];
1039
+ }
1040
+
1041
+ inline color_quad& set_component(uint32 i, parameter_type f) {
1042
+ CRND_ASSERT(i < cNumComps);
1043
+
1044
+ c[i] = static_cast<component_type>(clamp(f));
1045
+
1046
+ return *this;
1047
+ }
1048
+
1049
+ inline color_quad& clamp(const color_quad& l, const color_quad& h) {
1050
+ for (uint32 i = 0; i < cNumComps; i++)
1051
+ c[i] = static_cast<component_type>(math::clamp<parameter_type>(c[i], l[i], h[i]));
1052
+ return *this;
1053
+ }
1054
+
1055
+ inline color_quad& clamp(parameter_type l, parameter_type h) {
1056
+ for (uint32 i = 0; i < cNumComps; i++)
1057
+ c[i] = static_cast<component_type>(math::clamp<parameter_type>(c[i], l, h));
1058
+ return *this;
1059
+ }
1060
+
1061
+ // Returns CCIR 601 luma (consistent with color_utils::RGB_To_Y).
1062
+ inline parameter_type get_luma() const {
1063
+ return static_cast<parameter_type>((19595U * r + 38470U * g + 7471U * b + 32768) >> 16U);
1064
+ }
1065
+
1066
+ // Returns REC 709 luma.
1067
+ inline parameter_type get_luma_rec709() const {
1068
+ return static_cast<parameter_type>((13938U * r + 46869U * g + 4729U * b + 32768U) >> 16U);
1069
+ }
1070
+
1071
+ inline uint32 squared_distance(const color_quad& c, bool alpha = true) const {
1072
+ return math::square(r - c.r) + math::square(g - c.g) + math::square(b - c.b) + (alpha ? math::square(a - c.a) : 0);
1073
+ }
1074
+
1075
+ inline bool rgb_equals(const color_quad& rhs) const {
1076
+ return (r == rhs.r) && (g == rhs.g) && (b == rhs.b);
1077
+ }
1078
+
1079
+ inline bool operator==(const color_quad& rhs) const {
1080
+ return (r == rhs.r) && (g == rhs.g) && (b == rhs.b) && (a == rhs.a);
1081
+ }
1082
+
1083
+ inline bool operator<(const color_quad& rhs) const {
1084
+ for (uint32 i = 0; i < cNumComps; i++) {
1085
+ if (c[i] < rhs.c[i])
1086
+ return true;
1087
+ else if (!(c[i] == rhs.c[i]))
1088
+ return false;
1089
+ }
1090
+ return false;
1091
+ }
1092
+
1093
+ inline color_quad& operator+=(const color_quad& other) {
1094
+ for (uint32 i = 0; i < 4; i++)
1095
+ c[i] = static_cast<component_type>(clamp(c[i] + other.c[i]));
1096
+ return *this;
1097
+ }
1098
+
1099
+ inline color_quad& operator-=(const color_quad& other) {
1100
+ for (uint32 i = 0; i < 4; i++)
1101
+ c[i] = static_cast<component_type>(clamp(c[i] - other.c[i]));
1102
+ return *this;
1103
+ }
1104
+
1105
+ inline color_quad& operator*=(parameter_type v) {
1106
+ for (uint32 i = 0; i < 4; i++)
1107
+ c[i] = static_cast<component_type>(clamp(c[i] * v));
1108
+ return *this;
1109
+ }
1110
+
1111
+ inline color_quad& operator/=(parameter_type v) {
1112
+ for (uint32 i = 0; i < 4; i++)
1113
+ c[i] = static_cast<component_type>(c[i] / v);
1114
+ return *this;
1115
+ }
1116
+
1117
+ inline color_quad get_swizzled(uint32 x, uint32 y, uint32 z, uint32 w) const {
1118
+ CRND_ASSERT((x | y | z | w) < 4);
1119
+ return color_quad(c[x], c[y], c[z], c[w]);
1120
+ }
1121
+
1122
+ inline friend color_quad operator+(const color_quad& lhs, const color_quad& rhs) {
1123
+ color_quad result(lhs);
1124
+ result += rhs;
1125
+ return result;
1126
+ }
1127
+
1128
+ inline friend color_quad operator-(const color_quad& lhs, const color_quad& rhs) {
1129
+ color_quad result(lhs);
1130
+ result -= rhs;
1131
+ return result;
1132
+ }
1133
+
1134
+ inline friend color_quad operator*(const color_quad& lhs, parameter_type v) {
1135
+ color_quad result(lhs);
1136
+ result *= v;
1137
+ return result;
1138
+ }
1139
+
1140
+ friend inline color_quad operator/(const color_quad& lhs, parameter_type v) {
1141
+ color_quad result(lhs);
1142
+ result /= v;
1143
+ return result;
1144
+ }
1145
+
1146
+ friend inline color_quad operator*(parameter_type v, const color_quad& rhs) {
1147
+ color_quad result(rhs);
1148
+ result *= v;
1149
+ return result;
1150
+ }
1151
+
1152
+ inline uint32 get_min_component_index(bool alpha = true) const {
1153
+ uint32 index = 0;
1154
+ uint32 limit = alpha ? cNumComps : (cNumComps - 1);
1155
+ for (uint32 i = 1; i < limit; i++)
1156
+ if (c[i] < c[index])
1157
+ index = i;
1158
+ return index;
1159
+ }
1160
+
1161
+ inline uint32 get_max_component_index(bool alpha = true) const {
1162
+ uint32 index = 0;
1163
+ uint32 limit = alpha ? cNumComps : (cNumComps - 1);
1164
+ for (uint32 i = 1; i < limit; i++)
1165
+ if (c[i] > c[index])
1166
+ index = i;
1167
+ return index;
1168
+ }
1169
+
1170
+ inline void get_float4(float* pDst) {
1171
+ for (uint32 i = 0; i < 4; i++)
1172
+ pDst[i] = ((*this)[i] - component_traits::cMin) / float(component_traits::cMax - component_traits::cMin);
1173
+ }
1174
+
1175
+ inline void get_float3(float* pDst) {
1176
+ for (uint32 i = 0; i < 3; i++)
1177
+ pDst[i] = ((*this)[i] - component_traits::cMin) / float(component_traits::cMax - component_traits::cMin);
1178
+ }
1179
+
1180
+ static inline color_quad make_black() {
1181
+ return color_quad(0, 0, 0, component_traits::cMax);
1182
+ }
1183
+
1184
+ static inline color_quad make_white() {
1185
+ return color_quad(component_traits::cMax, component_traits::cMax, component_traits::cMax, component_traits::cMax);
1186
+ }
1187
+ }; // class color_quad
1188
+
1189
+ #ifdef _MSC_VER
1190
+ #pragma warning(pop)
1191
+ #endif
1192
+
1193
+ template <typename c, typename q>
1194
+ struct scalar_type<color_quad<c, q> > {
1195
+ enum { cFlag = true };
1196
+ static inline void construct(color_quad<c, q>* p) {}
1197
+ static inline void construct(color_quad<c, q>* p, const color_quad<c, q>& init) { memcpy(p, &init, sizeof(color_quad<c, q>)); }
1198
+ static inline void construct_array(color_quad<c, q>* p, uint32 n) { p, n; }
1199
+ static inline void destruct(color_quad<c, q>* p) { p; }
1200
+ static inline void destruct_array(color_quad<c, q>* p, uint32 n) { p, n; }
1201
+ };
1202
+
1203
+ typedef color_quad<uint8, int> color_quad_u8;
1204
+ typedef color_quad<int16, int> color_quad_i16;
1205
+ typedef color_quad<uint16, int> color_quad_u16;
1206
+ typedef color_quad<int32, int> color_quad_i32;
1207
+ typedef color_quad<uint32, uint32> color_quad_u32;
1208
+ typedef color_quad<float, float> color_quad_f;
1209
+ typedef color_quad<double, double> color_quad_d;
1210
+
1211
+ } // namespace crnd
1212
+
1213
+ // File: crnd_dxt.h
1214
+ namespace crnd {
1215
+ enum dxt_format {
1216
+ cDXTInvalid = -1,
1217
+
1218
+ // cDXT1/1A must appear first!
1219
+ cDXT1,
1220
+ cDXT1A,
1221
+
1222
+ cDXT3,
1223
+ cDXT5,
1224
+ cDXT5A,
1225
+
1226
+ cDXN_XY, // inverted relative to standard ATI2, 360's DXN
1227
+ cDXN_YX // standard ATI2
1228
+ };
1229
+
1230
+ enum dxt_constants {
1231
+ cDXTBlockShift = 2U,
1232
+ cDXTBlockSize = 1U << cDXTBlockShift,
1233
+
1234
+ cDXT1BytesPerBlock = 8U,
1235
+ cDXT5NBytesPerBlock = 16U,
1236
+
1237
+ cDXT1SelectorBits = 2U,
1238
+ cDXT1SelectorValues = 1U << cDXT1SelectorBits,
1239
+ cDXT1SelectorMask = cDXT1SelectorValues - 1U,
1240
+
1241
+ cDXT5SelectorBits = 3U,
1242
+ cDXT5SelectorValues = 1U << cDXT5SelectorBits,
1243
+ cDXT5SelectorMask = cDXT5SelectorValues - 1U
1244
+ };
1245
+
1246
+ const float cDXT1MaxLinearValue = 3.0f;
1247
+ const float cDXT1InvMaxLinearValue = 1.0f / 3.0f;
1248
+
1249
+ const float cDXT5MaxLinearValue = 7.0f;
1250
+ const float cDXT5InvMaxLinearValue = 1.0f / 7.0f;
1251
+
1252
+ // Converts DXT1 raw color selector index to a linear value.
1253
+ extern const uint8 g_dxt1_to_linear[cDXT1SelectorValues];
1254
+
1255
+ // Converts DXT5 raw alpha selector index to a linear value.
1256
+ extern const uint8 g_dxt5_to_linear[cDXT5SelectorValues];
1257
+
1258
+ // Converts DXT1 linear color selector index to a raw value (inverse of g_dxt1_to_linear).
1259
+ extern const uint8 g_dxt1_from_linear[cDXT1SelectorValues];
1260
+
1261
+ // Converts DXT5 linear alpha selector index to a raw value (inverse of g_dxt5_to_linear).
1262
+ extern const uint8 g_dxt5_from_linear[cDXT5SelectorValues];
1263
+
1264
+ extern const uint8 g_six_alpha_invert_table[cDXT5SelectorValues];
1265
+ extern const uint8 g_eight_alpha_invert_table[cDXT5SelectorValues];
1266
+
1267
+ struct dxt1_block {
1268
+ uint8 m_low_color[2];
1269
+ uint8 m_high_color[2];
1270
+
1271
+ enum { cNumSelectorBytes = 4 };
1272
+ uint8 m_selectors[cNumSelectorBytes];
1273
+
1274
+ inline void clear() {
1275
+ utils::zero_this(this);
1276
+ }
1277
+
1278
+ // These methods assume the in-memory rep is in LE byte order.
1279
+ inline uint32 get_low_color() const {
1280
+ return m_low_color[0] | (m_low_color[1] << 8U);
1281
+ }
1282
+
1283
+ inline uint32 get_high_color() const {
1284
+ return m_high_color[0] | (m_high_color[1] << 8U);
1285
+ }
1286
+
1287
+ inline void set_low_color(uint16 c) {
1288
+ m_low_color[0] = static_cast<uint8>(c & 0xFF);
1289
+ m_low_color[1] = static_cast<uint8>((c >> 8) & 0xFF);
1290
+ }
1291
+
1292
+ inline void set_high_color(uint16 c) {
1293
+ m_high_color[0] = static_cast<uint8>(c & 0xFF);
1294
+ m_high_color[1] = static_cast<uint8>((c >> 8) & 0xFF);
1295
+ }
1296
+
1297
+ inline uint32 get_selector(uint32 x, uint32 y) const {
1298
+ CRND_ASSERT((x < 4U) && (y < 4U));
1299
+ return (m_selectors[y] >> (x * cDXT1SelectorBits)) & cDXT1SelectorMask;
1300
+ }
1301
+
1302
+ inline void set_selector(uint32 x, uint32 y, uint32 val) {
1303
+ CRND_ASSERT((x < 4U) && (y < 4U) && (val < 4U));
1304
+
1305
+ m_selectors[y] &= (~(cDXT1SelectorMask << (x * cDXT1SelectorBits)));
1306
+ m_selectors[y] |= (val << (x * cDXT1SelectorBits));
1307
+ }
1308
+
1309
+ static uint16 pack_color(const color_quad_u8& color, bool scaled, uint32 bias = 127U);
1310
+ static uint16 pack_color(uint32 r, uint32 g, uint32 b, bool scaled, uint32 bias = 127U);
1311
+
1312
+ static color_quad_u8 unpack_color(uint16 packed_color, bool scaled, uint32 alpha = 255U);
1313
+ static void unpack_color(uint32& r, uint32& g, uint32& b, uint16 packed_color, bool scaled);
1314
+
1315
+ static uint32 get_block_colors3(color_quad_u8* pDst, uint16 color0, uint16 color1);
1316
+ static uint32 get_block_colors4(color_quad_u8* pDst, uint16 color0, uint16 color1);
1317
+ // pDst must point to an array at least cDXT1SelectorValues long.
1318
+ static uint32 get_block_colors(color_quad_u8* pDst, uint16 color0, uint16 color1);
1319
+
1320
+ static color_quad_u8 unpack_endpoint(uint32 endpoints, uint32 index, bool scaled, uint32 alpha = 255U);
1321
+ static uint32 pack_endpoints(uint32 lo, uint32 hi);
1322
+ };
1323
+
1324
+ CRND_DEFINE_BITWISE_MOVABLE(dxt1_block);
1325
+
1326
+ struct dxt3_block {
1327
+ enum { cNumAlphaBytes = 8 };
1328
+ uint8 m_alpha[cNumAlphaBytes];
1329
+
1330
+ void set_alpha(uint32 x, uint32 y, uint32 value, bool scaled);
1331
+ uint32 get_alpha(uint32 x, uint32 y, bool scaled) const;
1332
+ };
1333
+
1334
+ CRND_DEFINE_BITWISE_MOVABLE(dxt3_block);
1335
+
1336
+ struct dxt5_block {
1337
+ uint8 m_endpoints[2];
1338
+
1339
+ enum { cNumSelectorBytes = 6 };
1340
+ uint8 m_selectors[cNumSelectorBytes];
1341
+
1342
+ inline void clear() {
1343
+ utils::zero_this(this);
1344
+ }
1345
+
1346
+ inline uint32 get_low_alpha() const {
1347
+ return m_endpoints[0];
1348
+ }
1349
+
1350
+ inline uint32 get_high_alpha() const {
1351
+ return m_endpoints[1];
1352
+ }
1353
+
1354
+ inline void set_low_alpha(uint32 i) {
1355
+ CRND_ASSERT(i <= cUINT8_MAX);
1356
+ m_endpoints[0] = static_cast<uint8>(i);
1357
+ }
1358
+
1359
+ inline void set_high_alpha(uint32 i) {
1360
+ CRND_ASSERT(i <= cUINT8_MAX);
1361
+ m_endpoints[1] = static_cast<uint8>(i);
1362
+ }
1363
+
1364
+ uint32 get_endpoints_as_word() const { return m_endpoints[0] | (m_endpoints[1] << 8); }
1365
+
1366
+ uint32 get_selectors_as_word(uint32 index) {
1367
+ CRND_ASSERT(index < 3);
1368
+ return m_selectors[index * 2] | (m_selectors[index * 2 + 1] << 8);
1369
+ }
1370
+
1371
+ inline uint32 get_selector(uint32 x, uint32 y) const {
1372
+ CRND_ASSERT((x < 4U) && (y < 4U));
1373
+
1374
+ uint32 selector_index = (y * 4) + x;
1375
+ uint32 bit_index = selector_index * cDXT5SelectorBits;
1376
+
1377
+ uint32 byte_index = bit_index >> 3;
1378
+ uint32 bit_ofs = bit_index & 7;
1379
+
1380
+ uint32 v = m_selectors[byte_index];
1381
+ if (byte_index < (cNumSelectorBytes - 1))
1382
+ v |= (m_selectors[byte_index + 1] << 8);
1383
+
1384
+ return (v >> bit_ofs) & 7;
1385
+ }
1386
+
1387
+ inline void set_selector(uint32 x, uint32 y, uint32 val) {
1388
+ CRND_ASSERT((x < 4U) && (y < 4U) && (val < 8U));
1389
+
1390
+ uint32 selector_index = (y * 4) + x;
1391
+ uint32 bit_index = selector_index * cDXT5SelectorBits;
1392
+
1393
+ uint32 byte_index = bit_index >> 3;
1394
+ uint32 bit_ofs = bit_index & 7;
1395
+
1396
+ uint32 v = m_selectors[byte_index];
1397
+ if (byte_index < (cNumSelectorBytes - 1))
1398
+ v |= (m_selectors[byte_index + 1] << 8);
1399
+
1400
+ v &= (~(7 << bit_ofs));
1401
+ v |= (val << bit_ofs);
1402
+
1403
+ m_selectors[byte_index] = static_cast<uint8>(v);
1404
+ if (byte_index < (cNumSelectorBytes - 1))
1405
+ m_selectors[byte_index + 1] = static_cast<uint8>(v >> 8);
1406
+ }
1407
+
1408
+ // Results written to alpha channel.
1409
+ static uint32 get_block_values6(color_quad_u8* pDst, uint32 l, uint32 h);
1410
+ static uint32 get_block_values8(color_quad_u8* pDst, uint32 l, uint32 h);
1411
+ static uint32 get_block_values(color_quad_u8* pDst, uint32 l, uint32 h);
1412
+
1413
+ static uint32 get_block_values6(uint32* pDst, uint32 l, uint32 h);
1414
+ static uint32 get_block_values8(uint32* pDst, uint32 l, uint32 h);
1415
+ // pDst must point to an array at least cDXT5SelectorValues long.
1416
+ static uint32 get_block_values(uint32* pDst, uint32 l, uint32 h);
1417
+
1418
+ static uint32 unpack_endpoint(uint32 packed, uint32 index);
1419
+ static uint32 pack_endpoints(uint32 lo, uint32 hi);
1420
+ };
1421
+
1422
+ CRND_DEFINE_BITWISE_MOVABLE(dxt5_block);
1423
+
1424
+ } // namespace crnd
1425
+
1426
+ // File: crnd_prefix_coding.h
1427
+ #ifdef _XBOX
1428
+ #define CRND_PREFIX_CODING_USE_FIXED_TABLE_SIZE 1
1429
+ #else
1430
+ #define CRND_PREFIX_CODING_USE_FIXED_TABLE_SIZE 0
1431
+ #endif
1432
+
1433
+ namespace crnd {
1434
+ namespace prefix_coding {
1435
+ const uint32 cMaxExpectedCodeSize = 16;
1436
+ const uint32 cMaxSupportedSyms = 8192;
1437
+ const uint32 cMaxTableBits = 11;
1438
+
1439
+ class decoder_tables {
1440
+ public:
1441
+ inline decoder_tables()
1442
+ : m_cur_lookup_size(0), m_lookup(NULL), m_cur_sorted_symbol_order_size(0), m_sorted_symbol_order(NULL) {
1443
+ }
1444
+
1445
+ inline decoder_tables(const decoder_tables& other)
1446
+ : m_cur_lookup_size(0), m_lookup(NULL), m_cur_sorted_symbol_order_size(0), m_sorted_symbol_order(NULL) {
1447
+ *this = other;
1448
+ }
1449
+
1450
+ decoder_tables& operator=(const decoder_tables& other) {
1451
+ if (this == &other)
1452
+ return *this;
1453
+
1454
+ clear();
1455
+
1456
+ memcpy(this, &other, sizeof(*this));
1457
+
1458
+ if (other.m_lookup) {
1459
+ m_lookup = crnd_new_array<uint32>(m_cur_lookup_size);
1460
+ if (m_lookup)
1461
+ memcpy(m_lookup, other.m_lookup, sizeof(m_lookup[0]) * m_cur_lookup_size);
1462
+ }
1463
+
1464
+ if (other.m_sorted_symbol_order) {
1465
+ m_sorted_symbol_order = crnd_new_array<uint16>(m_cur_sorted_symbol_order_size);
1466
+ if (m_sorted_symbol_order)
1467
+ memcpy(m_sorted_symbol_order, other.m_sorted_symbol_order, sizeof(m_sorted_symbol_order[0]) * m_cur_sorted_symbol_order_size);
1468
+ }
1469
+
1470
+ return *this;
1471
+ }
1472
+
1473
+ inline void clear() {
1474
+ if (m_lookup) {
1475
+ crnd_delete_array(m_lookup);
1476
+ m_lookup = 0;
1477
+ m_cur_lookup_size = 0;
1478
+ }
1479
+
1480
+ if (m_sorted_symbol_order) {
1481
+ crnd_delete_array(m_sorted_symbol_order);
1482
+ m_sorted_symbol_order = NULL;
1483
+ m_cur_sorted_symbol_order_size = 0;
1484
+ }
1485
+ }
1486
+
1487
+ inline ~decoder_tables() {
1488
+ if (m_lookup)
1489
+ crnd_delete_array(m_lookup);
1490
+
1491
+ if (m_sorted_symbol_order)
1492
+ crnd_delete_array(m_sorted_symbol_order);
1493
+ }
1494
+
1495
+ bool init(uint32 num_syms, const uint8* pCodesizes, uint32 table_bits);
1496
+
1497
+ // DO NOT use any complex classes here - it is bitwise copied.
1498
+
1499
+ uint32 m_num_syms;
1500
+ uint32 m_total_used_syms;
1501
+ uint32 m_table_bits;
1502
+ uint32 m_table_shift;
1503
+ uint32 m_table_max_code;
1504
+ uint32 m_decode_start_code_size;
1505
+
1506
+ uint8 m_min_code_size;
1507
+ uint8 m_max_code_size;
1508
+
1509
+ uint32 m_max_codes[cMaxExpectedCodeSize + 1];
1510
+ int32 m_val_ptrs[cMaxExpectedCodeSize + 1];
1511
+
1512
+ uint32 m_cur_lookup_size;
1513
+ uint32* m_lookup;
1514
+
1515
+ uint32 m_cur_sorted_symbol_order_size;
1516
+ uint16* m_sorted_symbol_order;
1517
+
1518
+ inline uint32 get_unshifted_max_code(uint32 len) const {
1519
+ CRND_ASSERT((len >= 1) && (len <= cMaxExpectedCodeSize));
1520
+ uint32 k = m_max_codes[len - 1];
1521
+ if (!k)
1522
+ return crnd::cUINT32_MAX;
1523
+ return (k - 1) >> (16 - len);
1524
+ }
1525
+ };
1526
+
1527
+ } // namespace prefix_coding
1528
+
1529
+ } // namespace crnd
1530
+
1531
+ // File: crnd_symbol_codec.h
1532
+ namespace crnd {
1533
+ class static_huffman_data_model {
1534
+ public:
1535
+ static_huffman_data_model();
1536
+ static_huffman_data_model(const static_huffman_data_model& other);
1537
+ ~static_huffman_data_model();
1538
+
1539
+ static_huffman_data_model& operator=(const static_huffman_data_model& rhs);
1540
+
1541
+ bool init(uint32 total_syms, const uint8* pCode_sizes, uint32 code_size_limit);
1542
+ void clear();
1543
+
1544
+ inline bool is_valid() const { return m_pDecode_tables != NULL; }
1545
+
1546
+ inline uint32 get_total_syms() const { return m_total_syms; }
1547
+
1548
+ inline uint32 get_code_size(uint32 sym) const { return m_code_sizes[sym]; }
1549
+
1550
+ inline const uint8* get_code_sizes() const { return m_code_sizes.empty() ? NULL : &m_code_sizes[0]; }
1551
+
1552
+ public:
1553
+ uint32 m_total_syms;
1554
+ crnd::vector<uint8> m_code_sizes;
1555
+ prefix_coding::decoder_tables* m_pDecode_tables;
1556
+
1557
+ private:
1558
+ bool prepare_decoder_tables();
1559
+ uint compute_decoder_table_bits() const;
1560
+
1561
+ friend class symbol_codec;
1562
+ };
1563
+
1564
+ class symbol_codec {
1565
+ public:
1566
+ symbol_codec();
1567
+
1568
+ bool start_decoding(const uint8* pBuf, uint32 buf_size);
1569
+ bool decode_receive_static_data_model(static_huffman_data_model& model);
1570
+
1571
+ uint32 decode_bits(uint32 num_bits);
1572
+ uint32 decode(const static_huffman_data_model& model);
1573
+
1574
+ uint64 stop_decoding();
1575
+
1576
+ public:
1577
+ const uint8* m_pDecode_buf;
1578
+ const uint8* m_pDecode_buf_next;
1579
+ const uint8* m_pDecode_buf_end;
1580
+ uint32 m_decode_buf_size;
1581
+
1582
+ typedef uint32 bit_buf_type;
1583
+ enum { cBitBufSize = 32U };
1584
+ bit_buf_type m_bit_buf;
1585
+
1586
+ int m_bit_count;
1587
+
1588
+ private:
1589
+ void get_bits_init();
1590
+ uint32 get_bits(uint32 num_bits);
1591
+ };
1592
+
1593
+ } // namespace crnd
1594
+
1595
+ namespace crnd {
1596
+ void crnd_assert(const char* pExp, const char* pFile, unsigned line) {
1597
+ char buf[512];
1598
+
1599
+ #if defined(WIN32) && defined(_MSC_VER)
1600
+ sprintf_s(buf, sizeof(buf), "%s(%u): Assertion failure: \"%s\"\n", pFile, line, pExp);
1601
+ #else
1602
+ sprintf(buf, "%s(%u): Assertion failure: \"%s\"\n", pFile, line, pExp);
1603
+ #endif
1604
+
1605
+ crnd_output_debug_string(buf);
1606
+
1607
+ puts(buf);
1608
+
1609
+ if (crnd_is_debugger_present())
1610
+ crnd_debug_break();
1611
+ }
1612
+
1613
+ void crnd_trace(const char* pFmt, va_list args) {
1614
+ if (crnd_is_debugger_present()) {
1615
+ char buf[512];
1616
+ #if defined(WIN32) && defined(_MSC_VER)
1617
+ vsprintf_s(buf, sizeof(buf), pFmt, args);
1618
+ #else
1619
+ vsprintf(buf, pFmt, args);
1620
+ #endif
1621
+
1622
+ crnd_output_debug_string(buf);
1623
+ }
1624
+ };
1625
+
1626
+ void crnd_trace(const char* pFmt, ...) {
1627
+ va_list args;
1628
+ va_start(args, pFmt);
1629
+ crnd_trace(pFmt, args);
1630
+ va_end(args);
1631
+ };
1632
+
1633
+ } // namespace crnd
1634
+
1635
+ // File: checksum.cpp
1636
+ // From the public domain stb.h header.
1637
+ namespace crnd {
1638
+ uint16 crc16(const void* pBuf, uint32 len, uint16 crc) {
1639
+ crc = ~crc;
1640
+
1641
+ const uint8* p = reinterpret_cast<const uint8*>(pBuf);
1642
+ while (len) {
1643
+ const uint16 q = *p++ ^ (crc >> 8U);
1644
+ crc <<= 8U;
1645
+
1646
+ uint16 r = (q >> 4U) ^ q;
1647
+ crc ^= r;
1648
+ r <<= 5U;
1649
+ crc ^= r;
1650
+ r <<= 7U;
1651
+ crc ^= r;
1652
+
1653
+ len--;
1654
+ }
1655
+
1656
+ return static_cast<uint16>(~crc);
1657
+ }
1658
+
1659
+ } // namespace crnd
1660
+
1661
+ // File: crnd_vector.cpp
1662
+ namespace crnd {
1663
+ bool elemental_vector::increase_capacity(uint32 min_new_capacity, bool grow_hint, uint32 element_size, object_mover pMover) {
1664
+ CRND_ASSERT(m_size <= m_capacity);
1665
+ CRND_ASSERT(min_new_capacity < (0x7FFF0000U / element_size));
1666
+
1667
+ if (m_capacity >= min_new_capacity)
1668
+ return true;
1669
+
1670
+ uint32 new_capacity = min_new_capacity;
1671
+ if ((grow_hint) && (!math::is_power_of_2(new_capacity)))
1672
+ new_capacity = math::next_pow2(new_capacity);
1673
+
1674
+ CRND_ASSERT(new_capacity && (new_capacity > m_capacity));
1675
+
1676
+ const uint32 desired_size = element_size * new_capacity;
1677
+ size_t actual_size;
1678
+ if (!pMover) {
1679
+ void* new_p = crnd_realloc(m_p, desired_size, &actual_size, true);
1680
+ if (!new_p)
1681
+ return false;
1682
+ m_p = new_p;
1683
+ } else {
1684
+ void* new_p = crnd_malloc(desired_size, &actual_size);
1685
+ if (!new_p)
1686
+ return false;
1687
+
1688
+ (*pMover)(new_p, m_p, m_size);
1689
+
1690
+ if (m_p)
1691
+ crnd_free(m_p);
1692
+
1693
+ m_p = new_p;
1694
+ }
1695
+
1696
+ if (actual_size > desired_size)
1697
+ m_capacity = static_cast<uint32>(actual_size / element_size);
1698
+ else
1699
+ m_capacity = new_capacity;
1700
+
1701
+ return true;
1702
+ }
1703
+
1704
+ } // namespace crnd
1705
+
1706
+ // File: crnd_utils.cpp
1707
+ namespace crnd {
1708
+ namespace utils {
1709
+ uint32 compute_max_mips(uint32 width, uint32 height) {
1710
+ if ((width | height) == 0)
1711
+ return 0;
1712
+
1713
+ uint32 num_mips = 1;
1714
+
1715
+ while ((width > 1U) || (height > 1U)) {
1716
+ width >>= 1U;
1717
+ height >>= 1U;
1718
+ num_mips++;
1719
+ }
1720
+
1721
+ return num_mips;
1722
+ }
1723
+
1724
+ } // namespace utils
1725
+
1726
+ } // namespace crnd
1727
+
1728
+ // File: crnd_prefix_coding.cpp
1729
+ namespace crnd {
1730
+ namespace prefix_coding {
1731
+ bool decoder_tables::init(uint32 num_syms, const uint8* pCodesizes, uint32 table_bits) {
1732
+ uint32 min_codes[cMaxExpectedCodeSize];
1733
+ if ((!num_syms) || (table_bits > cMaxTableBits))
1734
+ return false;
1735
+
1736
+ m_num_syms = num_syms;
1737
+
1738
+ uint32 num_codes[cMaxExpectedCodeSize + 1];
1739
+ utils::zero_object(num_codes);
1740
+
1741
+ for (uint32 i = 0; i < num_syms; i++) {
1742
+ uint32 c = pCodesizes[i];
1743
+ if (c)
1744
+ num_codes[c]++;
1745
+ }
1746
+
1747
+ uint32 sorted_positions[cMaxExpectedCodeSize + 1];
1748
+
1749
+ uint32 cur_code = 0;
1750
+
1751
+ uint32 total_used_syms = 0;
1752
+ uint32 max_code_size = 0;
1753
+ uint32 min_code_size = cUINT32_MAX;
1754
+ for (uint32 i = 1; i <= cMaxExpectedCodeSize; i++) {
1755
+ const uint32 n = num_codes[i];
1756
+
1757
+ if (!n)
1758
+ m_max_codes[i - 1] = 0; //UINT_MAX;
1759
+ else {
1760
+ min_code_size = math::minimum(min_code_size, i);
1761
+ max_code_size = math::maximum(max_code_size, i);
1762
+
1763
+ min_codes[i - 1] = cur_code;
1764
+
1765
+ m_max_codes[i - 1] = cur_code + n - 1;
1766
+ m_max_codes[i - 1] = 1 + ((m_max_codes[i - 1] << (16 - i)) | ((1 << (16 - i)) - 1));
1767
+
1768
+ m_val_ptrs[i - 1] = total_used_syms;
1769
+
1770
+ sorted_positions[i] = total_used_syms;
1771
+
1772
+ cur_code += n;
1773
+ total_used_syms += n;
1774
+ }
1775
+
1776
+ cur_code <<= 1;
1777
+ }
1778
+
1779
+ m_total_used_syms = total_used_syms;
1780
+
1781
+ if (total_used_syms > m_cur_sorted_symbol_order_size) {
1782
+ m_cur_sorted_symbol_order_size = total_used_syms;
1783
+
1784
+ if (!math::is_power_of_2(total_used_syms))
1785
+ m_cur_sorted_symbol_order_size = math::minimum<uint32>(num_syms, math::next_pow2(total_used_syms));
1786
+
1787
+ if (m_sorted_symbol_order)
1788
+ crnd_delete_array(m_sorted_symbol_order);
1789
+
1790
+ m_sorted_symbol_order = crnd_new_array<uint16>(m_cur_sorted_symbol_order_size);
1791
+ if (!m_sorted_symbol_order)
1792
+ return false;
1793
+ }
1794
+
1795
+ m_min_code_size = static_cast<uint8>(min_code_size);
1796
+ m_max_code_size = static_cast<uint8>(max_code_size);
1797
+
1798
+ for (uint32 i = 0; i < num_syms; i++) {
1799
+ uint32 c = pCodesizes[i];
1800
+ if (c) {
1801
+ CRND_ASSERT(num_codes[c]);
1802
+
1803
+ uint32 sorted_pos = sorted_positions[c]++;
1804
+
1805
+ CRND_ASSERT(sorted_pos < total_used_syms);
1806
+
1807
+ m_sorted_symbol_order[sorted_pos] = static_cast<uint16>(i);
1808
+ }
1809
+ }
1810
+
1811
+ if (table_bits <= m_min_code_size)
1812
+ table_bits = 0;
1813
+ m_table_bits = table_bits;
1814
+
1815
+ if (table_bits) {
1816
+ uint32 table_size = 1 << table_bits;
1817
+ if (table_size > m_cur_lookup_size) {
1818
+ m_cur_lookup_size = table_size;
1819
+
1820
+ if (m_lookup)
1821
+ crnd_delete_array(m_lookup);
1822
+
1823
+ m_lookup = crnd_new_array<uint32>(table_size);
1824
+ if (!m_lookup)
1825
+ return false;
1826
+ }
1827
+
1828
+ memset(m_lookup, 0xFF, (uint)sizeof(m_lookup[0]) * (1UL << table_bits));
1829
+
1830
+ for (uint32 codesize = 1; codesize <= table_bits; codesize++) {
1831
+ if (!num_codes[codesize])
1832
+ continue;
1833
+
1834
+ const uint32 fillsize = table_bits - codesize;
1835
+ const uint32 fillnum = 1 << fillsize;
1836
+
1837
+ const uint32 min_code = min_codes[codesize - 1];
1838
+ const uint32 max_code = get_unshifted_max_code(codesize);
1839
+ const uint32 val_ptr = m_val_ptrs[codesize - 1];
1840
+
1841
+ for (uint32 code = min_code; code <= max_code; code++) {
1842
+ const uint32 sym_index = m_sorted_symbol_order[val_ptr + code - min_code];
1843
+ CRND_ASSERT(pCodesizes[sym_index] == codesize);
1844
+
1845
+ for (uint32 j = 0; j < fillnum; j++) {
1846
+ const uint32 t = j + (code << fillsize);
1847
+
1848
+ CRND_ASSERT(t < (1U << table_bits));
1849
+
1850
+ CRND_ASSERT(m_lookup[t] == cUINT32_MAX);
1851
+
1852
+ m_lookup[t] = sym_index | (codesize << 16U);
1853
+ }
1854
+ }
1855
+ }
1856
+ }
1857
+
1858
+ for (uint32 i = 0; i < cMaxExpectedCodeSize; i++)
1859
+ m_val_ptrs[i] -= min_codes[i];
1860
+
1861
+ m_table_max_code = 0;
1862
+ m_decode_start_code_size = m_min_code_size;
1863
+
1864
+ if (table_bits) {
1865
+ uint32 i;
1866
+ for (i = table_bits; i >= 1; i--) {
1867
+ if (num_codes[i]) {
1868
+ m_table_max_code = m_max_codes[i - 1];
1869
+ break;
1870
+ }
1871
+ }
1872
+ if (i >= 1) {
1873
+ m_decode_start_code_size = table_bits + 1;
1874
+ for (uint32 j = table_bits + 1; j <= max_code_size; j++) {
1875
+ if (num_codes[j]) {
1876
+ m_decode_start_code_size = j;
1877
+ break;
1878
+ }
1879
+ }
1880
+ }
1881
+ }
1882
+
1883
+ // sentinels
1884
+ m_max_codes[cMaxExpectedCodeSize] = cUINT32_MAX;
1885
+ m_val_ptrs[cMaxExpectedCodeSize] = 0xFFFFF;
1886
+
1887
+ m_table_shift = 32 - m_table_bits;
1888
+ return true;
1889
+ }
1890
+
1891
+ } // namespace prefix_codig
1892
+
1893
+ } // namespace crnd
1894
+
1895
+ // File: crnd_platform.cpp
1896
+ namespace crnd {
1897
+ bool crnd_is_debugger_present() {
1898
+ #ifdef CRND_DEVEL
1899
+ return IsDebuggerPresent() != 0;
1900
+ #else
1901
+ return false;
1902
+ #endif
1903
+ }
1904
+
1905
+ void crnd_debug_break() {
1906
+ #ifdef CRND_DEVEL
1907
+ DebugBreak();
1908
+ #endif
1909
+ }
1910
+
1911
+ void crnd_output_debug_string(const char* p) {
1912
+ (void)p;
1913
+ #ifdef CRND_DEVEL
1914
+ OutputDebugStringA(p);
1915
+ #endif
1916
+ }
1917
+
1918
+ } // namespace crnd
1919
+
1920
+ // File: crnd_mem.cpp
1921
+ namespace crnd {
1922
+ const uint32 MAX_POSSIBLE_BLOCK_SIZE = 0x7FFF0000U;
1923
+
1924
+ static void* crnd_default_realloc(void* p, size_t size, size_t* pActual_size, bool movable, void*) {
1925
+ void* p_new;
1926
+
1927
+ if (!p) {
1928
+ p_new = ::malloc(size);
1929
+
1930
+ if (pActual_size) {
1931
+ #ifdef WIN32
1932
+ *pActual_size = p_new ? ::_msize(p_new) : 0;
1933
+ #else
1934
+ *pActual_size = p_new ? malloc_usable_size(p_new) : 0;
1935
+ #endif
1936
+ }
1937
+ } else if (!size) {
1938
+ ::free(p);
1939
+ p_new = NULL;
1940
+
1941
+ if (pActual_size)
1942
+ *pActual_size = 0;
1943
+ } else {
1944
+ void* p_final_block = p;
1945
+ #ifdef WIN32
1946
+ p_new = ::_expand(p, size);
1947
+ #else
1948
+ p_new = NULL;
1949
+ #endif
1950
+
1951
+ if (p_new)
1952
+ p_final_block = p_new;
1953
+ else if (movable) {
1954
+ p_new = ::realloc(p, size);
1955
+
1956
+ if (p_new)
1957
+ p_final_block = p_new;
1958
+ }
1959
+
1960
+ if (pActual_size) {
1961
+ #ifdef WIN32
1962
+ *pActual_size = ::_msize(p_final_block);
1963
+ #else
1964
+ *pActual_size = ::malloc_usable_size(p_final_block);
1965
+ #endif
1966
+ }
1967
+ }
1968
+
1969
+ return p_new;
1970
+ }
1971
+
1972
+ static size_t crnd_default_msize(void* p, void* pUser_data) {
1973
+ // pUser_data;
1974
+ #ifdef WIN32
1975
+ return p ? _msize(p) : 0;
1976
+ #else
1977
+ return p ? malloc_usable_size(p) : 0;
1978
+ #endif
1979
+ }
1980
+
1981
+ static crnd_realloc_func g_pRealloc = crnd_default_realloc;
1982
+ static crnd_msize_func g_pMSize = crnd_default_msize;
1983
+ static void* g_pUser_data;
1984
+
1985
+ void crnd_set_memory_callbacks(crnd_realloc_func pRealloc, crnd_msize_func pMSize, void* pUser_data) {
1986
+ if ((!pRealloc) || (!pMSize)) {
1987
+ g_pRealloc = crnd_default_realloc;
1988
+ g_pMSize = crnd_default_msize;
1989
+ g_pUser_data = NULL;
1990
+ } else {
1991
+ g_pRealloc = pRealloc;
1992
+ g_pMSize = pMSize;
1993
+ g_pUser_data = pUser_data;
1994
+ }
1995
+ }
1996
+
1997
+ static inline void crnd_mem_error(const char* p_msg) {
1998
+ crnd_assert(p_msg, __FILE__, __LINE__);
1999
+ }
2000
+
2001
+ void* crnd_malloc(size_t size, size_t* pActual_size) {
2002
+ size = (size + sizeof(uint32) - 1U) & ~(sizeof(uint32) - 1U);
2003
+ if (!size)
2004
+ size = sizeof(uint32);
2005
+
2006
+ if (size > MAX_POSSIBLE_BLOCK_SIZE) {
2007
+ crnd_mem_error("crnd_malloc: size too big");
2008
+ return NULL;
2009
+ }
2010
+
2011
+ size_t actual_size = size;
2012
+ uint8* p_new = static_cast<uint8*>((*g_pRealloc)(NULL, size, &actual_size, true, g_pUser_data));
2013
+
2014
+ if (pActual_size)
2015
+ *pActual_size = actual_size;
2016
+
2017
+ if ((!p_new) || (actual_size < size)) {
2018
+ crnd_mem_error("crnd_malloc: out of memory");
2019
+ return NULL;
2020
+ }
2021
+
2022
+ CRND_ASSERT(((uint32) reinterpret_cast<uintptr_t>(p_new) & (CRND_MIN_ALLOC_ALIGNMENT - 1)) == 0);
2023
+
2024
+ return p_new;
2025
+ }
2026
+
2027
+ void* crnd_realloc(void* p, size_t size, size_t* pActual_size, bool movable) {
2028
+ if ((uint32) reinterpret_cast<uintptr_t>(p) & (CRND_MIN_ALLOC_ALIGNMENT - 1)) {
2029
+ crnd_mem_error("crnd_realloc: bad ptr");
2030
+ return NULL;
2031
+ }
2032
+
2033
+ if (size > MAX_POSSIBLE_BLOCK_SIZE) {
2034
+ crnd_mem_error("crnd_malloc: size too big");
2035
+ return NULL;
2036
+ }
2037
+
2038
+ size_t actual_size = size;
2039
+ void* p_new = (*g_pRealloc)(p, size, &actual_size, movable, g_pUser_data);
2040
+
2041
+ if (pActual_size)
2042
+ *pActual_size = actual_size;
2043
+
2044
+ CRND_ASSERT(((uint32) reinterpret_cast<uintptr_t>(p_new) & (CRND_MIN_ALLOC_ALIGNMENT - 1)) == 0);
2045
+
2046
+ return p_new;
2047
+ }
2048
+
2049
+ void crnd_free(void* p) {
2050
+ if (!p)
2051
+ return;
2052
+
2053
+ if ((uint32) reinterpret_cast<uintptr_t>(p) & (CRND_MIN_ALLOC_ALIGNMENT - 1)) {
2054
+ crnd_mem_error("crnd_free: bad ptr");
2055
+ return;
2056
+ }
2057
+
2058
+ (*g_pRealloc)(p, 0, NULL, true, g_pUser_data);
2059
+ }
2060
+
2061
+ size_t crnd_msize(void* p) {
2062
+ if (!p)
2063
+ return 0;
2064
+
2065
+ if ((uint32) reinterpret_cast<uintptr_t>(p) & (CRND_MIN_ALLOC_ALIGNMENT - 1)) {
2066
+ crnd_mem_error("crnd_msize: bad ptr");
2067
+ return 0;
2068
+ }
2069
+
2070
+ return (*g_pMSize)(p, g_pUser_data);
2071
+ }
2072
+
2073
+ } // namespace crnd
2074
+
2075
+ // File: crnd_math.cpp
2076
+ namespace crnd {
2077
+ namespace math {
2078
+ uint32 g_bitmasks[32] =
2079
+ {
2080
+ 1U << 0U, 1U << 1U, 1U << 2U, 1U << 3U,
2081
+ 1U << 4U, 1U << 5U, 1U << 6U, 1U << 7U,
2082
+ 1U << 8U, 1U << 9U, 1U << 10U, 1U << 11U,
2083
+ 1U << 12U, 1U << 13U, 1U << 14U, 1U << 15U,
2084
+ 1U << 16U, 1U << 17U, 1U << 18U, 1U << 19U,
2085
+ 1U << 20U, 1U << 21U, 1U << 22U, 1U << 23U,
2086
+ 1U << 24U, 1U << 25U, 1U << 26U, 1U << 27U,
2087
+ 1U << 28U, 1U << 29U, 1U << 30U, 1U << 31U};
2088
+
2089
+ } // namespace math
2090
+ } // namespace crnd
2091
+
2092
+ // File: crnd_info.cpp
2093
+ namespace crnd {
2094
+ #define CRND_FOURCC(a, b, c, d) ((a) | ((b) << 8U) | ((c) << 16U) | ((d) << 24U))
2095
+
2096
+ uint32 crnd_crn_format_to_fourcc(crn_format fmt) {
2097
+ switch (fmt) {
2098
+ case cCRNFmtDXT1:
2099
+ return CRND_FOURCC('D', 'X', 'T', '1');
2100
+ case cCRNFmtDXT3:
2101
+ return CRND_FOURCC('D', 'X', 'T', '3');
2102
+ case cCRNFmtDXT5:
2103
+ return CRND_FOURCC('D', 'X', 'T', '5');
2104
+ case cCRNFmtDXN_XY:
2105
+ return CRND_FOURCC('A', '2', 'X', 'Y');
2106
+ case cCRNFmtDXN_YX:
2107
+ return CRND_FOURCC('A', 'T', 'I', '2');
2108
+ case cCRNFmtDXT5A:
2109
+ return CRND_FOURCC('A', 'T', 'I', '1');
2110
+ case cCRNFmtDXT5_CCxY:
2111
+ return CRND_FOURCC('C', 'C', 'x', 'Y');
2112
+ case cCRNFmtDXT5_xGxR:
2113
+ return CRND_FOURCC('x', 'G', 'x', 'R');
2114
+ case cCRNFmtDXT5_xGBR:
2115
+ return CRND_FOURCC('x', 'G', 'B', 'R');
2116
+ case cCRNFmtDXT5_AGBR:
2117
+ return CRND_FOURCC('A', 'G', 'B', 'R');
2118
+ case cCRNFmtETC1:
2119
+ return CRND_FOURCC('E', 'T', 'C', '1');
2120
+ case cCRNFmtETC2:
2121
+ return CRND_FOURCC('E', 'T', 'C', '2');
2122
+ case cCRNFmtETC2A:
2123
+ return CRND_FOURCC('E', 'T', '2', 'A');
2124
+ case cCRNFmtETC1S:
2125
+ return CRND_FOURCC('E', 'T', '1', 'S');
2126
+ case cCRNFmtETC2AS:
2127
+ return CRND_FOURCC('E', '2', 'A', 'S');
2128
+ default:
2129
+ break;
2130
+ }
2131
+ CRND_ASSERT(false);
2132
+ return 0;
2133
+ }
2134
+
2135
+ crn_format crnd_get_fundamental_dxt_format(crn_format fmt) {
2136
+ switch (fmt) {
2137
+ case cCRNFmtDXT5_CCxY:
2138
+ case cCRNFmtDXT5_xGxR:
2139
+ case cCRNFmtDXT5_xGBR:
2140
+ case cCRNFmtDXT5_AGBR:
2141
+ return cCRNFmtDXT5;
2142
+ default:
2143
+ break;
2144
+ }
2145
+ return fmt;
2146
+ }
2147
+
2148
+ uint32 crnd_get_crn_format_bits_per_texel(crn_format fmt) {
2149
+ switch (fmt) {
2150
+ case cCRNFmtDXT1:
2151
+ case cCRNFmtDXT5A:
2152
+ case cCRNFmtETC1:
2153
+ case cCRNFmtETC2:
2154
+ case cCRNFmtETC1S:
2155
+ return 4;
2156
+ case cCRNFmtDXT3:
2157
+ case cCRNFmtDXT5:
2158
+ case cCRNFmtDXN_XY:
2159
+ case cCRNFmtDXN_YX:
2160
+ case cCRNFmtDXT5_CCxY:
2161
+ case cCRNFmtDXT5_xGxR:
2162
+ case cCRNFmtDXT5_xGBR:
2163
+ case cCRNFmtDXT5_AGBR:
2164
+ case cCRNFmtETC2A:
2165
+ case cCRNFmtETC2AS:
2166
+ return 8;
2167
+ default:
2168
+ break;
2169
+ }
2170
+ CRND_ASSERT(false);
2171
+ return 0;
2172
+ }
2173
+
2174
+ uint32 crnd_get_bytes_per_dxt_block(crn_format fmt) {
2175
+ return (crnd_get_crn_format_bits_per_texel(fmt) << 4) >> 3;
2176
+ }
2177
+
2178
+ // TODO: tmp_header isn't used/This function is a helper to support old headers.
2179
+ const crn_header* crnd_get_header(const void* pData, uint32 data_size) {
2180
+ if ((!pData) || (data_size < sizeof(crn_header)))
2181
+ return NULL;
2182
+
2183
+ const crn_header& file_header = *static_cast<const crn_header*>(pData);
2184
+ if (file_header.m_sig != crn_header::cCRNSigValue)
2185
+ return NULL;
2186
+
2187
+ if ((file_header.m_header_size < sizeof(crn_header)) || (data_size < file_header.m_data_size))
2188
+ return NULL;
2189
+
2190
+ return &file_header;
2191
+ }
2192
+
2193
+ bool crnd_validate_file(const void* pData, uint32 data_size, crn_file_info* pFile_info) {
2194
+ if (pFile_info) {
2195
+ if (pFile_info->m_struct_size != sizeof(crn_file_info))
2196
+ return false;
2197
+
2198
+ memset(&pFile_info->m_struct_size + 1, 0, sizeof(crn_file_info) - sizeof(pFile_info->m_struct_size));
2199
+ }
2200
+
2201
+ if ((!pData) || (data_size < cCRNHeaderMinSize))
2202
+ return false;
2203
+
2204
+ const crn_header* pHeader = crnd_get_header(pData, data_size);
2205
+ if (!pHeader)
2206
+ return false;
2207
+
2208
+ const uint32 header_crc = crc16(&pHeader->m_data_size, (uint32)(pHeader->m_header_size - ((const uint8*)&pHeader->m_data_size - (const uint8*)pHeader)));
2209
+ if (header_crc != pHeader->m_header_crc16)
2210
+ return false;
2211
+
2212
+ const uint32 data_crc = crc16((const uint8*)pData + pHeader->m_header_size, pHeader->m_data_size - pHeader->m_header_size);
2213
+ if (data_crc != pHeader->m_data_crc16)
2214
+ return false;
2215
+
2216
+ if ((pHeader->m_faces != 1) && (pHeader->m_faces != 6))
2217
+ return false;
2218
+ if ((pHeader->m_width < 1) || (pHeader->m_width > cCRNMaxLevelResolution))
2219
+ return false;
2220
+ if ((pHeader->m_height < 1) || (pHeader->m_height > cCRNMaxLevelResolution))
2221
+ return false;
2222
+ if ((pHeader->m_levels < 1) || (pHeader->m_levels > utils::compute_max_mips(pHeader->m_width, pHeader->m_height)))
2223
+ return false;
2224
+ if (((int)pHeader->m_format < cCRNFmtDXT1) || ((int)pHeader->m_format >= cCRNFmtTotal))
2225
+ return false;
2226
+
2227
+ if (pFile_info) {
2228
+ pFile_info->m_actual_data_size = pHeader->m_data_size;
2229
+ pFile_info->m_header_size = pHeader->m_header_size;
2230
+ pFile_info->m_total_palette_size = pHeader->m_color_endpoints.m_size + pHeader->m_color_selectors.m_size + pHeader->m_alpha_endpoints.m_size + pHeader->m_alpha_selectors.m_size;
2231
+ pFile_info->m_tables_size = pHeader->m_tables_size;
2232
+
2233
+ pFile_info->m_levels = pHeader->m_levels;
2234
+
2235
+ for (uint32 i = 0; i < pHeader->m_levels; i++) {
2236
+ uint32 next_ofs = pHeader->m_data_size;
2237
+
2238
+ // assumes the levels are packed together sequentially
2239
+ if ((i + 1) < pHeader->m_levels)
2240
+ next_ofs = pHeader->m_level_ofs[i + 1];
2241
+
2242
+ pFile_info->m_level_compressed_size[i] = next_ofs - pHeader->m_level_ofs[i];
2243
+ }
2244
+
2245
+ pFile_info->m_color_endpoint_palette_entries = pHeader->m_color_endpoints.m_num;
2246
+ pFile_info->m_color_selector_palette_entries = pHeader->m_color_selectors.m_num;
2247
+ ;
2248
+ pFile_info->m_alpha_endpoint_palette_entries = pHeader->m_alpha_endpoints.m_num;
2249
+ ;
2250
+ pFile_info->m_alpha_selector_palette_entries = pHeader->m_alpha_selectors.m_num;
2251
+ ;
2252
+ }
2253
+
2254
+ return true;
2255
+ }
2256
+
2257
+ bool crnd_get_texture_info(const void* pData, uint32 data_size, crn_texture_info* pInfo) {
2258
+ if ((!pData) || (data_size < sizeof(crn_header)) || (!pInfo))
2259
+ return false;
2260
+
2261
+ if (pInfo->m_struct_size != sizeof(crn_texture_info))
2262
+ return false;
2263
+
2264
+ const crn_header* pHeader = crnd_get_header(pData, data_size);
2265
+ if (!pHeader)
2266
+ return false;
2267
+
2268
+ pInfo->m_width = pHeader->m_width;
2269
+ pInfo->m_height = pHeader->m_height;
2270
+ pInfo->m_levels = pHeader->m_levels;
2271
+ pInfo->m_faces = pHeader->m_faces;
2272
+ pInfo->m_format = static_cast<crn_format>((uint32)pHeader->m_format);
2273
+ pInfo->m_bytes_per_block = pHeader->m_format == cCRNFmtDXT1 || pHeader->m_format == cCRNFmtDXT5A || pHeader->m_format == cCRNFmtETC1 || pHeader->m_format == cCRNFmtETC2 || pHeader->m_format == cCRNFmtETC1S ? 8 : 16;
2274
+ pInfo->m_userdata0 = pHeader->m_userdata0;
2275
+ pInfo->m_userdata1 = pHeader->m_userdata1;
2276
+
2277
+ return true;
2278
+ }
2279
+
2280
+ bool crnd_get_level_info(const void* pData, uint32 data_size, uint32 level_index, crn_level_info* pLevel_info) {
2281
+ if ((!pData) || (data_size < cCRNHeaderMinSize) || (!pLevel_info))
2282
+ return false;
2283
+
2284
+ if (pLevel_info->m_struct_size != sizeof(crn_level_info))
2285
+ return false;
2286
+
2287
+ const crn_header* pHeader = crnd_get_header(pData, data_size);
2288
+ if (!pHeader)
2289
+ return false;
2290
+
2291
+ if (level_index >= pHeader->m_levels)
2292
+ return false;
2293
+
2294
+ uint32 width = math::maximum<uint32>(1U, pHeader->m_width >> level_index);
2295
+ uint32 height = math::maximum<uint32>(1U, pHeader->m_height >> level_index);
2296
+
2297
+ pLevel_info->m_width = width;
2298
+ pLevel_info->m_height = height;
2299
+ pLevel_info->m_faces = pHeader->m_faces;
2300
+ pLevel_info->m_blocks_x = (width + 3) >> 2;
2301
+ pLevel_info->m_blocks_y = (height + 3) >> 2;
2302
+ pLevel_info->m_bytes_per_block = pHeader->m_format == cCRNFmtDXT1 || pHeader->m_format == cCRNFmtDXT5A || pHeader->m_format == cCRNFmtETC1 || pHeader->m_format == cCRNFmtETC2 || pHeader->m_format == cCRNFmtETC1S ? 8 : 16;
2303
+ pLevel_info->m_format = static_cast<crn_format>((uint32)pHeader->m_format);
2304
+
2305
+ return true;
2306
+ }
2307
+
2308
+ const void* crnd_get_level_data(const void* pData, uint32 data_size, uint32 level_index, uint32* pSize) {
2309
+ if (pSize)
2310
+ *pSize = 0;
2311
+
2312
+ if ((!pData) || (data_size < cCRNHeaderMinSize))
2313
+ return NULL;
2314
+
2315
+ const crn_header* pHeader = crnd_get_header(pData, data_size);
2316
+ if (!pHeader)
2317
+ return NULL;
2318
+
2319
+ if (level_index >= pHeader->m_levels)
2320
+ return NULL;
2321
+
2322
+ uint32 cur_level_ofs = pHeader->m_level_ofs[level_index];
2323
+
2324
+ if (pSize) {
2325
+ uint32 next_level_ofs = data_size;
2326
+ if ((level_index + 1) < (pHeader->m_levels))
2327
+ next_level_ofs = pHeader->m_level_ofs[level_index + 1];
2328
+
2329
+ *pSize = next_level_ofs - cur_level_ofs;
2330
+ }
2331
+
2332
+ return static_cast<const uint8*>(pData) + cur_level_ofs;
2333
+ }
2334
+
2335
+ uint32 crnd_get_segmented_file_size(const void* pData, uint32 data_size) {
2336
+ if ((!pData) || (data_size < cCRNHeaderMinSize))
2337
+ return false;
2338
+
2339
+ const crn_header* pHeader = crnd_get_header(pData, data_size);
2340
+ if (!pHeader)
2341
+ return false;
2342
+
2343
+ uint32 size = pHeader->m_header_size;
2344
+
2345
+ size = math::maximum(size, pHeader->m_color_endpoints.m_ofs + pHeader->m_color_endpoints.m_size);
2346
+ size = math::maximum(size, pHeader->m_color_selectors.m_ofs + pHeader->m_color_selectors.m_size);
2347
+ size = math::maximum(size, pHeader->m_alpha_endpoints.m_ofs + pHeader->m_alpha_endpoints.m_size);
2348
+ size = math::maximum(size, pHeader->m_alpha_selectors.m_ofs + pHeader->m_alpha_selectors.m_size);
2349
+ size = math::maximum(size, pHeader->m_tables_ofs + pHeader->m_tables_size);
2350
+
2351
+ return size;
2352
+ }
2353
+
2354
+ bool crnd_create_segmented_file(const void* pData, uint32 data_size, void* pBase_data, uint base_data_size) {
2355
+ if ((!pData) || (data_size < cCRNHeaderMinSize))
2356
+ return false;
2357
+
2358
+ const crn_header* pHeader = crnd_get_header(pData, data_size);
2359
+ if (!pHeader)
2360
+ return false;
2361
+
2362
+ if (pHeader->m_flags & cCRNHeaderFlagSegmented)
2363
+ return false;
2364
+
2365
+ const uint actual_base_data_size = crnd_get_segmented_file_size(pData, data_size);
2366
+ if (base_data_size < actual_base_data_size)
2367
+ return false;
2368
+
2369
+ memcpy(pBase_data, pData, actual_base_data_size);
2370
+
2371
+ crn_header& new_header = *static_cast<crn_header*>(pBase_data);
2372
+ new_header.m_flags = new_header.m_flags | cCRNHeaderFlagSegmented;
2373
+ new_header.m_data_size = actual_base_data_size;
2374
+
2375
+ new_header.m_data_crc16 = crc16((const uint8*)pBase_data + new_header.m_header_size, new_header.m_data_size - new_header.m_header_size);
2376
+
2377
+ new_header.m_header_crc16 = crc16(&new_header.m_data_size, new_header.m_header_size - (uint32)((const uint8*)&new_header.m_data_size - (const uint8*)&new_header));
2378
+
2379
+ CRND_ASSERT(crnd_validate_file(&new_header, actual_base_data_size, NULL));
2380
+
2381
+ return true;
2382
+ }
2383
+
2384
+ } // namespace crnd
2385
+
2386
+ // File: symbol_codec.cpp
2387
+ namespace crnd {
2388
+ static_huffman_data_model::static_huffman_data_model()
2389
+ : m_total_syms(0),
2390
+ m_pDecode_tables(NULL) {
2391
+ }
2392
+
2393
+ static_huffman_data_model::static_huffman_data_model(const static_huffman_data_model& other)
2394
+ : m_total_syms(0),
2395
+ m_pDecode_tables(NULL) {
2396
+ *this = other;
2397
+ }
2398
+
2399
+ static_huffman_data_model::~static_huffman_data_model() {
2400
+ if (m_pDecode_tables)
2401
+ crnd_delete(m_pDecode_tables);
2402
+ }
2403
+
2404
+ static_huffman_data_model& static_huffman_data_model::operator=(const static_huffman_data_model& rhs) {
2405
+ if (this == &rhs)
2406
+ return *this;
2407
+
2408
+ m_total_syms = rhs.m_total_syms;
2409
+ m_code_sizes = rhs.m_code_sizes;
2410
+ if (m_code_sizes.get_alloc_failed()) {
2411
+ clear();
2412
+ return *this;
2413
+ }
2414
+
2415
+ if (rhs.m_pDecode_tables) {
2416
+ if (m_pDecode_tables)
2417
+ *m_pDecode_tables = *rhs.m_pDecode_tables;
2418
+ else
2419
+ m_pDecode_tables = crnd_new<prefix_coding::decoder_tables>(*rhs.m_pDecode_tables);
2420
+ } else {
2421
+ crnd_delete(m_pDecode_tables);
2422
+ m_pDecode_tables = NULL;
2423
+ }
2424
+
2425
+ return *this;
2426
+ }
2427
+
2428
+ void static_huffman_data_model::clear() {
2429
+ m_total_syms = 0;
2430
+ m_code_sizes.clear();
2431
+ if (m_pDecode_tables) {
2432
+ crnd_delete(m_pDecode_tables);
2433
+ m_pDecode_tables = NULL;
2434
+ }
2435
+ }
2436
+
2437
+ bool static_huffman_data_model::init(uint32 total_syms, const uint8* pCode_sizes, uint32 code_size_limit) {
2438
+ CRND_ASSERT((total_syms >= 1) && (total_syms <= prefix_coding::cMaxSupportedSyms) && (code_size_limit >= 1));
2439
+
2440
+ code_size_limit = math::minimum(code_size_limit, prefix_coding::cMaxExpectedCodeSize);
2441
+
2442
+ if (!m_code_sizes.resize(total_syms))
2443
+ return false;
2444
+
2445
+ uint32 min_code_size = cUINT32_MAX;
2446
+ uint32 max_code_size = 0;
2447
+
2448
+ for (uint32 i = 0; i < total_syms; i++) {
2449
+ uint32 s = pCode_sizes[i];
2450
+ m_code_sizes[i] = static_cast<uint8>(s);
2451
+ min_code_size = math::minimum(min_code_size, s);
2452
+ max_code_size = math::maximum(max_code_size, s);
2453
+ }
2454
+
2455
+ if ((max_code_size < 1) || (max_code_size > 32) || (min_code_size > code_size_limit))
2456
+ return false;
2457
+
2458
+ if (max_code_size > code_size_limit)
2459
+ return false;
2460
+
2461
+ if (!m_pDecode_tables)
2462
+ m_pDecode_tables = crnd_new<prefix_coding::decoder_tables>();
2463
+
2464
+ if (!m_pDecode_tables->init(m_total_syms, &m_code_sizes[0], compute_decoder_table_bits()))
2465
+ return false;
2466
+
2467
+ return true;
2468
+ }
2469
+
2470
+ bool static_huffman_data_model::prepare_decoder_tables() {
2471
+ uint32 total_syms = m_code_sizes.size();
2472
+
2473
+ CRND_ASSERT((total_syms >= 1) && (total_syms <= prefix_coding::cMaxSupportedSyms));
2474
+
2475
+ m_total_syms = total_syms;
2476
+
2477
+ if (!m_pDecode_tables)
2478
+ m_pDecode_tables = crnd_new<prefix_coding::decoder_tables>();
2479
+
2480
+ return m_pDecode_tables->init(m_total_syms, &m_code_sizes[0], compute_decoder_table_bits());
2481
+ }
2482
+
2483
+ uint static_huffman_data_model::compute_decoder_table_bits() const {
2484
+ #if CRND_PREFIX_CODING_USE_FIXED_TABLE_SIZE
2485
+ return prefix_coding::cMaxTableBits;
2486
+ #else
2487
+ uint32 decoder_table_bits = 0;
2488
+ if (m_total_syms > 16)
2489
+ decoder_table_bits = static_cast<uint8>(math::minimum(1 + math::ceil_log2i(m_total_syms), prefix_coding::cMaxTableBits));
2490
+ return decoder_table_bits;
2491
+ #endif
2492
+ }
2493
+
2494
+ symbol_codec::symbol_codec()
2495
+ : m_pDecode_buf(NULL),
2496
+ m_pDecode_buf_next(NULL),
2497
+ m_pDecode_buf_end(NULL),
2498
+ m_decode_buf_size(0),
2499
+ m_bit_buf(0),
2500
+ m_bit_count(0) {
2501
+ }
2502
+
2503
+ // Code length encoding symbols:
2504
+ // 0-16 - actual code lengths
2505
+ const uint32 cMaxCodelengthCodes = 21;
2506
+
2507
+ const uint32 cSmallZeroRunCode = 17;
2508
+ const uint32 cLargeZeroRunCode = 18;
2509
+ const uint32 cSmallRepeatCode = 19;
2510
+ const uint32 cLargeRepeatCode = 20;
2511
+
2512
+ const uint32 cMinSmallZeroRunSize = 3;
2513
+ const uint32 cMaxSmallZeroRunSize = 10;
2514
+ const uint32 cMinLargeZeroRunSize = 11;
2515
+ const uint32 cMaxLargeZeroRunSize = 138;
2516
+
2517
+ const uint32 cSmallMinNonZeroRunSize = 3;
2518
+ const uint32 cSmallMaxNonZeroRunSize = 6;
2519
+ const uint32 cLargeMinNonZeroRunSize = 7;
2520
+ const uint32 cLargeMaxNonZeroRunSize = 70;
2521
+
2522
+ const uint32 cSmallZeroRunExtraBits = 3;
2523
+ const uint32 cLargeZeroRunExtraBits = 7;
2524
+ const uint32 cSmallNonZeroRunExtraBits = 2;
2525
+ const uint32 cLargeNonZeroRunExtraBits = 6;
2526
+
2527
+ static const uint8 g_most_probable_codelength_codes[] =
2528
+ {
2529
+ cSmallZeroRunCode, cLargeZeroRunCode,
2530
+ cSmallRepeatCode, cLargeRepeatCode,
2531
+
2532
+ 0, 8,
2533
+ 7, 9,
2534
+ 6, 10,
2535
+ 5, 11,
2536
+ 4, 12,
2537
+ 3, 13,
2538
+ 2, 14,
2539
+ 1, 15,
2540
+ 16};
2541
+ const uint32 cNumMostProbableCodelengthCodes = sizeof(g_most_probable_codelength_codes) / sizeof(g_most_probable_codelength_codes[0]);
2542
+
2543
+ bool symbol_codec::decode_receive_static_data_model(static_huffman_data_model& model) {
2544
+ const uint32 total_used_syms = decode_bits(math::total_bits(prefix_coding::cMaxSupportedSyms));
2545
+
2546
+ if (!total_used_syms) {
2547
+ model.clear();
2548
+ return true;
2549
+ }
2550
+
2551
+ if (!model.m_code_sizes.resize(total_used_syms))
2552
+ return false;
2553
+
2554
+ memset(&model.m_code_sizes[0], 0, sizeof(model.m_code_sizes[0]) * total_used_syms);
2555
+
2556
+ const uint32 num_codelength_codes_to_send = decode_bits(5);
2557
+ if ((num_codelength_codes_to_send < 1) || (num_codelength_codes_to_send > cMaxCodelengthCodes))
2558
+ return false;
2559
+
2560
+ static_huffman_data_model dm;
2561
+ if (!dm.m_code_sizes.resize(cMaxCodelengthCodes))
2562
+ return false;
2563
+
2564
+ for (uint32 i = 0; i < num_codelength_codes_to_send; i++)
2565
+ dm.m_code_sizes[g_most_probable_codelength_codes[i]] = static_cast<uint8>(decode_bits(3));
2566
+
2567
+ if (!dm.prepare_decoder_tables())
2568
+ return false;
2569
+
2570
+ uint32 ofs = 0;
2571
+ while (ofs < total_used_syms) {
2572
+ const uint32 num_remaining = total_used_syms - ofs;
2573
+
2574
+ uint32 code = decode(dm);
2575
+ if (code <= 16)
2576
+ model.m_code_sizes[ofs++] = static_cast<uint8>(code);
2577
+ else if (code == cSmallZeroRunCode) {
2578
+ uint32 len = decode_bits(cSmallZeroRunExtraBits) + cMinSmallZeroRunSize;
2579
+ if (len > num_remaining)
2580
+ return false;
2581
+ ofs += len;
2582
+ } else if (code == cLargeZeroRunCode) {
2583
+ uint32 len = decode_bits(cLargeZeroRunExtraBits) + cMinLargeZeroRunSize;
2584
+ if (len > num_remaining)
2585
+ return false;
2586
+ ofs += len;
2587
+ } else if ((code == cSmallRepeatCode) || (code == cLargeRepeatCode)) {
2588
+ uint32 len;
2589
+ if (code == cSmallRepeatCode)
2590
+ len = decode_bits(cSmallNonZeroRunExtraBits) + cSmallMinNonZeroRunSize;
2591
+ else
2592
+ len = decode_bits(cLargeNonZeroRunExtraBits) + cLargeMinNonZeroRunSize;
2593
+
2594
+ if ((!ofs) || (len > num_remaining))
2595
+ return false;
2596
+ const uint32 prev = model.m_code_sizes[ofs - 1];
2597
+ if (!prev)
2598
+ return false;
2599
+ const uint32 end = ofs + len;
2600
+ while (ofs < end)
2601
+ model.m_code_sizes[ofs++] = static_cast<uint8>(prev);
2602
+ } else {
2603
+ CRND_ASSERT(0);
2604
+ return false;
2605
+ }
2606
+ }
2607
+
2608
+ if (ofs != total_used_syms)
2609
+ return false;
2610
+
2611
+ return model.prepare_decoder_tables();
2612
+ }
2613
+
2614
+ bool symbol_codec::start_decoding(const uint8* pBuf, uint32 buf_size) {
2615
+ if (!buf_size)
2616
+ return false;
2617
+
2618
+ m_pDecode_buf = pBuf;
2619
+ m_pDecode_buf_next = pBuf;
2620
+ m_decode_buf_size = buf_size;
2621
+ m_pDecode_buf_end = pBuf + buf_size;
2622
+
2623
+ get_bits_init();
2624
+
2625
+ return true;
2626
+ }
2627
+
2628
+ void symbol_codec::get_bits_init() {
2629
+ m_bit_buf = 0;
2630
+ m_bit_count = 0;
2631
+ }
2632
+
2633
+ uint32 symbol_codec::decode_bits(uint32 num_bits) {
2634
+ if (!num_bits)
2635
+ return 0;
2636
+
2637
+ if (num_bits > 16) {
2638
+ uint32 a = get_bits(num_bits - 16);
2639
+ uint32 b = get_bits(16);
2640
+
2641
+ return (a << 16) | b;
2642
+ } else
2643
+ return get_bits(num_bits);
2644
+ }
2645
+
2646
+ uint32 symbol_codec::get_bits(uint32 num_bits) {
2647
+ CRND_ASSERT(num_bits <= 32U);
2648
+
2649
+ while (m_bit_count < (int)num_bits) {
2650
+ bit_buf_type c = 0;
2651
+ if (m_pDecode_buf_next != m_pDecode_buf_end)
2652
+ c = *m_pDecode_buf_next++;
2653
+
2654
+ m_bit_count += 8;
2655
+ CRND_ASSERT(m_bit_count <= cBitBufSize);
2656
+
2657
+ m_bit_buf |= (c << (cBitBufSize - m_bit_count));
2658
+ }
2659
+
2660
+ uint32 result = static_cast<uint32>(m_bit_buf >> (cBitBufSize - num_bits));
2661
+
2662
+ m_bit_buf <<= num_bits;
2663
+ m_bit_count -= num_bits;
2664
+
2665
+ return result;
2666
+ }
2667
+
2668
+ uint32 symbol_codec::decode(const static_huffman_data_model& model) {
2669
+ const prefix_coding::decoder_tables* pTables = model.m_pDecode_tables;
2670
+
2671
+ if (m_bit_count < 24) {
2672
+ if (m_bit_count < 16) {
2673
+ uint32 c0 = 0, c1 = 0;
2674
+ const uint8* p = m_pDecode_buf_next;
2675
+ if (p < m_pDecode_buf_end)
2676
+ c0 = *p++;
2677
+ if (p < m_pDecode_buf_end)
2678
+ c1 = *p++;
2679
+ m_pDecode_buf_next = p;
2680
+ m_bit_count += 16;
2681
+ uint32 c = (c0 << 8) | c1;
2682
+ m_bit_buf |= (c << (32 - m_bit_count));
2683
+ } else {
2684
+ uint32 c = (m_pDecode_buf_next < m_pDecode_buf_end) ? *m_pDecode_buf_next++ : 0;
2685
+ m_bit_count += 8;
2686
+ m_bit_buf |= (c << (32 - m_bit_count));
2687
+ }
2688
+ }
2689
+
2690
+ uint32 k = (m_bit_buf >> 16) + 1;
2691
+ uint32 sym, len;
2692
+
2693
+ if (k <= pTables->m_table_max_code) {
2694
+ uint32 t = pTables->m_lookup[m_bit_buf >> (32 - pTables->m_table_bits)];
2695
+
2696
+ CRND_ASSERT(t != cUINT32_MAX);
2697
+ sym = t & cUINT16_MAX;
2698
+ len = t >> 16;
2699
+
2700
+ CRND_ASSERT(model.m_code_sizes[sym] == len);
2701
+ } else {
2702
+ len = pTables->m_decode_start_code_size;
2703
+
2704
+ for (;;) {
2705
+ if (k <= pTables->m_max_codes[len - 1])
2706
+ break;
2707
+ len++;
2708
+ }
2709
+
2710
+ int val_ptr = pTables->m_val_ptrs[len - 1] + (m_bit_buf >> (32 - len));
2711
+
2712
+ if (((uint32)val_ptr >= model.m_total_syms)) {
2713
+ // corrupted stream, or a bug
2714
+ CRND_ASSERT(0);
2715
+ return 0;
2716
+ }
2717
+
2718
+ sym = pTables->m_sorted_symbol_order[val_ptr];
2719
+ }
2720
+
2721
+ m_bit_buf <<= len;
2722
+ m_bit_count -= len;
2723
+
2724
+ return sym;
2725
+ }
2726
+
2727
+ uint64 symbol_codec::stop_decoding() {
2728
+ return static_cast<uint64>(m_pDecode_buf_next - m_pDecode_buf);
2729
+ }
2730
+
2731
+ } // namespace crnd
2732
+
2733
+ // File: crnd_dxt.cpp
2734
+ namespace crnd {
2735
+ const uint8 g_dxt1_to_linear[cDXT1SelectorValues] = {0U, 3U, 1U, 2U};
2736
+ const uint8 g_dxt1_from_linear[cDXT1SelectorValues] = {0U, 2U, 3U, 1U};
2737
+ const uint8 g_etc1_from_linear[cDXT1SelectorValues] = {3U, 2U, 0U, 1U};
2738
+
2739
+ const uint8 g_dxt5_to_linear[cDXT5SelectorValues] = {0U, 7U, 1U, 2U, 3U, 4U, 5U, 6U};
2740
+ const uint8 g_dxt5_from_linear[cDXT5SelectorValues] = {0U, 2U, 3U, 4U, 5U, 6U, 7U, 1U};
2741
+
2742
+ const uint8 g_six_alpha_invert_table[cDXT5SelectorValues] = {1, 0, 5, 4, 3, 2, 6, 7};
2743
+ const uint8 g_eight_alpha_invert_table[cDXT5SelectorValues] = {1, 0, 7, 6, 5, 4, 3, 2};
2744
+
2745
+ uint16 dxt1_block::pack_color(const color_quad_u8& color, bool scaled, uint32 bias) {
2746
+ uint32 r = color.r;
2747
+ uint32 g = color.g;
2748
+ uint32 b = color.b;
2749
+
2750
+ if (scaled) {
2751
+ r = (r * 31U + bias) / 255U;
2752
+ g = (g * 63U + bias) / 255U;
2753
+ b = (b * 31U + bias) / 255U;
2754
+ }
2755
+
2756
+ r = math::minimum(r, 31U);
2757
+ g = math::minimum(g, 63U);
2758
+ b = math::minimum(b, 31U);
2759
+
2760
+ return static_cast<uint16>(b | (g << 5U) | (r << 11U));
2761
+ }
2762
+
2763
+ uint16 dxt1_block::pack_color(uint32 r, uint32 g, uint32 b, bool scaled, uint32 bias) {
2764
+ return pack_color(color_quad_u8(r, g, b, 0), scaled, bias);
2765
+ }
2766
+
2767
+ color_quad_u8 dxt1_block::unpack_color(uint16 packed_color, bool scaled, uint32 alpha) {
2768
+ uint32 b = packed_color & 31U;
2769
+ uint32 g = (packed_color >> 5U) & 63U;
2770
+ uint32 r = (packed_color >> 11U) & 31U;
2771
+
2772
+ if (scaled) {
2773
+ b = (b << 3U) | (b >> 2U);
2774
+ g = (g << 2U) | (g >> 4U);
2775
+ r = (r << 3U) | (r >> 2U);
2776
+ }
2777
+
2778
+ return color_quad_u8(r, g, b, alpha);
2779
+ }
2780
+
2781
+ void dxt1_block::unpack_color(uint32& r, uint32& g, uint32& b, uint16 packed_color, bool scaled) {
2782
+ color_quad_u8 c(unpack_color(packed_color, scaled, 0));
2783
+ r = c.r;
2784
+ g = c.g;
2785
+ b = c.b;
2786
+ }
2787
+
2788
+ uint32 dxt1_block::get_block_colors3(color_quad_u8* pDst, uint16 color0, uint16 color1) {
2789
+ color_quad_u8 c0(unpack_color(color0, true));
2790
+ color_quad_u8 c1(unpack_color(color1, true));
2791
+
2792
+ pDst[0] = c0;
2793
+ pDst[1] = c1;
2794
+ pDst[2].set((c0.r + c1.r) >> 1U, (c0.g + c1.g) >> 1U, (c0.b + c1.b) >> 1U, 255U);
2795
+ pDst[3].set(0, 0, 0, 0);
2796
+
2797
+ return 3;
2798
+ }
2799
+
2800
+ uint32 dxt1_block::get_block_colors4(color_quad_u8* pDst, uint16 color0, uint16 color1) {
2801
+ color_quad_u8 c0(unpack_color(color0, true));
2802
+ color_quad_u8 c1(unpack_color(color1, true));
2803
+
2804
+ pDst[0] = c0;
2805
+ pDst[1] = c1;
2806
+
2807
+ // 12/14/09 - Supposed to round according to DX docs, but this conflicts with the OpenGL S3TC spec. ?
2808
+ // Turns out some GPU's round and some don't. Great.
2809
+ //pDst[2].set( (c0.r * 2 + c1.r + 1) / 3, (c0.g * 2 + c1.g + 1) / 3, (c0.b * 2 + c1.b + 1) / 3, 255U);
2810
+ //pDst[3].set( (c1.r * 2 + c0.r + 1) / 3, (c1.g * 2 + c0.g + 1) / 3, (c1.b * 2 + c0.b + 1) / 3, 255U);
2811
+
2812
+ pDst[2].set((c0.r * 2 + c1.r) / 3, (c0.g * 2 + c1.g) / 3, (c0.b * 2 + c1.b) / 3, 255U);
2813
+ pDst[3].set((c1.r * 2 + c0.r) / 3, (c1.g * 2 + c0.g) / 3, (c1.b * 2 + c0.b) / 3, 255U);
2814
+
2815
+ return 4;
2816
+ }
2817
+
2818
+ uint32 dxt1_block::get_block_colors(color_quad_u8* pDst, uint16 color0, uint16 color1) {
2819
+ if (color0 > color1)
2820
+ return get_block_colors4(pDst, color0, color1);
2821
+ else
2822
+ return get_block_colors3(pDst, color0, color1);
2823
+ }
2824
+
2825
+ color_quad_u8 dxt1_block::unpack_endpoint(uint32 endpoints, uint32 index, bool scaled, uint32 alpha) {
2826
+ CRND_ASSERT(index < 2);
2827
+ return unpack_color(static_cast<uint16>((endpoints >> (index * 16U)) & 0xFFFFU), scaled, alpha);
2828
+ }
2829
+
2830
+ uint32 dxt1_block::pack_endpoints(uint32 lo, uint32 hi) {
2831
+ CRND_ASSERT((lo <= 0xFFFFU) && (hi <= 0xFFFFU));
2832
+ return lo | (hi << 16U);
2833
+ }
2834
+
2835
+ void dxt3_block::set_alpha(uint32 x, uint32 y, uint32 value, bool scaled) {
2836
+ CRND_ASSERT((x < cDXTBlockSize) && (y < cDXTBlockSize));
2837
+
2838
+ if (scaled) {
2839
+ CRND_ASSERT(value <= 0xFF);
2840
+ value = (value * 15U + 128U) / 255U;
2841
+ } else {
2842
+ CRND_ASSERT(value <= 0xF);
2843
+ }
2844
+
2845
+ uint32 ofs = (y << 1U) + (x >> 1U);
2846
+ uint32 c = m_alpha[ofs];
2847
+
2848
+ c &= ~(0xF << ((x & 1U) << 2U));
2849
+ c |= (value << ((x & 1U) << 2U));
2850
+
2851
+ m_alpha[ofs] = static_cast<uint8>(c);
2852
+ }
2853
+
2854
+ uint32 dxt3_block::get_alpha(uint32 x, uint32 y, bool scaled) const {
2855
+ CRND_ASSERT((x < cDXTBlockSize) && (y < cDXTBlockSize));
2856
+
2857
+ uint32 value = m_alpha[(y << 1U) + (x >> 1U)];
2858
+ if (x & 1)
2859
+ value >>= 4;
2860
+ value &= 0xF;
2861
+
2862
+ if (scaled)
2863
+ value = (value << 4U) | value;
2864
+
2865
+ return value;
2866
+ }
2867
+
2868
+ uint32 dxt5_block::get_block_values6(color_quad_u8* pDst, uint32 l, uint32 h) {
2869
+ pDst[0].a = static_cast<uint8>(l);
2870
+ pDst[1].a = static_cast<uint8>(h);
2871
+ pDst[2].a = static_cast<uint8>((l * 4 + h) / 5);
2872
+ pDst[3].a = static_cast<uint8>((l * 3 + h * 2) / 5);
2873
+ pDst[4].a = static_cast<uint8>((l * 2 + h * 3) / 5);
2874
+ pDst[5].a = static_cast<uint8>((l + h * 4) / 5);
2875
+ pDst[6].a = 0;
2876
+ pDst[7].a = 255;
2877
+ return 6;
2878
+ }
2879
+
2880
+ uint32 dxt5_block::get_block_values8(color_quad_u8* pDst, uint32 l, uint32 h) {
2881
+ pDst[0].a = static_cast<uint8>(l);
2882
+ pDst[1].a = static_cast<uint8>(h);
2883
+ pDst[2].a = static_cast<uint8>((l * 6 + h) / 7);
2884
+ pDst[3].a = static_cast<uint8>((l * 5 + h * 2) / 7);
2885
+ pDst[4].a = static_cast<uint8>((l * 4 + h * 3) / 7);
2886
+ pDst[5].a = static_cast<uint8>((l * 3 + h * 4) / 7);
2887
+ pDst[6].a = static_cast<uint8>((l * 2 + h * 5) / 7);
2888
+ pDst[7].a = static_cast<uint8>((l + h * 6) / 7);
2889
+ return 8;
2890
+ }
2891
+
2892
+ uint32 dxt5_block::get_block_values(color_quad_u8* pDst, uint32 l, uint32 h) {
2893
+ if (l > h)
2894
+ return get_block_values8(pDst, l, h);
2895
+ else
2896
+ return get_block_values6(pDst, l, h);
2897
+ }
2898
+
2899
+ uint32 dxt5_block::get_block_values6(uint32* pDst, uint32 l, uint32 h) {
2900
+ pDst[0] = l;
2901
+ pDst[1] = h;
2902
+ pDst[2] = (l * 4 + h) / 5;
2903
+ pDst[3] = (l * 3 + h * 2) / 5;
2904
+ pDst[4] = (l * 2 + h * 3) / 5;
2905
+ pDst[5] = (l + h * 4) / 5;
2906
+ pDst[6] = 0;
2907
+ pDst[7] = 255;
2908
+ return 6;
2909
+ }
2910
+
2911
+ uint32 dxt5_block::get_block_values8(uint32* pDst, uint32 l, uint32 h) {
2912
+ pDst[0] = l;
2913
+ pDst[1] = h;
2914
+ pDst[2] = (l * 6 + h) / 7;
2915
+ pDst[3] = (l * 5 + h * 2) / 7;
2916
+ pDst[4] = (l * 4 + h * 3) / 7;
2917
+ pDst[5] = (l * 3 + h * 4) / 7;
2918
+ pDst[6] = (l * 2 + h * 5) / 7;
2919
+ pDst[7] = (l + h * 6) / 7;
2920
+ return 8;
2921
+ }
2922
+
2923
+ uint32 dxt5_block::unpack_endpoint(uint32 packed, uint32 index) {
2924
+ CRND_ASSERT(index < 2);
2925
+ return (packed >> (8 * index)) & 0xFF;
2926
+ }
2927
+
2928
+ uint32 dxt5_block::pack_endpoints(uint32 lo, uint32 hi) {
2929
+ CRND_ASSERT((lo <= 0xFF) && (hi <= 0xFF));
2930
+ return lo | (hi << 8U);
2931
+ }
2932
+
2933
+ uint32 dxt5_block::get_block_values(uint32* pDst, uint32 l, uint32 h) {
2934
+ if (l > h)
2935
+ return get_block_values8(pDst, l, h);
2936
+ else
2937
+ return get_block_values6(pDst, l, h);
2938
+ }
2939
+
2940
+ } // namespace crnd
2941
+
2942
+ // File: crnd_decode.cpp
2943
+
2944
+ namespace crnd {
2945
+
2946
+ class crn_unpacker {
2947
+ public:
2948
+ inline crn_unpacker()
2949
+ : m_magic(cMagicValue),
2950
+ m_pData(NULL),
2951
+ m_data_size(0),
2952
+ m_pHeader(NULL) {
2953
+ }
2954
+
2955
+ inline ~crn_unpacker() {
2956
+ m_magic = 0;
2957
+ }
2958
+
2959
+ inline bool is_valid() const { return m_magic == cMagicValue; }
2960
+
2961
+ bool init(const void* pData, uint32 data_size) {
2962
+ m_pHeader = crnd_get_header(pData, data_size);
2963
+ if (!m_pHeader)
2964
+ return false;
2965
+
2966
+ m_pData = static_cast<const uint8*>(pData);
2967
+ m_data_size = data_size;
2968
+
2969
+ if (!init_tables())
2970
+ return false;
2971
+
2972
+ if (!decode_palettes())
2973
+ return false;
2974
+
2975
+ return true;
2976
+ }
2977
+
2978
+ bool unpack_level(
2979
+ void** pDst, uint32 dst_size_in_bytes, uint32 row_pitch_in_bytes,
2980
+ uint32 level_index) {
2981
+ uint32 cur_level_ofs = m_pHeader->m_level_ofs[level_index];
2982
+
2983
+ uint32 next_level_ofs = m_data_size;
2984
+ if ((level_index + 1) < (m_pHeader->m_levels))
2985
+ next_level_ofs = m_pHeader->m_level_ofs[level_index + 1];
2986
+
2987
+ CRND_ASSERT(next_level_ofs > cur_level_ofs);
2988
+
2989
+ return unpack_level(m_pData + cur_level_ofs, next_level_ofs - cur_level_ofs, pDst, dst_size_in_bytes, row_pitch_in_bytes, level_index);
2990
+ }
2991
+
2992
+ bool unpack_level(
2993
+ const void* pSrc, uint32 src_size_in_bytes,
2994
+ void** pDst, uint32 dst_size_in_bytes, uint32 row_pitch_in_bytes,
2995
+ uint32 level_index) {
2996
+
2997
+ #ifdef CRND_BUILD_DEBUG
2998
+ for (uint32 f = 0; f < m_pHeader->m_faces; f++)
2999
+ if (!pDst[f])
3000
+ return false;
3001
+ #endif
3002
+
3003
+ const uint32 width = math::maximum(m_pHeader->m_width >> level_index, 1U);
3004
+ const uint32 height = math::maximum(m_pHeader->m_height >> level_index, 1U);
3005
+ const uint32 blocks_x = (width + 3U) >> 2U;
3006
+ const uint32 blocks_y = (height + 3U) >> 2U;
3007
+ const uint32 block_size = m_pHeader->m_format == cCRNFmtDXT1 || m_pHeader->m_format == cCRNFmtDXT5A || m_pHeader->m_format == cCRNFmtETC1 || m_pHeader->m_format == cCRNFmtETC2 || m_pHeader->m_format == cCRNFmtETC1S ? 8 : 16;
3008
+
3009
+ uint32 minimal_row_pitch = block_size * blocks_x;
3010
+ if (!row_pitch_in_bytes)
3011
+ row_pitch_in_bytes = minimal_row_pitch;
3012
+ else if ((row_pitch_in_bytes < minimal_row_pitch) || (row_pitch_in_bytes & 3))
3013
+ return false;
3014
+ if (dst_size_in_bytes < row_pitch_in_bytes * blocks_y)
3015
+ return false;
3016
+
3017
+ if (!m_codec.start_decoding(static_cast<const crnd::uint8*>(pSrc), src_size_in_bytes))
3018
+ return false;
3019
+
3020
+ bool status = false;
3021
+ switch (m_pHeader->m_format) {
3022
+ case cCRNFmtDXT1:
3023
+ case cCRNFmtETC1S:
3024
+ status = unpack_dxt1((uint8**)pDst, row_pitch_in_bytes, blocks_x, blocks_y);
3025
+ break;
3026
+ case cCRNFmtDXT5:
3027
+ case cCRNFmtDXT5_CCxY:
3028
+ case cCRNFmtDXT5_xGBR:
3029
+ case cCRNFmtDXT5_AGBR:
3030
+ case cCRNFmtDXT5_xGxR:
3031
+ case cCRNFmtETC2AS:
3032
+ status = unpack_dxt5((uint8**)pDst, row_pitch_in_bytes, blocks_x, blocks_y);
3033
+ break;
3034
+ case cCRNFmtDXT5A:
3035
+ status = unpack_dxt5a((uint8**)pDst, row_pitch_in_bytes, blocks_x, blocks_y);
3036
+ break;
3037
+ case cCRNFmtDXN_XY:
3038
+ case cCRNFmtDXN_YX:
3039
+ status = unpack_dxn((uint8**)pDst, row_pitch_in_bytes, blocks_x, blocks_y);
3040
+ break;
3041
+ case cCRNFmtETC1:
3042
+ status = unpack_etc1((uint8**)pDst, row_pitch_in_bytes, blocks_x, blocks_y);
3043
+ break;
3044
+ case cCRNFmtETC2:
3045
+ status = unpack_etc1((uint8**)pDst, row_pitch_in_bytes, blocks_x, blocks_y);
3046
+ break;
3047
+ case cCRNFmtETC2A:
3048
+ status = unpack_etc2a((uint8**)pDst, row_pitch_in_bytes, blocks_x, blocks_y);
3049
+ break;
3050
+ default:
3051
+ return false;
3052
+ }
3053
+ if (!status)
3054
+ return false;
3055
+
3056
+ m_codec.stop_decoding();
3057
+ return true;
3058
+ }
3059
+
3060
+ inline const void* get_data() const { return m_pData; }
3061
+ inline uint32 get_data_size() const { return m_data_size; }
3062
+
3063
+ private:
3064
+ enum { cMagicValue = 0x1EF9CABD };
3065
+ uint32 m_magic;
3066
+
3067
+ const uint8* m_pData;
3068
+ uint32 m_data_size;
3069
+ const crn_header* m_pHeader;
3070
+
3071
+ symbol_codec m_codec;
3072
+
3073
+ static_huffman_data_model m_reference_encoding_dm;
3074
+ static_huffman_data_model m_endpoint_delta_dm[2];
3075
+ static_huffman_data_model m_selector_delta_dm[2];
3076
+
3077
+ crnd::vector<uint32> m_color_endpoints;
3078
+ crnd::vector<uint32> m_color_selectors;
3079
+
3080
+ crnd::vector<uint16> m_alpha_endpoints;
3081
+ crnd::vector<uint16> m_alpha_selectors;
3082
+
3083
+ struct block_buffer_element {
3084
+ uint16 endpoint_reference;
3085
+ uint16 color_endpoint_index;
3086
+ uint16 alpha0_endpoint_index;
3087
+ uint16 alpha1_endpoint_index;
3088
+ };
3089
+ crnd::vector<block_buffer_element> m_block_buffer;
3090
+
3091
+ bool init_tables() {
3092
+ if (!m_codec.start_decoding(m_pData + m_pHeader->m_tables_ofs, m_pHeader->m_tables_size))
3093
+ return false;
3094
+
3095
+ if (!m_codec.decode_receive_static_data_model(m_reference_encoding_dm))
3096
+ return false;
3097
+
3098
+ if ((!m_pHeader->m_color_endpoints.m_num) && (!m_pHeader->m_alpha_endpoints.m_num))
3099
+ return false;
3100
+
3101
+ if (m_pHeader->m_color_endpoints.m_num) {
3102
+ if (!m_codec.decode_receive_static_data_model(m_endpoint_delta_dm[0]))
3103
+ return false;
3104
+ if (!m_codec.decode_receive_static_data_model(m_selector_delta_dm[0]))
3105
+ return false;
3106
+ }
3107
+
3108
+ if (m_pHeader->m_alpha_endpoints.m_num) {
3109
+ if (!m_codec.decode_receive_static_data_model(m_endpoint_delta_dm[1]))
3110
+ return false;
3111
+ if (!m_codec.decode_receive_static_data_model(m_selector_delta_dm[1]))
3112
+ return false;
3113
+ }
3114
+
3115
+ m_codec.stop_decoding();
3116
+
3117
+ return true;
3118
+ }
3119
+
3120
+ bool decode_palettes() {
3121
+ if (m_pHeader->m_color_endpoints.m_num) {
3122
+ if (!decode_color_endpoints())
3123
+ return false;
3124
+ if (!decode_color_selectors())
3125
+ return false;
3126
+ }
3127
+
3128
+ if (m_pHeader->m_alpha_endpoints.m_num) {
3129
+ if (!decode_alpha_endpoints())
3130
+ return false;
3131
+ if (!(m_pHeader->m_format == cCRNFmtETC2AS ? decode_alpha_selectors_etcs() : m_pHeader->m_format == cCRNFmtETC2A ? decode_alpha_selectors_etc() : decode_alpha_selectors()))
3132
+ return false;
3133
+ }
3134
+
3135
+ return true;
3136
+ }
3137
+
3138
+ bool decode_color_endpoints() {
3139
+ const uint32 num_color_endpoints = m_pHeader->m_color_endpoints.m_num;
3140
+ const bool has_etc_color_blocks = m_pHeader->m_format == cCRNFmtETC1 || m_pHeader->m_format == cCRNFmtETC2 || m_pHeader->m_format == cCRNFmtETC2A || m_pHeader->m_format == cCRNFmtETC1S || m_pHeader->m_format == cCRNFmtETC2AS;
3141
+ const bool has_subblocks = m_pHeader->m_format == cCRNFmtETC1 || m_pHeader->m_format == cCRNFmtETC2 || m_pHeader->m_format == cCRNFmtETC2A;
3142
+
3143
+ if (!m_color_endpoints.resize(num_color_endpoints))
3144
+ return false;
3145
+
3146
+ if (!m_codec.start_decoding(m_pData + m_pHeader->m_color_endpoints.m_ofs, m_pHeader->m_color_endpoints.m_size))
3147
+ return false;
3148
+
3149
+ static_huffman_data_model dm[2];
3150
+ for (uint32 i = 0; i < (has_etc_color_blocks ? 1 : 2); i++)
3151
+ if (!m_codec.decode_receive_static_data_model(dm[i]))
3152
+ return false;
3153
+
3154
+ uint32 a = 0, b = 0, c = 0;
3155
+ uint32 d = 0, e = 0, f = 0;
3156
+
3157
+ uint32* CRND_RESTRICT pDst = &m_color_endpoints[0];
3158
+
3159
+ for (uint32 i = 0; i < num_color_endpoints; i++) {
3160
+ if (has_etc_color_blocks) {
3161
+ for (b = 0; b < 32; b += 8)
3162
+ a += m_codec.decode(dm[0]) << b;
3163
+ a &= 0x1F1F1F1F;
3164
+ *pDst++ = has_subblocks ? a : (a & 0x07000000) << 5 | (a & 0x07000000) << 2 | 0x02000000 | (a & 0x001F1F1F) << 3;
3165
+ } else {
3166
+ a = (a + m_codec.decode(dm[0])) & 31;
3167
+ b = (b + m_codec.decode(dm[1])) & 63;
3168
+ c = (c + m_codec.decode(dm[0])) & 31;
3169
+ d = (d + m_codec.decode(dm[0])) & 31;
3170
+ e = (e + m_codec.decode(dm[1])) & 63;
3171
+ f = (f + m_codec.decode(dm[0])) & 31;
3172
+ *pDst++ = c | (b << 5U) | (a << 11U) | (f << 16U) | (e << 21U) | (d << 27U);
3173
+ }
3174
+ }
3175
+
3176
+ m_codec.stop_decoding();
3177
+
3178
+ return true;
3179
+ }
3180
+
3181
+ bool decode_color_selectors() {
3182
+ const bool has_etc_color_blocks = m_pHeader->m_format == cCRNFmtETC1 || m_pHeader->m_format == cCRNFmtETC2 || m_pHeader->m_format == cCRNFmtETC2A || m_pHeader->m_format == cCRNFmtETC1S || m_pHeader->m_format == cCRNFmtETC2AS;
3183
+ const bool has_subblocks = m_pHeader->m_format == cCRNFmtETC1 || m_pHeader->m_format == cCRNFmtETC2 || m_pHeader->m_format == cCRNFmtETC2A;
3184
+ m_codec.start_decoding(m_pData + m_pHeader->m_color_selectors.m_ofs, m_pHeader->m_color_selectors.m_size);
3185
+ static_huffman_data_model dm;
3186
+ m_codec.decode_receive_static_data_model(dm);
3187
+ m_color_selectors.resize(m_pHeader->m_color_selectors.m_num << (has_subblocks ? 1 : 0));
3188
+ for (uint32 s = 0, i = 0; i < m_pHeader->m_color_selectors.m_num; i++) {
3189
+ for (uint32 j = 0; j < 32; j += 4)
3190
+ s ^= m_codec.decode(dm) << j;
3191
+ if (has_etc_color_blocks) {
3192
+ for (uint32 selector = (~s & 0xAAAAAAAA) | (~(s ^ s >> 1) & 0x55555555), t = 8, h = 0; h < 4; h++, t -= 15) {
3193
+ for (uint32 w = 0; w < 4; w++, t += 4) {
3194
+ if (has_subblocks) {
3195
+ uint32 s0 = selector >> (w << 3 | h << 1);
3196
+ m_color_selectors[i << 1] |= ((s0 >> 1 & 1) | (s0 & 1) << 16) << (t & 15);
3197
+ }
3198
+ uint32 s1 = selector >> (h << 3 | w << 1);
3199
+ m_color_selectors[has_subblocks ? i << 1 | 1 : i] |= ((s1 >> 1 & 1) | (s1 & 1) << 16) << (t & 15);
3200
+ }
3201
+ }
3202
+ } else {
3203
+ m_color_selectors[i] = ((s ^ s << 1) & 0xAAAAAAAA) | (s >> 1 & 0x55555555);
3204
+ }
3205
+ }
3206
+ m_codec.stop_decoding();
3207
+ return true;
3208
+ }
3209
+
3210
+ bool decode_alpha_endpoints() {
3211
+ const uint32 num_alpha_endpoints = m_pHeader->m_alpha_endpoints.m_num;
3212
+
3213
+ if (!m_codec.start_decoding(m_pData + m_pHeader->m_alpha_endpoints.m_ofs, m_pHeader->m_alpha_endpoints.m_size))
3214
+ return false;
3215
+
3216
+ static_huffman_data_model dm;
3217
+ if (!m_codec.decode_receive_static_data_model(dm))
3218
+ return false;
3219
+
3220
+ if (!m_alpha_endpoints.resize(num_alpha_endpoints))
3221
+ return false;
3222
+
3223
+ uint16* CRND_RESTRICT pDst = &m_alpha_endpoints[0];
3224
+ uint32 a = 0, b = 0;
3225
+
3226
+ for (uint32 i = 0; i < num_alpha_endpoints; i++) {
3227
+ a = (a + m_codec.decode(dm)) & 255;
3228
+ b = (b + m_codec.decode(dm)) & 255;
3229
+ *pDst++ = (uint16)(a | (b << 8));
3230
+ }
3231
+
3232
+ m_codec.stop_decoding();
3233
+
3234
+ return true;
3235
+ }
3236
+
3237
+ bool decode_alpha_selectors() {
3238
+ m_codec.start_decoding(m_pData + m_pHeader->m_alpha_selectors.m_ofs, m_pHeader->m_alpha_selectors.m_size);
3239
+ static_huffman_data_model dm;
3240
+ m_codec.decode_receive_static_data_model(dm);
3241
+ m_alpha_selectors.resize(m_pHeader->m_alpha_selectors.m_num * 3);
3242
+ uint8 dxt5_from_linear[64];
3243
+ for (uint32 i = 0; i < 64; i++)
3244
+ dxt5_from_linear[i] = g_dxt5_from_linear[i & 7] | g_dxt5_from_linear[i >> 3] << 3;
3245
+ for (uint32 s0_linear = 0, s1_linear = 0, i = 0; i < m_alpha_selectors.size();) {
3246
+ uint32 s0 = 0, s1 = 0;
3247
+ for (uint32 j = 0; j < 24; s0 |= dxt5_from_linear[s0_linear >> j & 0x3F] << j, j += 6)
3248
+ s0_linear ^= m_codec.decode(dm) << j;
3249
+ for (uint32 j = 0; j < 24; s1 |= dxt5_from_linear[s1_linear >> j & 0x3F] << j, j += 6)
3250
+ s1_linear ^= m_codec.decode(dm) << j;
3251
+ m_alpha_selectors[i++] = s0;
3252
+ m_alpha_selectors[i++] = s0 >> 16 | s1 << 8;
3253
+ m_alpha_selectors[i++] = s1 >> 8;
3254
+ }
3255
+ m_codec.stop_decoding();
3256
+ return true;
3257
+ }
3258
+
3259
+ bool decode_alpha_selectors_etc() {
3260
+ m_codec.start_decoding(m_pData + m_pHeader->m_alpha_selectors.m_ofs, m_pHeader->m_alpha_selectors.m_size);
3261
+ static_huffman_data_model dm;
3262
+ m_codec.decode_receive_static_data_model(dm);
3263
+ m_alpha_selectors.resize(m_pHeader->m_alpha_selectors.m_num * 6);
3264
+ uint8 s_linear[8] = {};
3265
+ uint8* data = (uint8*)m_alpha_selectors.begin();
3266
+ for (uint i = 0; i < m_alpha_selectors.size(); i += 6, data += 12) {
3267
+ for (uint s_group = 0, p = 0; p < 16; p++) {
3268
+ s_group = p & 1 ? s_group >> 3 : s_linear[p >> 1] ^= m_codec.decode(dm);
3269
+ uint8 s = s_group & 7;
3270
+ if (s <= 3)
3271
+ s = 3 - s;
3272
+ uint8 d = 3 * (p + 1);
3273
+ uint8 byte_offset = d >> 3;
3274
+ uint8 bit_offset = d & 7;
3275
+ data[byte_offset] |= s << (8 - bit_offset);
3276
+ if (bit_offset < 3)
3277
+ data[byte_offset - 1] |= s >> bit_offset;
3278
+ d += 9 * ((p & 3) - (p >> 2));
3279
+ byte_offset = d >> 3;
3280
+ bit_offset = d & 7;
3281
+ data[byte_offset + 6] |= s << (8 - bit_offset);
3282
+ if (bit_offset < 3)
3283
+ data[byte_offset + 5] |= s >> bit_offset;
3284
+ }
3285
+ }
3286
+ m_codec.stop_decoding();
3287
+ return true;
3288
+ }
3289
+
3290
+ bool decode_alpha_selectors_etcs() {
3291
+ m_codec.start_decoding(m_pData + m_pHeader->m_alpha_selectors.m_ofs, m_pHeader->m_alpha_selectors.m_size);
3292
+ static_huffman_data_model dm;
3293
+ m_codec.decode_receive_static_data_model(dm);
3294
+ m_alpha_selectors.resize(m_pHeader->m_alpha_selectors.m_num * 3);
3295
+ uint8 s_linear[8] = {};
3296
+ uint8* data = (uint8*)m_alpha_selectors.begin();
3297
+ for (uint i = 0; i < (m_alpha_selectors.size() << 1); i += 6) {
3298
+ for (uint s_group = 0, p = 0; p < 16; p++) {
3299
+ s_group = p & 1 ? s_group >> 3 : s_linear[p >> 1] ^= m_codec.decode(dm);
3300
+ uint8 s = s_group & 7;
3301
+ if (s <= 3)
3302
+ s = 3 - s;
3303
+ uint8 d = 3 * (p + 1) + 9 * ((p & 3) - (p >> 2));
3304
+ uint8 byte_offset = d >> 3;
3305
+ uint8 bit_offset = d & 7;
3306
+ data[i + byte_offset] |= s << (8 - bit_offset);
3307
+ if (bit_offset < 3)
3308
+ data[i + byte_offset - 1] |= s >> bit_offset;
3309
+ }
3310
+ }
3311
+ m_codec.stop_decoding();
3312
+ return true;
3313
+ }
3314
+
3315
+ static inline uint32 tiled_offset_2d_outer(uint32 y, uint32 AlignedWidth, uint32 LogBpp) {
3316
+ uint32 Macro = ((y >> 5) * (AlignedWidth >> 5)) << (LogBpp + 7);
3317
+ uint32 Micro = ((y & 6) << 2) << LogBpp;
3318
+
3319
+ return Macro +
3320
+ ((Micro & ~15) << 1) +
3321
+ (Micro & 15) +
3322
+ ((y & 8) << (3 + LogBpp)) + ((y & 1) << 4);
3323
+ }
3324
+
3325
+ static inline uint32 tiled_offset_2d_inner(uint32 x, uint32 y, uint32 LogBpp, uint32 BaseOffset) {
3326
+ uint32 Macro = (x >> 5) << (LogBpp + 7);
3327
+ uint32 Micro = (x & 7) << LogBpp;
3328
+ uint32 Offset = BaseOffset + Macro + ((Micro & ~15) << 1) + (Micro & 15);
3329
+
3330
+ return ((Offset & ~511) << 3) + ((Offset & 448) << 2) + (Offset & 63) +
3331
+ ((y & 16) << 7) +
3332
+ (((((y & 8) >> 2) + (x >> 3)) & 3) << 6);
3333
+ }
3334
+
3335
+ static inline void limit(uint& x, uint n) {
3336
+ int v = x - n;
3337
+ int msk = (v >> 31);
3338
+ x = (x & msk) | (v & ~msk);
3339
+ }
3340
+
3341
+ bool unpack_dxt1(uint8** pDst, uint32 output_pitch_in_bytes, uint32 output_width, uint32 output_height) {
3342
+ const uint32 num_color_endpoints = m_color_endpoints.size();
3343
+ const uint32 width = (output_width + 1) & ~1;
3344
+ const uint32 height = (output_height + 1) & ~1;
3345
+ const int32 delta_pitch_in_dwords = (output_pitch_in_bytes >> 2) - (width << 1);
3346
+
3347
+ if (m_block_buffer.size() < width)
3348
+ m_block_buffer.resize(width);
3349
+
3350
+ uint32 color_endpoint_index = 0;
3351
+ uint8 reference_group = 0;
3352
+
3353
+ for (uint32 f = 0; f < m_pHeader->m_faces; f++) {
3354
+ uint32* pData = (uint32*)pDst[f];
3355
+ for (uint32 y = 0; y < height; y++, pData += delta_pitch_in_dwords) {
3356
+ bool visible = y < output_height;
3357
+ for (uint32 x = 0; x < width; x++, pData += 2) {
3358
+ visible = visible && x < output_width;
3359
+ if (!(y & 1) && !(x & 1))
3360
+ reference_group = m_codec.decode(m_reference_encoding_dm);
3361
+ block_buffer_element &buffer = m_block_buffer[x];
3362
+ uint8 endpoint_reference;
3363
+ if (y & 1) {
3364
+ endpoint_reference = buffer.endpoint_reference;
3365
+ } else {
3366
+ endpoint_reference = reference_group & 3;
3367
+ reference_group >>= 2;
3368
+ buffer.endpoint_reference = reference_group & 3;
3369
+ reference_group >>= 2;
3370
+ }
3371
+ if (!endpoint_reference) {
3372
+ color_endpoint_index += m_codec.decode(m_endpoint_delta_dm[0]);
3373
+ if (color_endpoint_index >= num_color_endpoints)
3374
+ color_endpoint_index -= num_color_endpoints;
3375
+ buffer.color_endpoint_index = color_endpoint_index;
3376
+ } else if (endpoint_reference == 1) {
3377
+ buffer.color_endpoint_index = color_endpoint_index;
3378
+ } else {
3379
+ color_endpoint_index = buffer.color_endpoint_index;
3380
+ }
3381
+ uint32 color_selector_index = m_codec.decode(m_selector_delta_dm[0]);
3382
+ if (visible) {
3383
+ pData[0] = m_color_endpoints[color_endpoint_index];
3384
+ pData[1] = m_color_selectors[color_selector_index];
3385
+ }
3386
+ }
3387
+ }
3388
+ }
3389
+ return true;
3390
+ }
3391
+
3392
+ bool unpack_dxt5(uint8** pDst, uint32 row_pitch_in_bytes, uint32 output_width, uint32 output_height) {
3393
+ const uint32 num_color_endpoints = m_color_endpoints.size();
3394
+ const uint32 num_alpha_endpoints = m_alpha_endpoints.size();
3395
+ const uint32 width = (output_width + 1) & ~1;
3396
+ const uint32 height = (output_height + 1) & ~1;
3397
+ const int32 delta_pitch_in_dwords = (row_pitch_in_bytes >> 2) - (width << 2);
3398
+
3399
+ if (m_block_buffer.size() < width)
3400
+ m_block_buffer.resize(width);
3401
+
3402
+ uint32 color_endpoint_index = 0;
3403
+ uint32 alpha0_endpoint_index = 0;
3404
+ uint8 reference_group = 0;
3405
+
3406
+ for (uint32 f = 0; f < m_pHeader->m_faces; f++) {
3407
+ uint32* pData = (uint32*)pDst[f];
3408
+ for (uint32 y = 0; y < height; y++, pData += delta_pitch_in_dwords) {
3409
+ bool visible = y < output_height;
3410
+ for (uint32 x = 0; x < width; x++, pData += 4) {
3411
+ visible = visible && x < output_width;
3412
+ if (!(y & 1) && !(x & 1))
3413
+ reference_group = m_codec.decode(m_reference_encoding_dm);
3414
+ block_buffer_element &buffer = m_block_buffer[x];
3415
+ uint8 endpoint_reference;
3416
+ if (y & 1) {
3417
+ endpoint_reference = buffer.endpoint_reference;
3418
+ } else {
3419
+ endpoint_reference = reference_group & 3;
3420
+ reference_group >>= 2;
3421
+ buffer.endpoint_reference = reference_group & 3;
3422
+ reference_group >>= 2;
3423
+ }
3424
+ if (!endpoint_reference) {
3425
+ color_endpoint_index += m_codec.decode(m_endpoint_delta_dm[0]);
3426
+ if (color_endpoint_index >= num_color_endpoints)
3427
+ color_endpoint_index -= num_color_endpoints;
3428
+ buffer.color_endpoint_index = color_endpoint_index;
3429
+ alpha0_endpoint_index += m_codec.decode(m_endpoint_delta_dm[1]);
3430
+ if (alpha0_endpoint_index >= num_alpha_endpoints)
3431
+ alpha0_endpoint_index -= num_alpha_endpoints;
3432
+ buffer.alpha0_endpoint_index = alpha0_endpoint_index;
3433
+ } else if (endpoint_reference == 1) {
3434
+ buffer.color_endpoint_index = color_endpoint_index;
3435
+ buffer.alpha0_endpoint_index = alpha0_endpoint_index;
3436
+ } else {
3437
+ color_endpoint_index = buffer.color_endpoint_index;
3438
+ alpha0_endpoint_index = buffer.alpha0_endpoint_index;
3439
+ }
3440
+ uint32 color_selector_index = m_codec.decode(m_selector_delta_dm[0]);
3441
+ uint32 alpha0_selector_index = m_codec.decode(m_selector_delta_dm[1]);
3442
+ if (visible) {
3443
+ const uint16* pAlpha0_selectors = &m_alpha_selectors[alpha0_selector_index * 3];
3444
+ pData[0] = m_alpha_endpoints[alpha0_endpoint_index] | (pAlpha0_selectors[0] << 16);
3445
+ pData[1] = pAlpha0_selectors[1] | (pAlpha0_selectors[2] << 16);
3446
+ pData[2] = m_color_endpoints[color_endpoint_index];
3447
+ pData[3] = m_color_selectors[color_selector_index];
3448
+ }
3449
+ }
3450
+ }
3451
+ }
3452
+ return true;
3453
+ }
3454
+
3455
+ bool unpack_dxn(uint8** pDst, uint32 row_pitch_in_bytes, uint32 output_width, uint32 output_height) {
3456
+ const uint32 num_alpha_endpoints = m_alpha_endpoints.size();
3457
+ const uint32 width = (output_width + 1) & ~1;
3458
+ const uint32 height = (output_height + 1) & ~1;
3459
+ const int32 delta_pitch_in_dwords = (row_pitch_in_bytes >> 2) - (width << 2);
3460
+
3461
+ if (m_block_buffer.size() < width)
3462
+ m_block_buffer.resize(width);
3463
+
3464
+ uint32 alpha0_endpoint_index = 0;
3465
+ uint32 alpha1_endpoint_index = 0;
3466
+ uint8 reference_group = 0;
3467
+
3468
+ for (uint32 f = 0; f < m_pHeader->m_faces; f++) {
3469
+ uint32* pData = (uint32*)pDst[f];
3470
+ for (uint32 y = 0; y < height; y++, pData += delta_pitch_in_dwords) {
3471
+ bool visible = y < output_height;
3472
+ for (uint32 x = 0; x < width; x++, pData += 4) {
3473
+ visible = visible && x < output_width;
3474
+ if (!(y & 1) && !(x & 1))
3475
+ reference_group = m_codec.decode(m_reference_encoding_dm);
3476
+ block_buffer_element &buffer = m_block_buffer[x];
3477
+ uint8 endpoint_reference;
3478
+ if (y & 1) {
3479
+ endpoint_reference = buffer.endpoint_reference;
3480
+ } else {
3481
+ endpoint_reference = reference_group & 3;
3482
+ reference_group >>= 2;
3483
+ buffer.endpoint_reference = reference_group & 3;
3484
+ reference_group >>= 2;
3485
+ }
3486
+ if (!endpoint_reference) {
3487
+ alpha0_endpoint_index += m_codec.decode(m_endpoint_delta_dm[1]);
3488
+ if (alpha0_endpoint_index >= num_alpha_endpoints)
3489
+ alpha0_endpoint_index -= num_alpha_endpoints;
3490
+ buffer.alpha0_endpoint_index = alpha0_endpoint_index;
3491
+ alpha1_endpoint_index += m_codec.decode(m_endpoint_delta_dm[1]);
3492
+ if (alpha1_endpoint_index >= num_alpha_endpoints)
3493
+ alpha1_endpoint_index -= num_alpha_endpoints;
3494
+ buffer.alpha1_endpoint_index = alpha1_endpoint_index;
3495
+ } else if (endpoint_reference == 1) {
3496
+ buffer.alpha0_endpoint_index = alpha0_endpoint_index;
3497
+ buffer.alpha1_endpoint_index = alpha1_endpoint_index;
3498
+ } else {
3499
+ alpha0_endpoint_index = buffer.alpha0_endpoint_index;
3500
+ alpha1_endpoint_index = buffer.alpha1_endpoint_index;
3501
+ }
3502
+ uint32 alpha0_selector_index = m_codec.decode(m_selector_delta_dm[1]);
3503
+ uint32 alpha1_selector_index = m_codec.decode(m_selector_delta_dm[1]);
3504
+ if (visible) {
3505
+ const uint16* pAlpha0_selectors = &m_alpha_selectors[alpha0_selector_index * 3];
3506
+ const uint16* pAlpha1_selectors = &m_alpha_selectors[alpha1_selector_index * 3];
3507
+ pData[0] = m_alpha_endpoints[alpha0_endpoint_index] | (pAlpha0_selectors[0] << 16);
3508
+ pData[1] = pAlpha0_selectors[1] | (pAlpha0_selectors[2] << 16);
3509
+ pData[2] = m_alpha_endpoints[alpha1_endpoint_index] | (pAlpha1_selectors[0] << 16);
3510
+ pData[3] = pAlpha1_selectors[1] | (pAlpha1_selectors[2] << 16);
3511
+ }
3512
+ }
3513
+ }
3514
+ }
3515
+ return true;
3516
+ }
3517
+
3518
+ bool unpack_dxt5a(uint8** pDst, uint32 row_pitch_in_bytes, uint32 output_width, uint32 output_height) {
3519
+ const uint32 num_alpha_endpoints = m_alpha_endpoints.size();
3520
+ const uint32 width = (output_width + 1) & ~1;
3521
+ const uint32 height = (output_height + 1) & ~1;
3522
+ const int32 delta_pitch_in_dwords = (row_pitch_in_bytes >> 2) - (width << 1);
3523
+
3524
+ if (m_block_buffer.size() < width)
3525
+ m_block_buffer.resize(width);
3526
+
3527
+ uint32 alpha0_endpoint_index = 0;
3528
+ uint8 reference_group = 0;
3529
+
3530
+ for (uint32 f = 0; f < m_pHeader->m_faces; f++) {
3531
+ uint32* pData = (uint32*)pDst[f];
3532
+ for (uint32 y = 0; y < height; y++, pData += delta_pitch_in_dwords) {
3533
+ bool visible = y < output_height;
3534
+ for (uint32 x = 0; x < width; x++, pData += 2) {
3535
+ visible = visible && x < output_width;
3536
+ if (!(y & 1) && !(x & 1))
3537
+ reference_group = m_codec.decode(m_reference_encoding_dm);
3538
+ block_buffer_element &buffer = m_block_buffer[x];
3539
+ uint8 endpoint_reference;
3540
+ if (y & 1) {
3541
+ endpoint_reference = buffer.endpoint_reference;
3542
+ } else {
3543
+ endpoint_reference = reference_group & 3;
3544
+ reference_group >>= 2;
3545
+ buffer.endpoint_reference = reference_group & 3;
3546
+ reference_group >>= 2;
3547
+ }
3548
+ if (!endpoint_reference) {
3549
+ alpha0_endpoint_index += m_codec.decode(m_endpoint_delta_dm[1]);
3550
+ if (alpha0_endpoint_index >= num_alpha_endpoints)
3551
+ alpha0_endpoint_index -= num_alpha_endpoints;
3552
+ buffer.alpha0_endpoint_index = alpha0_endpoint_index;
3553
+ } else if (endpoint_reference == 1) {
3554
+ buffer.alpha0_endpoint_index = alpha0_endpoint_index;
3555
+ } else {
3556
+ alpha0_endpoint_index = buffer.alpha0_endpoint_index;
3557
+ }
3558
+ uint32 alpha0_selector_index = m_codec.decode(m_selector_delta_dm[1]);
3559
+ if (visible) {
3560
+ const uint16* pAlpha0_selectors = &m_alpha_selectors[alpha0_selector_index * 3];
3561
+ pData[0] = m_alpha_endpoints[alpha0_endpoint_index] | (pAlpha0_selectors[0] << 16);
3562
+ pData[1] = pAlpha0_selectors[1] | (pAlpha0_selectors[2] << 16);
3563
+ }
3564
+ }
3565
+ }
3566
+ }
3567
+ return true;
3568
+ }
3569
+
3570
+ bool unpack_etc1(uint8** pDst, uint32 output_pitch_in_bytes, uint32 output_width, uint32 output_height) {
3571
+ const uint32 num_color_endpoints = m_color_endpoints.size();
3572
+ const uint32 width = (output_width + 1) & ~1;
3573
+ const uint32 height = (output_height + 1) & ~1;
3574
+ const int32 delta_pitch_in_dwords = (output_pitch_in_bytes >> 2) - (width << 1);
3575
+
3576
+ if (m_block_buffer.size() < width << 1)
3577
+ m_block_buffer.resize(width << 1);
3578
+
3579
+ uint32 color_endpoint_index = 0, diagonal_color_endpoint_index = 0;
3580
+ uint8 reference_group = 0;
3581
+
3582
+ for (uint32 f = 0; f < m_pHeader->m_faces; f++) {
3583
+ uint32* pData = (uint32*)pDst[f];
3584
+ for (uint32 y = 0; y < height; y++, pData += delta_pitch_in_dwords) {
3585
+ bool visible = y < output_height;
3586
+ for (uint32 x = 0; x < width; x++, pData += 2) {
3587
+ visible = visible && x < output_width;
3588
+ block_buffer_element &buffer = m_block_buffer[x << 1];
3589
+ uint8 endpoint_reference, block_endpoint[4], e0[4], e1[4];
3590
+ if (y & 1) {
3591
+ endpoint_reference = buffer.endpoint_reference;
3592
+ } else {
3593
+ reference_group = m_codec.decode(m_reference_encoding_dm);
3594
+ endpoint_reference = (reference_group & 3) | (reference_group >> 2 & 12);
3595
+ buffer.endpoint_reference = (reference_group >> 2 & 3) | (reference_group >> 4 & 12);
3596
+ }
3597
+ if (!(endpoint_reference & 3)) {
3598
+ color_endpoint_index += m_codec.decode(m_endpoint_delta_dm[0]);
3599
+ if (color_endpoint_index >= num_color_endpoints)
3600
+ color_endpoint_index -= num_color_endpoints;
3601
+ buffer.color_endpoint_index = color_endpoint_index;
3602
+ } else if ((endpoint_reference & 3) == 1) {
3603
+ buffer.color_endpoint_index = color_endpoint_index;
3604
+ } else if ((endpoint_reference & 3) == 3) {
3605
+ buffer.color_endpoint_index = color_endpoint_index = diagonal_color_endpoint_index;
3606
+ } else {
3607
+ color_endpoint_index = buffer.color_endpoint_index;
3608
+ }
3609
+ endpoint_reference >>= 2;
3610
+ *(uint32*)&e0 = m_color_endpoints[color_endpoint_index];
3611
+ uint32 selector_index = m_codec.decode(m_selector_delta_dm[0]);
3612
+ if (endpoint_reference) {
3613
+ color_endpoint_index += m_codec.decode(m_endpoint_delta_dm[0]);
3614
+ if (color_endpoint_index >= num_color_endpoints)
3615
+ color_endpoint_index -= num_color_endpoints;
3616
+ }
3617
+ diagonal_color_endpoint_index = m_block_buffer[x << 1 | 1].color_endpoint_index;
3618
+ m_block_buffer[x << 1 | 1].color_endpoint_index = color_endpoint_index;
3619
+ *(uint32*)&e1 = m_color_endpoints[color_endpoint_index];
3620
+ if (visible) {
3621
+ uint32 flip = endpoint_reference >> 1 ^ 1, diff = 1;
3622
+ for (uint c = 0; diff && c < 3; c++)
3623
+ diff = e0[c] + 3 >= e1[c] && e1[c] + 4 >= e0[c] ? diff : 0;
3624
+ for (uint c = 0; c < 3; c++)
3625
+ block_endpoint[c] = diff ? e0[c] << 3 | ((e1[c] - e0[c]) & 7) : (e0[c] << 3 & 0xF0) | e1[c] >> 1;
3626
+ block_endpoint[3] = e0[3] << 5 | e1[3] << 2 | diff << 1 | flip;
3627
+ pData[0] = *(uint32*)&block_endpoint;
3628
+ pData[1] = m_color_selectors[selector_index << 1 | flip];
3629
+ }
3630
+ }
3631
+ }
3632
+ }
3633
+ return true;
3634
+ }
3635
+
3636
+ bool unpack_etc2a(uint8** pDst, uint32 output_pitch_in_bytes, uint32 output_width, uint32 output_height) {
3637
+ const uint32 num_color_endpoints = m_color_endpoints.size();
3638
+ const uint32 num_alpha_endpoints = m_alpha_endpoints.size();
3639
+ const uint32 width = (output_width + 1) & ~1;
3640
+ const uint32 height = (output_height + 1) & ~1;
3641
+ const int32 delta_pitch_in_dwords = (output_pitch_in_bytes >> 2) - (width << 2);
3642
+
3643
+ if (m_block_buffer.size() < width << 1)
3644
+ m_block_buffer.resize(width << 1);
3645
+
3646
+ uint32 color_endpoint_index = 0, diagonal_color_endpoint_index = 0, alpha0_endpoint_index = 0, diagonal_alpha0_endpoint_index = 0;
3647
+ uint8 reference_group = 0;
3648
+
3649
+ for (uint32 f = 0; f < m_pHeader->m_faces; f++) {
3650
+ uint32* pData = (uint32*)pDst[f];
3651
+ for (uint32 y = 0; y < height; y++, pData += delta_pitch_in_dwords) {
3652
+ bool visible = y < output_height;
3653
+ for (uint32 x = 0; x < width; x++, pData += 4) {
3654
+ visible = visible && x < output_width;
3655
+ block_buffer_element &buffer = m_block_buffer[x << 1];
3656
+ uint8 endpoint_reference, block_endpoint[4], e0[4], e1[4];
3657
+ if (y & 1) {
3658
+ endpoint_reference = buffer.endpoint_reference;
3659
+ } else {
3660
+ reference_group = m_codec.decode(m_reference_encoding_dm);
3661
+ endpoint_reference = (reference_group & 3) | (reference_group >> 2 & 12);
3662
+ buffer.endpoint_reference = (reference_group >> 2 & 3) | (reference_group >> 4 & 12);
3663
+ }
3664
+ if (!(endpoint_reference & 3)) {
3665
+ color_endpoint_index += m_codec.decode(m_endpoint_delta_dm[0]);
3666
+ if (color_endpoint_index >= num_color_endpoints)
3667
+ color_endpoint_index -= num_color_endpoints;
3668
+ alpha0_endpoint_index += m_codec.decode(m_endpoint_delta_dm[1]);
3669
+ if (alpha0_endpoint_index >= num_alpha_endpoints)
3670
+ alpha0_endpoint_index -= num_alpha_endpoints;
3671
+ buffer.color_endpoint_index = color_endpoint_index;
3672
+ buffer.alpha0_endpoint_index = alpha0_endpoint_index;
3673
+ } else if ((endpoint_reference & 3) == 1) {
3674
+ buffer.color_endpoint_index = color_endpoint_index;
3675
+ buffer.alpha0_endpoint_index = alpha0_endpoint_index;
3676
+ } else if ((endpoint_reference & 3) == 3) {
3677
+ buffer.color_endpoint_index = color_endpoint_index = diagonal_color_endpoint_index;
3678
+ buffer.alpha0_endpoint_index = alpha0_endpoint_index = diagonal_alpha0_endpoint_index;
3679
+ } else {
3680
+ color_endpoint_index = buffer.color_endpoint_index;
3681
+ alpha0_endpoint_index = buffer.alpha0_endpoint_index;
3682
+ }
3683
+ endpoint_reference >>= 2;
3684
+ *(uint32*)&e0 = m_color_endpoints[color_endpoint_index];
3685
+ uint32 color_selector_index = m_codec.decode(m_selector_delta_dm[0]);
3686
+ uint32 alpha0_selector_index = m_codec.decode(m_selector_delta_dm[1]);
3687
+ if (endpoint_reference) {
3688
+ color_endpoint_index += m_codec.decode(m_endpoint_delta_dm[0]);
3689
+ if (color_endpoint_index >= num_color_endpoints)
3690
+ color_endpoint_index -= num_color_endpoints;
3691
+ }
3692
+ *(uint32*)&e1 = m_color_endpoints[color_endpoint_index];
3693
+ diagonal_color_endpoint_index = m_block_buffer[x << 1 | 1].color_endpoint_index;
3694
+ diagonal_alpha0_endpoint_index = m_block_buffer[x << 1 | 1].alpha0_endpoint_index;
3695
+ m_block_buffer[x << 1 | 1].color_endpoint_index = color_endpoint_index;
3696
+ m_block_buffer[x << 1 | 1].alpha0_endpoint_index = alpha0_endpoint_index;
3697
+ if (visible) {
3698
+ uint32 flip = endpoint_reference >> 1 ^ 1, diff = 1;
3699
+ for (uint c = 0; diff && c < 3; c++)
3700
+ diff = e0[c] + 3 >= e1[c] && e1[c] + 4 >= e0[c] ? diff : 0;
3701
+ for (uint c = 0; c < 3; c++)
3702
+ block_endpoint[c] = diff ? e0[c] << 3 | ((e1[c] - e0[c]) & 7) : (e0[c] << 3 & 0xF0) | e1[c] >> 1;
3703
+ block_endpoint[3] = e0[3] << 5 | e1[3] << 2 | diff << 1 | flip;
3704
+ const uint16* pAlpha0_selectors = &m_alpha_selectors[alpha0_selector_index * 6 + (flip ? 3 : 0)];
3705
+ pData[0] = m_alpha_endpoints[alpha0_endpoint_index] | pAlpha0_selectors[0] << 16;
3706
+ pData[1] = pAlpha0_selectors[1] | pAlpha0_selectors[2] << 16;
3707
+ pData[2] = *(uint32*)&block_endpoint;
3708
+ pData[3] = m_color_selectors[color_selector_index << 1 | flip];
3709
+ }
3710
+ }
3711
+ }
3712
+ }
3713
+ return true;
3714
+ }
3715
+
3716
+ };
3717
+
3718
+ crnd_unpack_context crnd_unpack_begin(const void* pData, uint32 data_size) {
3719
+ if ((!pData) || (data_size < cCRNHeaderMinSize))
3720
+ return NULL;
3721
+
3722
+ crn_unpacker* p = crnd_new<crn_unpacker>();
3723
+ if (!p)
3724
+ return NULL;
3725
+
3726
+ if (!p->init(pData, data_size)) {
3727
+ crnd_delete(p);
3728
+ return NULL;
3729
+ }
3730
+
3731
+ return p;
3732
+ }
3733
+
3734
+ bool crnd_get_data(crnd_unpack_context pContext, const void** ppData, uint32* pData_size) {
3735
+ if (!pContext)
3736
+ return false;
3737
+
3738
+ crn_unpacker* pUnpacker = static_cast<crn_unpacker*>(pContext);
3739
+
3740
+ if (!pUnpacker->is_valid())
3741
+ return false;
3742
+
3743
+ if (ppData)
3744
+ *ppData = pUnpacker->get_data();
3745
+
3746
+ if (pData_size)
3747
+ *pData_size = pUnpacker->get_data_size();
3748
+
3749
+ return true;
3750
+ }
3751
+
3752
+ bool crnd_unpack_level(
3753
+ crnd_unpack_context pContext,
3754
+ void** pDst, uint32 dst_size_in_bytes, uint32 row_pitch_in_bytes,
3755
+ uint32 level_index) {
3756
+ if ((!pContext) || (!pDst) || (dst_size_in_bytes < 8U) || (level_index >= cCRNMaxLevels))
3757
+ return false;
3758
+
3759
+ crn_unpacker* pUnpacker = static_cast<crn_unpacker*>(pContext);
3760
+
3761
+ if (!pUnpacker->is_valid())
3762
+ return false;
3763
+
3764
+ return pUnpacker->unpack_level(pDst, dst_size_in_bytes, row_pitch_in_bytes, level_index);
3765
+ }
3766
+
3767
+ bool crnd_unpack_level_segmented(
3768
+ crnd_unpack_context pContext,
3769
+ const void* pSrc, uint32 src_size_in_bytes,
3770
+ void** pDst, uint32 dst_size_in_bytes, uint32 row_pitch_in_bytes,
3771
+ uint32 level_index) {
3772
+ if ((!pContext) || (!pSrc) || (!pDst) || (dst_size_in_bytes < 8U) || (level_index >= cCRNMaxLevels))
3773
+ return false;
3774
+
3775
+ crn_unpacker* pUnpacker = static_cast<crn_unpacker*>(pContext);
3776
+
3777
+ if (!pUnpacker->is_valid())
3778
+ return false;
3779
+
3780
+ return pUnpacker->unpack_level(pSrc, src_size_in_bytes, pDst, dst_size_in_bytes, row_pitch_in_bytes, level_index);
3781
+ }
3782
+
3783
+ bool crnd_unpack_end(crnd_unpack_context pContext) {
3784
+ if (!pContext)
3785
+ return false;
3786
+
3787
+ crn_unpacker* pUnpacker = static_cast<crn_unpacker*>(pContext);
3788
+
3789
+ if (!pUnpacker->is_valid())
3790
+ return false;
3791
+
3792
+ crnd_delete(pUnpacker);
3793
+
3794
+ return true;
3795
+ }
3796
+
3797
+ } // namespace crnd
3798
+
3799
+ #endif // CRND_INCLUDE_CRND_H
3800
+
3801
+ //------------------------------------------------------------------------------
3802
+ //
3803
+ // crn_decomp.h uses the ZLIB license:
3804
+ // http://opensource.org/licenses/Zlib
3805
+ //
3806
+ // Copyright (c) 2010-2016 Richard Geldreich, Jr. and Binomial LLC
3807
+ //
3808
+ // This software is provided 'as-is', without any express or implied
3809
+ // warranty. In no event will the authors be held liable for any damages
3810
+ // arising from the use of this software.
3811
+ //
3812
+ // Permission is granted to anyone to use this software for any purpose,
3813
+ // including commercial applications, and to alter it and redistribute it
3814
+ // freely, subject to the following restrictions:
3815
+ //
3816
+ // 1. The origin of this software must not be misrepresented; you must not
3817
+ // claim that you wrote the original software. If you use this software
3818
+ // in a product, an acknowledgment in the product documentation would be
3819
+ // appreciated but is not required.
3820
+ //
3821
+ // 2. Altered source versions must be plainly marked as such, and must not be
3822
+ // misrepresented as being the original software.
3823
+ //
3824
+ // 3. This notice may not be removed or altered from any source distribution.
3825
+ //
3826
+ //------------------------------------------------------------------------------