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.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/README.md +103 -76
- data/Rakefile +14 -6
- data/exe/mikunyan-image +92 -66
- data/exe/mikunyan-json +45 -59
- data/ext/decoders/crunch/crn_decomp.h +3826 -0
- data/ext/decoders/crunch/crn_defs.h +286 -0
- data/ext/decoders/crunch/crnlib.h +642 -0
- data/ext/decoders/crunch/dds_defs.h +149 -0
- data/ext/decoders/crunch/extconf.rb +9 -0
- data/ext/decoders/crunch/main.cpp +174 -0
- data/ext/decoders/native/astc.c +751 -358
- data/ext/decoders/native/astc.h +1 -1
- data/ext/decoders/native/color.h +87 -0
- data/ext/decoders/native/dxtc.c +44 -71
- data/ext/decoders/native/dxtc.h +2 -2
- data/ext/decoders/native/endianness.h +180 -0
- data/ext/decoders/native/etc.c +330 -158
- data/ext/decoders/native/etc.h +8 -4
- data/ext/decoders/native/extconf.rb +1 -1
- data/ext/decoders/native/fp16.h +36 -0
- data/ext/decoders/native/fp16/bitcasts.h +76 -0
- data/ext/decoders/native/fp16/fp16.h +451 -0
- data/ext/decoders/native/main.c +332 -80
- data/ext/decoders/native/pvrtc.c +258 -0
- data/ext/decoders/native/pvrtc.h +29 -0
- data/ext/decoders/native/rgb.c +96 -20
- data/ext/decoders/native/rgb.h +7 -1
- data/lib/mikunyan.rb +3 -7
- data/lib/mikunyan/asset.rb +302 -308
- data/lib/mikunyan/asset_bundle.rb +141 -91
- data/lib/mikunyan/base_object.rb +34 -0
- data/lib/mikunyan/binary_reader.rb +135 -147
- data/lib/mikunyan/constants.rb +506 -340
- data/lib/mikunyan/decoders.rb +7 -3
- data/lib/mikunyan/decoders/image_decoder.rb +499 -457
- data/lib/mikunyan/object_value.rb +96 -79
- data/lib/mikunyan/type_tree.rb +144 -73
- data/lib/mikunyan/types/text_asset.rb +19 -0
- data/lib/mikunyan/types/texture2d.rb +33 -0
- data/lib/mikunyan/typetrees/1/137ce611c2e1d71982d2c84bce12d0d6.json +1 -0
- data/lib/mikunyan/typetrees/1/86e34eb8ee7642b089fb98c9d81dd9b0.json +1 -0
- data/lib/mikunyan/typetrees/1/a372646834bcaf26eab1d21b29e39553.json +1 -0
- data/lib/mikunyan/typetrees/104/00ad972a9b8de1baeacb62e297cbb968.json +1 -0
- data/lib/mikunyan/typetrees/104/30a4b95a67419124ad203faff026115f.json +1 -0
- data/lib/mikunyan/typetrees/108/90536dd8f3f4fe3df5964930a9482336.json +1 -0
- data/lib/mikunyan/typetrees/108/c5e3a62999e4ef0417e42cffef82c4bb.json +1 -0
- data/lib/mikunyan/typetrees/109/486ba4e15dbd6aea8ac1a064305889c8.json +1 -0
- data/lib/mikunyan/typetrees/111/9eabac6ec66ffe818e008883728fcc1b.json +1 -0
- data/lib/mikunyan/typetrees/111/cc8f6e05143e049494c7eac0553f3883.json +1 -0
- data/lib/mikunyan/typetrees/115/2da9c96f9efc8b31a480d5b8858755f3.json +1 -0
- data/lib/mikunyan/typetrees/115/f46e8e30ecc293493f18ab27134210ee.json +1 -0
- data/lib/mikunyan/typetrees/121/ec82ba41da8a4a1621af9908b6786836.json +1 -0
- data/lib/mikunyan/typetrees/123/852794becbcf95f66992da2b96a69704.json +1 -0
- data/lib/mikunyan/typetrees/124/e0da148901d81b94249c67d75de59cc6.json +1 -0
- data/lib/mikunyan/typetrees/128/6a15532222689268bc8a148f4e84e7ab.json +1 -0
- data/lib/mikunyan/typetrees/128/9a83846bdc10f24de3183b3d1b510d5c.json +1 -0
- data/lib/mikunyan/typetrees/128/b14bcb0865632d1b2d6e215a000e4c0f.json +1 -0
- data/lib/mikunyan/typetrees/135/8c86f4ac6b7f47c045560d4383aadc8d.json +1 -0
- data/lib/mikunyan/typetrees/136/fbf6b031c32e461ee61be429e5fee7eb.json +1 -0
- data/lib/mikunyan/typetrees/137/2697e6f3893bf152ccfa6766c4c7f505.json +1 -0
- data/lib/mikunyan/typetrees/137/96a47566b4e135078f690a4a69935d58.json +1 -0
- data/lib/mikunyan/typetrees/137/b1b907f989fddc2c56485955b540ff3e.json +1 -0
- data/lib/mikunyan/typetrees/137/b78821b6aeb5b79c8961728a9f068024.json +1 -0
- data/lib/mikunyan/typetrees/137/ecc1595a8954f445d7681cf02ea158c2.json +1 -0
- data/lib/mikunyan/typetrees/142/97da5f4688e45a57c8b42d4f42497297.json +1 -0
- data/lib/mikunyan/typetrees/142/f284abb6f2df17ebedae2b6b50436810.json +1 -0
- data/lib/mikunyan/typetrees/150/74d387e7f1b0ef0e146e96940005546f.json +1 -0
- data/lib/mikunyan/typetrees/150/857195b5935cf8fb7c0b98cba9717eac.json +1 -0
- data/lib/mikunyan/typetrees/150/f123b055a61dfa7dc679d78cdaecd383.json +1 -0
- data/lib/mikunyan/typetrees/157/10355709bc95355f57466913ac850d0b.json +1 -0
- data/lib/mikunyan/typetrees/157/69b01db128625aa95f1f92fb890ff045.json +1 -0
- data/lib/mikunyan/typetrees/157/b6ac05d288ffb84268e85f2738366aa7.json +1 -0
- data/lib/mikunyan/typetrees/198/4b5dc9892b939558afad44bc1c94cb95.json +1 -0
- data/lib/mikunyan/typetrees/198/4dbfaa1def6adb569b550804b19b4305.json +1 -0
- data/lib/mikunyan/typetrees/198/879cd82f1c9caa2bb7914c6871319fc0.json +1 -0
- data/lib/mikunyan/typetrees/198/c3e96b683ca05a83aba6787fdbba45a6.json +1 -0
- data/lib/mikunyan/typetrees/198/d5d86f79c1252a3e0a705f20245b62b8.json +1 -0
- data/lib/mikunyan/typetrees/198/fa4023d185313a79ec5ee562b614c409.json +1 -0
- data/lib/mikunyan/typetrees/199/1bd80d4f81d414c0d14b0515fd8cd9e5.json +1 -0
- data/lib/mikunyan/typetrees/199/42f950f8898f13af3f02c7244e897db0.json +1 -0
- data/lib/mikunyan/typetrees/199/5abf5840ece9606f53c97f63452d995b.json +1 -0
- data/lib/mikunyan/typetrees/199/5fa34208d6cf04d6ae190f096d624677.json +1 -0
- data/lib/mikunyan/typetrees/199/c96a64061d3e391b7f3309bd4a644969.json +1 -0
- data/lib/mikunyan/typetrees/199/daea1bb1bba6613afb2cb001ca8fa0d4.json +1 -0
- data/lib/mikunyan/typetrees/20/073e485bdb4950dba97985230fc515dd.json +1 -0
- data/lib/mikunyan/typetrees/20/1696d256b3b20cfe9c87b67186d8e2b3.json +1 -0
- data/lib/mikunyan/typetrees/20/46fda2d131e65f9426462feecebc25c4.json +1 -0
- data/lib/mikunyan/typetrees/20/961be27d12d60b1b3421191d5256a876.json +1 -0
- data/lib/mikunyan/typetrees/200/26165a24a953362edb6a7078f6536c4b.json +1 -0
- data/lib/mikunyan/typetrees/21/225d280603d6b901bb660283ef2dc6c1.json +1 -0
- data/lib/mikunyan/typetrees/21/63d861fd9f999c93d61fe5659162061d.json +1 -0
- data/lib/mikunyan/typetrees/21/66405447c6973a81e978410c391172fe.json +1 -0
- data/lib/mikunyan/typetrees/21/d871346d990bbc294d02f4c366bf1b6d.json +1 -0
- data/lib/mikunyan/typetrees/210/1440a9413c35197e76f1f47223d5eab7.json +1 -0
- data/lib/mikunyan/typetrees/212/0f46b3d6160f7485467150dbf605a1a5.json +1 -0
- data/lib/mikunyan/typetrees/212/5fc4a64809a91d647f0b1220ca09f136.json +1 -0
- data/lib/mikunyan/typetrees/212/84c6ac46ef89030991cbbb3fd21d2889.json +1 -0
- data/lib/mikunyan/typetrees/212/91ffea0726900cb751e36f83816df13e.json +1 -0
- data/lib/mikunyan/typetrees/212/a98cccc4ebd5d08ae472761d4f6dc8b2.json +1 -0
- data/lib/mikunyan/typetrees/212/d1820f56f61b6f673e2f5301c4686d39.json +1 -0
- data/lib/mikunyan/typetrees/213/2f0ee1e689a979766d022d88d6007338.json +1 -0
- data/lib/mikunyan/typetrees/213/314dede0713638b3fad1628f6329dc62.json +1 -0
- data/lib/mikunyan/typetrees/213/76ce55d4dbaf38f5c674ea9f0a344951.json +1 -0
- data/lib/mikunyan/typetrees/213/8c8aa545a03edeb9030f8f5042d06122.json +1 -0
- data/lib/mikunyan/typetrees/213/e7c5c01b0369574e9346ce846e1e8e63.json +1 -0
- data/lib/mikunyan/typetrees/222/5750e5904e20e1e9b768424d8704a10d.json +1 -0
- data/lib/mikunyan/typetrees/222/9e0ab8d396f3249a3958dd930f81f61b.json +1 -0
- data/lib/mikunyan/typetrees/223/d8082d7a3661a3f9ca00a93a61606585.json +1 -0
- data/lib/mikunyan/typetrees/224/7e050781d08ca9d10bc74beb7e91c3b5.json +1 -0
- data/lib/mikunyan/typetrees/224/eb5e2816cebf56985ba81ee03349f325.json +1 -0
- data/lib/mikunyan/typetrees/225/5bc42b93159267aabba724a6a7923603.json +1 -0
- data/lib/mikunyan/typetrees/23/2838e2afe8d6a61d270093d4d54eb362.json +1 -0
- data/lib/mikunyan/typetrees/23/6da70b1b6e4efd541ada82b09c3b5c8b.json +1 -0
- data/lib/mikunyan/typetrees/23/af863b6969b9b82be9450f0574339f65.json +1 -0
- data/lib/mikunyan/typetrees/23/c92361750edbfbcada6f2537e8db21ad.json +1 -0
- data/lib/mikunyan/typetrees/23/d618295bd5f15441b5b80b1f57e92d09.json +1 -0
- data/lib/mikunyan/typetrees/23/f19f7e20c325589c346554ef7d1cadc9.json +1 -0
- data/lib/mikunyan/typetrees/241/06c982971191fe245e5ebf10100d830b.json +1 -0
- data/lib/mikunyan/typetrees/241/b55bcb08834f91481d00ecf2baf6b298.json +1 -0
- data/lib/mikunyan/typetrees/243/d68e4f940c79b84a66a3020175a2fc76.json +1 -0
- data/lib/mikunyan/typetrees/245/48b8a458c641bcd5191d251713454097.json +1 -0
- data/lib/mikunyan/typetrees/258/2d2b1d63eb2a68ed94bbf7f50fc21d7b.json +1 -0
- data/lib/mikunyan/typetrees/258/b35bf02952f2946208ff6b4deca3a6a9.json +1 -0
- data/lib/mikunyan/typetrees/28/01053c13f5acc24d9236a5e6e7e1410d.json +1 -0
- data/lib/mikunyan/typetrees/28/0d08414cfd5bdb0d22792011bda9ab26.json +1 -0
- data/lib/mikunyan/typetrees/28/11eb3417a626b4b8276ad6fe42d3dbd3.json +1 -0
- data/lib/mikunyan/typetrees/28/1e87d82d4fd058509a3c7866db0e7356.json +1 -0
- data/lib/mikunyan/typetrees/28/7230c9eb36a0c72a7187ad952551e1e5.json +1 -0
- data/lib/mikunyan/typetrees/28/ee6c40817d2951929cdb4f5a60874f5d.json +1 -0
- data/lib/mikunyan/typetrees/320/4edb00d2a9c65f6f25f5cdc31bb86380.json +1 -0
- data/lib/mikunyan/typetrees/320/941d49d79db52b4d31946d5082b518d4.json +1 -0
- data/lib/mikunyan/typetrees/328/2c5307574bfe212cbac3047511700fc5.json +1 -0
- data/lib/mikunyan/typetrees/328/f95fb25bc9075d2acd7b879adca49eda.json +1 -0
- data/lib/mikunyan/typetrees/329/093e4500a0a67d1ed84eb0116520fa2d.json +1 -0
- data/lib/mikunyan/typetrees/329/a7209c2a706f5ce5d5b6d405d08194d6.json +1 -0
- data/lib/mikunyan/typetrees/33/9d1630b1d7e3bc24abe46e5860a2a179.json +1 -0
- data/lib/mikunyan/typetrees/331/147b112c44d8942fa03fd5b2db85b74d.json +1 -0
- data/lib/mikunyan/typetrees/331/a7b540b6a58815a5d041bd2f340fed67.json +1 -0
- data/lib/mikunyan/typetrees/4/761ca81f78491542badc37f810ab3455.json +1 -0
- data/lib/mikunyan/typetrees/4/937a6b5c5f5b313185d252e38d145b17.json +1 -0
- data/lib/mikunyan/typetrees/43/3366c840a288282b3b12f2f3e038c473.json +1 -0
- data/lib/mikunyan/typetrees/43/434b934f757d042e20f52d8c2ae20843.json +1 -0
- data/lib/mikunyan/typetrees/43/6b594ba1ad7a129a106728bf12a2c575.json +1 -0
- data/lib/mikunyan/typetrees/43/6d698cb82bd752d1b83575c6e59915a8.json +1 -0
- data/lib/mikunyan/typetrees/43/97ec0712102a3ea3f1cf8c0a4e47c070.json +1 -0
- data/lib/mikunyan/typetrees/43/b5516dd9b9d6b7d5643b75df1847c5c9.json +1 -0
- data/lib/mikunyan/typetrees/48/266d53113fa30d2b858f2768f92eaa14.json +1 -0
- data/lib/mikunyan/typetrees/48/8db760073e1392061e4a36995f0735af.json +1 -0
- data/lib/mikunyan/typetrees/48/a30e3dcf6c6d25153d6f64e5e41caf4e.json +1 -0
- data/lib/mikunyan/typetrees/48/a70f7abc6586fb35b3a0641aa81e9375.json +1 -0
- data/lib/mikunyan/typetrees/48/ed2a06ce7fb8203f6efb5ab5e0ce20d5.json +1 -0
- data/lib/mikunyan/typetrees/49/486ba4e15dbd6aea8ac1a064305889c8.json +1 -0
- data/lib/mikunyan/typetrees/49/936739f45f26fd8b81a4ea70f2c8cad4.json +1 -0
- data/lib/mikunyan/typetrees/50/6e8b670a26a77e98186711bb06946b54.json +1 -0
- data/lib/mikunyan/typetrees/61/30520d6e00d721084910face9f4161f1.json +1 -0
- data/lib/mikunyan/typetrees/64/5b7f3f798459ea619e4927106fd1fe4b.json +1 -0
- data/lib/mikunyan/typetrees/64/80051ff78d79f99ebe47afb72cc66120.json +1 -0
- data/lib/mikunyan/typetrees/64/a4f61324ce0d2adbb58fa519e9537250.json +1 -0
- data/lib/mikunyan/typetrees/65/439e66a89c7fdef6f0927c9256c0773a.json +1 -0
- data/lib/mikunyan/typetrees/687078895/cae79c57c58bb3a331c1a3a78ff9cfef.json +1 -0
- data/lib/mikunyan/typetrees/687078895/cf2fdd6d6ec48e8832b545670b813675.json +1 -0
- data/lib/mikunyan/typetrees/74/1ece1117b1e6a8b84516b3eb77051cc3.json +1 -0
- data/lib/mikunyan/typetrees/74/81e28d3a4102fabc98ac701e6a192ad4.json +1 -0
- data/lib/mikunyan/typetrees/74/c184743520186f546000de20f4d19736.json +1 -0
- data/lib/mikunyan/typetrees/74/f665ce86182d9caf3ead9030330dcdd1.json +1 -0
- data/lib/mikunyan/typetrees/81/305e4aeacbb64b15862510dad47502cb.json +1 -0
- data/lib/mikunyan/typetrees/82/615d22f1dbb7206b1870a49854e33c55.json +1 -0
- data/lib/mikunyan/typetrees/83/57a6370a001d5449abd37c2184ec5138.json +1 -0
- data/lib/mikunyan/typetrees/83/b23449465e3763dd19335a88ea09ae99.json +1 -0
- data/lib/mikunyan/typetrees/84/78e42736c01cb0f007375d925e0eb8b0.json +1 -0
- data/lib/mikunyan/typetrees/89/1ef8dc1e91e0cd01bd07036e6665ea40.json +1 -0
- data/lib/mikunyan/typetrees/89/8ae46eedf9c00edaad35d0d09290bc8b.json +1 -0
- data/lib/mikunyan/typetrees/89/f92d618c5266ea3a8ca770b6eca728c8.json +1 -0
- data/lib/mikunyan/typetrees/90/06fc117ca6d965140ccc18ca840cc1a1.json +1 -0
- data/lib/mikunyan/typetrees/90/32844caee83b124ec87852294d39b8b6.json +1 -0
- data/lib/mikunyan/typetrees/90/b6bbd0e88d1feb636d89bd766ea5934f.json +1 -0
- data/lib/mikunyan/typetrees/91/01ccfe05c6fbc7ff03dcf8afa8213ff5.json +1 -0
- data/lib/mikunyan/typetrees/91/12873460c642bda0bf9e3d57283cd673.json +1 -0
- data/lib/mikunyan/typetrees/91/fc82e38aa4ec91a42bead3793b8ad3a8.json +1 -0
- data/lib/mikunyan/typetrees/92/e0da148901d81b94249c67d75de59cc6.json +1 -0
- data/lib/mikunyan/typetrees/95/75f8b558401cf01ba36d0e612cdbd8fa.json +1 -0
- data/lib/mikunyan/typetrees/95/c4c62993971a4c233bae8f8954b4509c.json +1 -0
- data/lib/mikunyan/typetrees/96/178a7faebee648639373e3fc701c4d42.json +1 -0
- data/lib/mikunyan/typetrees/96/32fa2c2b9d9e3f4a716af411fe635d29.json +1 -0
- data/lib/mikunyan/typetrees/96/a11f8eb485ea905be1a9eb49e42085e7.json +1 -0
- data/lib/mikunyan/typetrees/96/fb00968925d0a9c61e2630478746ac93.json +1 -0
- data/lib/mikunyan/version.rb +4 -2
- data/mikunyan.gemspec +22 -17
- metadata +228 -948
- data/lib/mikunyan/typetrees/0005ee889bd7f6b79a25da117f739c52.dat +0 -0
- data/lib/mikunyan/typetrees/005cae4626b69aa0d1bd6fd3677642d0.dat +0 -0
- data/lib/mikunyan/typetrees/0065ac6da4da61da4e46189f1b77b002.dat +0 -0
- data/lib/mikunyan/typetrees/00ad972a9b8de1baeacb62e297cbb968.dat +0 -0
- data/lib/mikunyan/typetrees/00b2dd52d07280ff931ca2ce840c6c5f.dat +0 -0
- data/lib/mikunyan/typetrees/00f3fced245b297f9ac50a0d4903fb6a.dat +0 -0
- data/lib/mikunyan/typetrees/01053c13f5acc24d9236a5e6e7e1410d.dat +0 -0
- data/lib/mikunyan/typetrees/01266d578502b6b76488f3bd3d604eef.dat +0 -0
- data/lib/mikunyan/typetrees/016a05ed91534852640fa073275aca15.dat +0 -0
- data/lib/mikunyan/typetrees/01ccfe05c6fbc7ff03dcf8afa8213ff5.dat +0 -0
- data/lib/mikunyan/typetrees/02121256d773b25c5090287b274c2b00.dat +0 -0
- data/lib/mikunyan/typetrees/02151504e19732024609e7cca6c0fc96.dat +0 -0
- data/lib/mikunyan/typetrees/026979ad7a2cb1623d33ebc2dcb307bc.dat +0 -0
- data/lib/mikunyan/typetrees/02d4f5f7486a5229b8f5dd49f538d23b.dat +0 -0
- data/lib/mikunyan/typetrees/02ff34fcfecd5a7519f8e4eccfcefc17.dat +0 -0
- data/lib/mikunyan/typetrees/037ba63dcd92d264f6321c61b115c80a.dat +0 -0
- data/lib/mikunyan/typetrees/0384181f7887c2df26d7de81361d3c24.dat +0 -0
- data/lib/mikunyan/typetrees/03882ede131aa51c0b2120a860363c45.dat +0 -0
- data/lib/mikunyan/typetrees/045e54722afb3e5b99ffc842b54ccd04.dat +0 -0
- data/lib/mikunyan/typetrees/046bff2bbcefd18a3c0b4cc1d32a342b.dat +0 -0
- data/lib/mikunyan/typetrees/049f614729255b717181bfd2310bfe39.dat +0 -0
- data/lib/mikunyan/typetrees/04ad34c7fb5894db97cb831635ea9464.dat +0 -0
- data/lib/mikunyan/typetrees/05377b3b7453e5f7a0a753ea7534b4b6.dat +0 -0
- data/lib/mikunyan/typetrees/054d6dd0949fc88be1ece98a89f48175.dat +0 -0
- data/lib/mikunyan/typetrees/06086ac852a0fdd488bb63eeb1a3f7be.dat +0 -0
- data/lib/mikunyan/typetrees/06eb94418931331dd508acc90ef39a0d.dat +0 -0
- data/lib/mikunyan/typetrees/07188f5574f3168b6584882cdc1906e4.dat +0 -0
- data/lib/mikunyan/typetrees/073ba87290db010f9d392b6926f26ffa.dat +0 -0
- data/lib/mikunyan/typetrees/0767fe19945b90006a374575a30a318d.dat +0 -0
- data/lib/mikunyan/typetrees/07b289e80f1d75c9c03ee649281af143.dat +0 -0
- data/lib/mikunyan/typetrees/07e972f95515e2dab33d93f8e59cde4d.dat +0 -0
- data/lib/mikunyan/typetrees/0816a72ba3f00b1bb13b23f8799619af.dat +0 -0
- data/lib/mikunyan/typetrees/0827148b052dd69232c20460ddde3d1a.dat +0 -0
- data/lib/mikunyan/typetrees/0857307b3a8cb783c311d8ff42959462.dat +0 -0
- data/lib/mikunyan/typetrees/086efb68ee41abe4e98e1ae93ae96290.dat +0 -0
- data/lib/mikunyan/typetrees/087e32a39c822978a1c5e410162b381b.dat +0 -0
- data/lib/mikunyan/typetrees/08a0f671ed575df2b956a9523f3389b4.dat +0 -0
- data/lib/mikunyan/typetrees/08b842bfb6779a99abd9772f354c4592.dat +0 -0
- data/lib/mikunyan/typetrees/09218ec64a12208744dfa28d3de424d5.dat +0 -0
- data/lib/mikunyan/typetrees/09403e79c0029e5f17528d3321a9c65a.dat +0 -0
- data/lib/mikunyan/typetrees/09a818b7453024f2d6eda315b98175bf.dat +0 -0
- data/lib/mikunyan/typetrees/0a5826fcb70aafc9a26f5e47e814f052.dat +0 -0
- data/lib/mikunyan/typetrees/0b6483cb76bd6cb09661f1999a14d7c3.dat +0 -0
- data/lib/mikunyan/typetrees/0b8eb6c7354ef2c2627f1911a201b5b2.dat +0 -0
- data/lib/mikunyan/typetrees/0be713b9a525f321879cf7985e5cb6a0.dat +0 -0
- data/lib/mikunyan/typetrees/0d1862c92c0019a9db5f10f5385be1ca.dat +0 -0
- data/lib/mikunyan/typetrees/0d37e988cc66cbb6f84a09d92fcc2fb1.dat +0 -0
- data/lib/mikunyan/typetrees/0d71112c6b0ce418bc75623a52f92e5c.dat +0 -0
- data/lib/mikunyan/typetrees/0dad589c25ae993410daa4813b24a978.dat +0 -0
- data/lib/mikunyan/typetrees/0e7a017b0eef40ee05c8e3355e289d48.dat +0 -0
- data/lib/mikunyan/typetrees/0e8c6e4f803514bccb43b7d8901ed3f3.dat +0 -0
- data/lib/mikunyan/typetrees/0eb12c7055a972aec53d53a646cc4fec.dat +0 -0
- data/lib/mikunyan/typetrees/0f7da8d76d164df704e661b2f926d0ba.dat +0 -0
- data/lib/mikunyan/typetrees/0fdbf6896f263df755a7392766cd7bd5.dat +0 -0
- data/lib/mikunyan/typetrees/10355709bc95355f57466913ac850d0b.dat +0 -0
- data/lib/mikunyan/typetrees/1047dc8a46bd55bbc47ee36971fbc899.dat +0 -0
- data/lib/mikunyan/typetrees/1101c105388a97c11253c9138a48b054.dat +0 -0
- data/lib/mikunyan/typetrees/116f6e5f5e2f9936f14b3e7afdaeebe0.dat +0 -0
- data/lib/mikunyan/typetrees/119a33484a175efb17550e468dab2c29.dat +0 -0
- data/lib/mikunyan/typetrees/11eb3417a626b4b8276ad6fe42d3dbd3.dat +0 -0
- data/lib/mikunyan/typetrees/1209f97dc24e29870a0b4d4c10691c51.dat +0 -0
- data/lib/mikunyan/typetrees/12873460c642bda0bf9e3d57283cd673.dat +0 -0
- data/lib/mikunyan/typetrees/12967e00d88a19565085202f8f7e8aae.dat +0 -0
- data/lib/mikunyan/typetrees/12c502cde72c7fa23c4f00e01ba92852.dat +0 -0
- data/lib/mikunyan/typetrees/136d01abbc91c99a320d66ce5fc6f77f.dat +0 -0
- data/lib/mikunyan/typetrees/137ce611c2e1d71982d2c84bce12d0d6.dat +0 -0
- data/lib/mikunyan/typetrees/13ad0b2f92f4248f339c2652b3f879d6.dat +0 -0
- data/lib/mikunyan/typetrees/13f0890d0c86a09d0cf0942446b5e6d3.dat +0 -0
- data/lib/mikunyan/typetrees/13f9a259302b7e528447dbac68c18621.dat +0 -0
- data/lib/mikunyan/typetrees/143bcbfec35489e37c72eaff4a352ac0.dat +0 -0
- data/lib/mikunyan/typetrees/144607134da52f2b16c382198714d681.dat +0 -0
- data/lib/mikunyan/typetrees/147e16de37e14923a45314e271221c54.dat +0 -0
- data/lib/mikunyan/typetrees/14ea9b41501766e6cda33f69772f1b67.dat +0 -0
- data/lib/mikunyan/typetrees/1547ef62e8cc49596b74b4259299ab7d.dat +0 -0
- data/lib/mikunyan/typetrees/167715f8020989bf87dc860ded480c9f.dat +0 -0
- data/lib/mikunyan/typetrees/168b7ccfe32e20d397ad9cc1ee64e88d.dat +0 -0
- data/lib/mikunyan/typetrees/16998ea62da750122066f949ab50157e.dat +0 -0
- data/lib/mikunyan/typetrees/16b1122494c0e77b196c413ac29842c6.dat +0 -0
- data/lib/mikunyan/typetrees/16e5b1b7ee14464356e9664219da0c82.dat +0 -0
- data/lib/mikunyan/typetrees/1747b0850e27d5e5afe2b3c5588e7181.dat +0 -0
- data/lib/mikunyan/typetrees/1762b46dd7a05651e197ae50eb8dc6ea.dat +0 -0
- data/lib/mikunyan/typetrees/17c3ea4c4fea71108c10fd27f2f36db1.dat +0 -0
- data/lib/mikunyan/typetrees/18372dbbd17b67380e4a62c927380a50.dat +0 -0
- data/lib/mikunyan/typetrees/1893d8e186073d53da657b023dc8bd12.dat +0 -0
- data/lib/mikunyan/typetrees/1980e6a59157d8bdee2bcaa3b7bcab95.dat +0 -0
- data/lib/mikunyan/typetrees/19d012ac862d35ae708b3e9819c144a6.dat +0 -0
- data/lib/mikunyan/typetrees/1a423ac0d72444d8b1e5648eea27de62.dat +0 -0
- data/lib/mikunyan/typetrees/1a443e14c645af0d1c787c747df78c79.dat +0 -0
- data/lib/mikunyan/typetrees/1a4924a6ba27c4cd346c378e252bbcd9.dat +0 -0
- data/lib/mikunyan/typetrees/1a8aa22f22aad282eb5847acc32c48c4.dat +0 -0
- data/lib/mikunyan/typetrees/1b15f8914d09a0f91015c60200600ad1.dat +0 -0
- data/lib/mikunyan/typetrees/1b81c9a9d553d513ad18b473cac9f3e5.dat +0 -0
- data/lib/mikunyan/typetrees/1c28236b6f2e0ac5cb3e915ba08809aa.dat +0 -0
- data/lib/mikunyan/typetrees/1c9aca6db12271b86e4759fcbd47ef4f.dat +0 -0
- data/lib/mikunyan/typetrees/1d188dac655495743ede8bf50e900348.dat +0 -0
- data/lib/mikunyan/typetrees/1d3212ed4ba9330b8cc6a4aa196a2b2f.dat +0 -0
- data/lib/mikunyan/typetrees/1d5aedbe4e95c8322fb5f141098c6e91.dat +0 -0
- data/lib/mikunyan/typetrees/1dd6a73cef747aa451d1eb4bc7ab6ba9.dat +0 -0
- data/lib/mikunyan/typetrees/1df2470081a677848028328c36afe347.dat +0 -0
- data/lib/mikunyan/typetrees/1e347d6a49dd26eca64146d8d1629c16.dat +0 -0
- data/lib/mikunyan/typetrees/1e831f2ccbb8f0cceabd75e4ae614edd.dat +0 -0
- data/lib/mikunyan/typetrees/1e8486720809f1f1134ad46a75855191.dat +0 -0
- data/lib/mikunyan/typetrees/1e87d82d4fd058509a3c7866db0e7356.dat +0 -0
- data/lib/mikunyan/typetrees/1eaa927fe597a5c984688ede0d7e0c46.dat +0 -0
- data/lib/mikunyan/typetrees/1ebcb3bc9f2a38130d9e3274f3c00201.dat +0 -0
- data/lib/mikunyan/typetrees/1ef8dc1e91e0cd01bd07036e6665ea40.dat +0 -0
- data/lib/mikunyan/typetrees/1f1262cc26714f10d5f84e0f8eb03864.dat +0 -0
- data/lib/mikunyan/typetrees/1f168f9bb657a2e84643dbc260a659e5.dat +0 -0
- data/lib/mikunyan/typetrees/1f61f675d1dd7911aa25c13d26476576.dat +0 -0
- data/lib/mikunyan/typetrees/1f6570e305da0841cf9545e1911c898b.dat +0 -0
- data/lib/mikunyan/typetrees/1f77b228205c78ee0df7e2b634863853.dat +0 -0
- data/lib/mikunyan/typetrees/1f994725ca628a20bb0526cedf9cb44b.dat +0 -0
- data/lib/mikunyan/typetrees/2030e4be48f1e6444ee7c802aa6ee04e.dat +0 -0
- data/lib/mikunyan/typetrees/204e3cd3604f3794a9ebc57816470b8b.dat +0 -0
- data/lib/mikunyan/typetrees/214291cadd50789a88176745966ff855.dat +0 -0
- data/lib/mikunyan/typetrees/214cccc3a5487f6e7d0e4dd13d2c7d9f.dat +0 -0
- data/lib/mikunyan/typetrees/2173d638d2217fa07eb74c6944dd831b.dat +0 -0
- data/lib/mikunyan/typetrees/21d00f71a60e4a3591c1c3d3dde7880f.dat +0 -0
- data/lib/mikunyan/typetrees/21d6ee4b99f9cbbf255d69f64c9d1459.dat +0 -0
- data/lib/mikunyan/typetrees/223200cd03b4c76caeaf422122a2b091.dat +0 -0
- data/lib/mikunyan/typetrees/224c10c05e99a377d1e41a2fa1c1dda1.dat +0 -0
- data/lib/mikunyan/typetrees/225d280603d6b901bb660283ef2dc6c1.dat +0 -0
- data/lib/mikunyan/typetrees/22a1ad8b8f62a891ca211417fe8d161b.dat +0 -0
- data/lib/mikunyan/typetrees/22a5fc27bdf2aeb77176acbab394d4f7.dat +0 -0
- data/lib/mikunyan/typetrees/22c6bb27058872e03ec09f60e1f71f77.dat +0 -0
- data/lib/mikunyan/typetrees/22de8a8e6131edd3951ff8d815999077.dat +0 -0
- data/lib/mikunyan/typetrees/22f105beba59b8a348fd1db5e1101ee6.dat +0 -0
- data/lib/mikunyan/typetrees/235608d8b8db7ffe00ee926ad1e4fcfb.dat +0 -0
- data/lib/mikunyan/typetrees/239f5922bb05f812c78d41a84451927a.dat +0 -0
- data/lib/mikunyan/typetrees/23aa0d39991cfaa3b448dc52e1b4e2f1.dat +0 -0
- data/lib/mikunyan/typetrees/23f7a8828f26b85351a2c73b9d042b58.dat +0 -0
- data/lib/mikunyan/typetrees/2409a93f8e4d219a23ac09a3771cd85e.dat +0 -0
- data/lib/mikunyan/typetrees/2413ff22e97a320f3db90e252bed5064.dat +0 -0
- data/lib/mikunyan/typetrees/2490347089301e3db2eac4055fd8f87d.dat +0 -0
- data/lib/mikunyan/typetrees/24e89a7207828509d5c5875a93b2106e.dat +0 -0
- data/lib/mikunyan/typetrees/252b1dbbc4b7cfed2594e04d6ff33e9a.dat +0 -0
- data/lib/mikunyan/typetrees/255352c3db1172a6a9c5c2605486d937.dat +0 -0
- data/lib/mikunyan/typetrees/26165a24a953362edb6a7078f6536c4b.dat +0 -0
- data/lib/mikunyan/typetrees/266d53113fa30d2b858f2768f92eaa14.dat +0 -0
- data/lib/mikunyan/typetrees/26b86854c33bca2efc9692ce14f5966d.dat +0 -0
- data/lib/mikunyan/typetrees/26edfe99eae8bb02d8148494ac056b19.dat +0 -0
- data/lib/mikunyan/typetrees/2706c8356160cd6aaa396532b3ce39ab.dat +0 -0
- data/lib/mikunyan/typetrees/270ad6077395c13a4cfafac5671a5620.dat +0 -0
- data/lib/mikunyan/typetrees/276165a162f9cbfeb3214464b7b8e7af.dat +0 -0
- data/lib/mikunyan/typetrees/27653c16987c2f00f7e701860db978b9.dat +0 -0
- data/lib/mikunyan/typetrees/27e91f156f1a8d11d4bcd66d3d6d52e8.dat +0 -0
- data/lib/mikunyan/typetrees/28460a98ae14a912f5c0393c9ebc21ba.dat +0 -0
- data/lib/mikunyan/typetrees/285301d63833986d582fb1893479d7f0.dat +0 -0
- data/lib/mikunyan/typetrees/2864d30fb7a07ba8c735165d90ed5ff2.dat +0 -0
- data/lib/mikunyan/typetrees/286928b2e061e5b81ab8f7095965a508.dat +0 -0
- data/lib/mikunyan/typetrees/2875b25dc4d545986bf5cb670c3769a0.dat +0 -0
- data/lib/mikunyan/typetrees/2892f2afcbbee74930c24875cff022b3.dat +0 -0
- data/lib/mikunyan/typetrees/28d4502541c70ba42b2303f87d8aea30.dat +0 -0
- data/lib/mikunyan/typetrees/28e15ac090050b5620a2b6b376f6be3d.dat +0 -0
- data/lib/mikunyan/typetrees/28fee9b8bbe71485d2aecff29c338906.dat +0 -0
- data/lib/mikunyan/typetrees/29418211d65c19bd8bd25a6d92cc89e1.dat +0 -0
- data/lib/mikunyan/typetrees/299723c380e0ae74b7740e291f44b5dd.dat +0 -0
- data/lib/mikunyan/typetrees/29a94a8e52beb2ddf2294ee984774759.dat +0 -0
- data/lib/mikunyan/typetrees/29e4301913d608e0be4aa608708bcf04.dat +0 -0
- data/lib/mikunyan/typetrees/2a819caa7d1cb8b5a354b3d2cdc21cf7.dat +0 -0
- data/lib/mikunyan/typetrees/2aa85eb9fb12fbc18406ad844d0dfce4.dat +0 -0
- data/lib/mikunyan/typetrees/2ad38f20aa997894b440f55bb2faa772.dat +0 -0
- data/lib/mikunyan/typetrees/2aebfac28b12b8d6fbf0d97563035a17.dat +0 -0
- data/lib/mikunyan/typetrees/2b9a59c22c5788fb05c2751753769e73.dat +0 -0
- data/lib/mikunyan/typetrees/2bf1eebd069f0d939216d45cc299be85.dat +0 -0
- data/lib/mikunyan/typetrees/2c303ef7be71806aaffa0121527d7fea.dat +0 -0
- data/lib/mikunyan/typetrees/2d0f68bd23c44c2815f9d5376ace084f.dat +0 -0
- data/lib/mikunyan/typetrees/2d2b1d63eb2a68ed94bbf7f50fc21d7b.dat +0 -0
- data/lib/mikunyan/typetrees/2d33f228d257f7b0b88c98914786292c.dat +0 -0
- data/lib/mikunyan/typetrees/2da9c96f9efc8b31a480d5b8858755f3.dat +0 -0
- data/lib/mikunyan/typetrees/2dbcc357c62060bea7491f02a0a3d0fa.dat +0 -0
- data/lib/mikunyan/typetrees/2dd9afa6072e9ccae001437684a2eae5.dat +0 -0
- data/lib/mikunyan/typetrees/2def4fa21af26d3102178151c2b47141.dat +0 -0
- data/lib/mikunyan/typetrees/2ef918365da75913b10d30a85c9a815e.dat +0 -0
- data/lib/mikunyan/typetrees/2f02075ebca922e67afa3ddddc951609.dat +0 -0
- data/lib/mikunyan/typetrees/2f0ee1e689a979766d022d88d6007338.dat +0 -0
- data/lib/mikunyan/typetrees/2f25cddba4c1ccf16383b175860f1817.dat +0 -0
- data/lib/mikunyan/typetrees/2f3af372d1cb4f523d9b630c7d796e66.dat +0 -0
- data/lib/mikunyan/typetrees/2f903e13950e7204e5adb9d0359bd5b2.dat +0 -0
- data/lib/mikunyan/typetrees/304725e57bc52f76ceaa856632058097.dat +0 -0
- data/lib/mikunyan/typetrees/305e4aeacbb64b15862510dad47502cb.dat +0 -0
- data/lib/mikunyan/typetrees/30667f06a99e7931816757b4b7fbce5c.dat +0 -0
- data/lib/mikunyan/typetrees/306f0c2739dc8ad54fb4a1a44d1a3880.dat +0 -0
- data/lib/mikunyan/typetrees/30a40cec9f8c45e9aeca61bb77e596ec.dat +0 -0
- data/lib/mikunyan/typetrees/30a60d48ac05138e74c99389277a6a1d.dat +0 -0
- data/lib/mikunyan/typetrees/30bd9b8cf9127e0899f5f5ddc0a7ef6b.dat +0 -0
- data/lib/mikunyan/typetrees/30e5283aee3520fef10b77ffad62c83d.dat +0 -0
- data/lib/mikunyan/typetrees/310b66fa6f7980b50a9afc5ae3de4be7.dat +0 -0
- data/lib/mikunyan/typetrees/313e0ef8529b6cf61e4628fea22c1248.dat +0 -0
- data/lib/mikunyan/typetrees/313f624e8093f279302b3b6525bbb83a.dat +0 -0
- data/lib/mikunyan/typetrees/31a3036cdbecf796277c319a4537c802.dat +0 -0
- data/lib/mikunyan/typetrees/32094882bae6171c02d75bd88c4d43e1.dat +0 -0
- data/lib/mikunyan/typetrees/3283853e944bcba5a34dbc0848eec183.dat +0 -0
- data/lib/mikunyan/typetrees/330078ad6b3dd7f2ddb7acc3e27016bd.dat +0 -0
- data/lib/mikunyan/typetrees/3383c534169866b1d8b813ef0c7efa0a.dat +0 -0
- data/lib/mikunyan/typetrees/3383de6791220633b8bf013ca6c7698c.dat +0 -0
- data/lib/mikunyan/typetrees/33c22162b5b5f467fe7a7006ec52a136.dat +0 -0
- data/lib/mikunyan/typetrees/34f82447344517eacb2e4f407ad31706.dat +0 -0
- data/lib/mikunyan/typetrees/35143c3dc21459692fdaf21d2e208b06.dat +0 -0
- data/lib/mikunyan/typetrees/3516f0737a1242d1296fb738f8e40f76.dat +0 -0
- data/lib/mikunyan/typetrees/351ec242900b73e5560978fbb0d0cf82.dat +0 -0
- data/lib/mikunyan/typetrees/351f9bb942a4da561dcc5fef0ef510fa.dat +0 -0
- data/lib/mikunyan/typetrees/35b5aac7e54392457593cab60408b045.dat +0 -0
- data/lib/mikunyan/typetrees/35f443f871a6e42f9927fa28f8624097.dat +0 -0
- data/lib/mikunyan/typetrees/35fe4dba66818845b49463deb48b4734.dat +0 -0
- data/lib/mikunyan/typetrees/3616ba8255b2e0b96f89f1d32a86917d.dat +0 -0
- data/lib/mikunyan/typetrees/36f7b2db46f99efbdbf3c762b0b382d1.dat +0 -0
- data/lib/mikunyan/typetrees/370b0f89c6f401663e2eb09de9796164.dat +0 -0
- data/lib/mikunyan/typetrees/3729a4fed3f20838308759acc8a3f2a4.dat +0 -0
- data/lib/mikunyan/typetrees/37efb94307307a222a4b44847853eb41.dat +0 -0
- data/lib/mikunyan/typetrees/38a0b7bcc276529c80d90d35e4d84b8b.dat +0 -0
- data/lib/mikunyan/typetrees/3a500d83b71456e038d03ae52811afd9.dat +0 -0
- data/lib/mikunyan/typetrees/3a6bcd3696897d807684f3618ad3703c.dat +0 -0
- data/lib/mikunyan/typetrees/3a7ca5d09a7c50a9a8fc4016c0d9eacf.dat +0 -0
- data/lib/mikunyan/typetrees/3acd9a6db557e2793568933508522dff.dat +0 -0
- data/lib/mikunyan/typetrees/3b0d63b530177b95b8456ba44dbbeb5b.dat +0 -0
- data/lib/mikunyan/typetrees/3b26cb0c7d7e87bb45886cb857409b54.dat +0 -0
- data/lib/mikunyan/typetrees/3b43dde4518e4846a3d21126d51cb10f.dat +0 -0
- data/lib/mikunyan/typetrees/3b8b6e6bb5334a23b9fdc673bf73adf7.dat +0 -0
- data/lib/mikunyan/typetrees/3b9086da85ee83d3b154eb2ea7fcba05.dat +0 -0
- data/lib/mikunyan/typetrees/3c11da6c3ab6191099ff9deeef7469ef.dat +0 -0
- data/lib/mikunyan/typetrees/3c22e0cc9d3429687479f46554eab311.dat +0 -0
- data/lib/mikunyan/typetrees/3c2ce35247b35fd2f612ba19e32d5f44.dat +0 -0
- data/lib/mikunyan/typetrees/3c6a89d0e033d366453210256ef1d7d3.dat +0 -0
- data/lib/mikunyan/typetrees/3c7741a17041c5316eee28e6894a1cbd.dat +0 -0
- data/lib/mikunyan/typetrees/3c87bdb0795e3e66f4b309308b847d3c.dat +0 -0
- data/lib/mikunyan/typetrees/3d0a9ade9f227dc11c8b499c261794e8.dat +0 -0
- data/lib/mikunyan/typetrees/3d0f69809d8a2f86ea31f70e7319a44a.dat +0 -0
- data/lib/mikunyan/typetrees/3d612124d62c9db4ff7642f6570decd6.dat +0 -0
- data/lib/mikunyan/typetrees/3d914550764c2274e8c62817ee10d65b.dat +0 -0
- data/lib/mikunyan/typetrees/3e10119f7d2d4d7e643a43d856c0dcfb.dat +0 -0
- data/lib/mikunyan/typetrees/3e26b7a0e24abd3fd61d61cf59b6c4de.dat +0 -0
- data/lib/mikunyan/typetrees/3eced59289a820b4fa3bd784dbcc21f5.dat +0 -0
- data/lib/mikunyan/typetrees/3ffd1baba4bd4f48922b8cbdef0e2a03.dat +0 -0
- data/lib/mikunyan/typetrees/3fffe3ab5176cce0865f5ff4f2fa427d.dat +0 -0
- data/lib/mikunyan/typetrees/406a3dc2b89329c85e3a9847abbe8fe5.dat +0 -0
- data/lib/mikunyan/typetrees/40da10691c0dcc34b5660762da133b32.dat +0 -0
- data/lib/mikunyan/typetrees/412c400c20dea4a9fc447f1a44404e68.dat +0 -0
- data/lib/mikunyan/typetrees/418787f0cbb25432ee54f9837940729a.dat +0 -0
- data/lib/mikunyan/typetrees/4197459266a6342554ae11d2361e03bd.dat +0 -0
- data/lib/mikunyan/typetrees/41c90ae9d2ff8f897261f8d5233c154e.dat +0 -0
- data/lib/mikunyan/typetrees/41cdd7329b57ba13590d9321a595218f.dat +0 -0
- data/lib/mikunyan/typetrees/41fae1321bd7ad1650d7cecc8b7738f4.dat +0 -0
- data/lib/mikunyan/typetrees/42cb37e0be59eee623e414924928a40b.dat +0 -0
- data/lib/mikunyan/typetrees/434b934f757d042e20f52d8c2ae20843.dat +0 -0
- data/lib/mikunyan/typetrees/43688f077be008681d7eb9c994a18319.dat +0 -0
- data/lib/mikunyan/typetrees/43796121850ca62303af099e74b78099.dat +0 -0
- data/lib/mikunyan/typetrees/439e66a89c7fdef6f0927c9256c0773a.dat +0 -0
- data/lib/mikunyan/typetrees/442339d34eb0fadbe32ec143c60178f9.dat +0 -0
- data/lib/mikunyan/typetrees/448f646b445110ec08e0fa261c60874b.dat +0 -0
- data/lib/mikunyan/typetrees/44e2e865d4b8ca1e2ff1a674fe72520c.dat +0 -0
- data/lib/mikunyan/typetrees/45346f514b26cc508276ebd72faa6efc.dat +0 -0
- data/lib/mikunyan/typetrees/45b09dc0aed1f613c87ca0244816df75.dat +0 -0
- data/lib/mikunyan/typetrees/46236a8c8f841316135a0708a271d46b.dat +0 -0
- data/lib/mikunyan/typetrees/46c7e33b8dcc4199930c0b6e936c806d.dat +0 -0
- data/lib/mikunyan/typetrees/46cbdd6fc1deba025fb300d3ab19d3f1.dat +0 -0
- data/lib/mikunyan/typetrees/46e5682e0f5a4297bf46ffb5fe276535.dat +0 -0
- data/lib/mikunyan/typetrees/46fda2d131e65f9426462feecebc25c4.dat +0 -0
- data/lib/mikunyan/typetrees/471d5e9908ef24e3f514e9c015278dcc.dat +0 -0
- data/lib/mikunyan/typetrees/47e415e4ded437316718ef638dadd1bb.dat +0 -0
- data/lib/mikunyan/typetrees/47ec19649a1286158a8473b98a437ad9.dat +0 -0
- data/lib/mikunyan/typetrees/4837f860c05f8a94a4f956b92e3dad20.dat +0 -0
- data/lib/mikunyan/typetrees/4855c8964e40430d995b0b5a16b06c29.dat +0 -0
- data/lib/mikunyan/typetrees/486ba4e15dbd6aea8ac1a064305889c8.dat +0 -0
- data/lib/mikunyan/typetrees/486fa2a06d3c4322486ff9d1ae9a91d8.dat +0 -0
- data/lib/mikunyan/typetrees/48d16bd72d4e00f18fcf7f164ca78fcf.dat +0 -0
- data/lib/mikunyan/typetrees/4978b2bc5bfb76f1d26d687ea1bd8be3.dat +0 -0
- data/lib/mikunyan/typetrees/49bb43122aea696618d75afae92c2b3d.dat +0 -0
- data/lib/mikunyan/typetrees/49ff511929094ac12ffaa4ab38ed7bd1.dat +0 -0
- data/lib/mikunyan/typetrees/4b93aa1a138b912b0c421019169acf04.dat +0 -0
- data/lib/mikunyan/typetrees/4bb640239fe9179b3fe914ef2ad73248.dat +0 -0
- data/lib/mikunyan/typetrees/4bfc6b1eb274517782a296ebc8d1af84.dat +0 -0
- data/lib/mikunyan/typetrees/4c4cafd75c2bdccfb2af56ac8cc9c6de.dat +0 -0
- data/lib/mikunyan/typetrees/4c974799da79b8bb90685d05d744a927.dat +0 -0
- data/lib/mikunyan/typetrees/4c9ee0b79c5e5bcbd0628aa9ea5398e4.dat +0 -0
- data/lib/mikunyan/typetrees/4c9efaab9658908236c454765ba987c8.dat +0 -0
- data/lib/mikunyan/typetrees/4d47eb52c44b5042b1d33f9885218658.dat +0 -0
- data/lib/mikunyan/typetrees/4da3f794df175c929b97594573801119.dat +0 -0
- data/lib/mikunyan/typetrees/4dbfaa1def6adb569b550804b19b4305.dat +0 -0
- data/lib/mikunyan/typetrees/4e2656508795cad0cb5c8aa02bd550b6.dat +0 -0
- data/lib/mikunyan/typetrees/4e3ad1f5059719dbf410367459b499a5.dat +0 -0
- data/lib/mikunyan/typetrees/4e588b6332554634ea7e07f6680f0582.dat +0 -0
- data/lib/mikunyan/typetrees/4ea79602e4aa87588eee6d1905d8cb7a.dat +0 -0
- data/lib/mikunyan/typetrees/4eabbb423148bfffb763dbee212b366b.dat +0 -0
- data/lib/mikunyan/typetrees/4f127c0d7cb01c946ae357e54fae15e1.dat +0 -0
- data/lib/mikunyan/typetrees/4f92691a2b77d52dbc397527bff35e5a.dat +0 -0
- data/lib/mikunyan/typetrees/5092b508377b9c6d5ad9895b3d286788.dat +0 -0
- data/lib/mikunyan/typetrees/515d8c2462ffd1457616311bf40b514f.dat +0 -0
- data/lib/mikunyan/typetrees/51963c3dcc24197eabb30cc6868420d9.dat +0 -0
- data/lib/mikunyan/typetrees/51a13aeaa0d05081dc075fcbb2f63ef8.dat +0 -0
- data/lib/mikunyan/typetrees/51c84e1e88d9b0111efef8b6e10c4a32.dat +0 -0
- data/lib/mikunyan/typetrees/52b9481201679837cd249e4a88b7e191.dat +0 -0
- data/lib/mikunyan/typetrees/52e5341311c906096706ed87a43d93a7.dat +0 -0
- data/lib/mikunyan/typetrees/5306e362d8eb0dd3ad5636b4ed4552a7.dat +0 -0
- data/lib/mikunyan/typetrees/538345acf19ef6ab1d9baaa1fa798ea4.dat +0 -0
- data/lib/mikunyan/typetrees/53dd52a23ef6605f90d1e659f26de1d7.dat +0 -0
- data/lib/mikunyan/typetrees/549eb077bec973227cd80a75ad8936ee.dat +0 -0
- data/lib/mikunyan/typetrees/54ec8f0635016644e98d13e28d89a99f.dat +0 -0
- data/lib/mikunyan/typetrees/54f9e32744f326f7a0bad79d35247e39.dat +0 -0
- data/lib/mikunyan/typetrees/5540f11fd4650f927a3ddea613e3fac4.dat +0 -0
- data/lib/mikunyan/typetrees/5627f7a0d565659b25cb38a17f6465cd.dat +0 -0
- data/lib/mikunyan/typetrees/56afddc7f2dabfd6c1b92f818c212973.dat +0 -0
- data/lib/mikunyan/typetrees/571c0f2afe47acf1cd520f332d803b55.dat +0 -0
- data/lib/mikunyan/typetrees/578296e9395d8cd2cdb48a693fbcef63.dat +0 -0
- data/lib/mikunyan/typetrees/581f43365e98d398f5a716a8662bb6c2.dat +0 -0
- data/lib/mikunyan/typetrees/5839854f435cc7e9094966fb28f1d4fd.dat +0 -0
- data/lib/mikunyan/typetrees/583dd2bd3110da224e35404a92a6b223.dat +0 -0
- data/lib/mikunyan/typetrees/58ef73d2332f4214c1edee344bebe42a.dat +0 -0
- data/lib/mikunyan/typetrees/59827bcd10f00f02e580cc25fd9b35dd.dat +0 -0
- data/lib/mikunyan/typetrees/5a49bcd872a89bb1868c4eff8906b310.dat +0 -0
- data/lib/mikunyan/typetrees/5aa0b5d1e3115ca6e2087ab05a7bba32.dat +0 -0
- data/lib/mikunyan/typetrees/5b1b6bf0de1c285996cbfcf535f79a8b.dat +0 -0
- data/lib/mikunyan/typetrees/5bbb1d896df4d71b93d2eb023283c967.dat +0 -0
- data/lib/mikunyan/typetrees/5bc42b93159267aabba724a6a7923603.dat +0 -0
- data/lib/mikunyan/typetrees/5bcd76d798e7b9f2f3ffd398fd2aa6d0.dat +0 -0
- data/lib/mikunyan/typetrees/5be518883c8348ae95891bc413f25d9a.dat +0 -0
- data/lib/mikunyan/typetrees/5c5443aa48dc982498dc45b407dd366c.dat +0 -0
- data/lib/mikunyan/typetrees/5c56c5326122dbfc17f05b4bd1073819.dat +0 -0
- data/lib/mikunyan/typetrees/5db1b04c981af23853d34d9c3b3e4e04.dat +0 -0
- data/lib/mikunyan/typetrees/5e04ed38a99206bb912ef5540d987422.dat +0 -0
- data/lib/mikunyan/typetrees/5e3043c1e8b48dc540b5587049a5652a.dat +0 -0
- data/lib/mikunyan/typetrees/5e4ba266c81110b8a145f252b27434fe.dat +0 -0
- data/lib/mikunyan/typetrees/5e6c5cfe60546fff82d8f510201e1333.dat +0 -0
- data/lib/mikunyan/typetrees/5efa4c14815cf0fce98ec9ccc0a5cd0f.dat +0 -0
- data/lib/mikunyan/typetrees/5efb55d345c70f1e0ab1086d54664f1b.dat +0 -0
- data/lib/mikunyan/typetrees/5fab403b08c59ff6a1cae93a9297e7ea.dat +0 -0
- data/lib/mikunyan/typetrees/5fb5352926a129871956f20d77d944ea.dat +0 -0
- data/lib/mikunyan/typetrees/5fc4c3a218278ab4061cbdc2b3421051.dat +0 -0
- data/lib/mikunyan/typetrees/600abd4d46cc5440a8c9fc82e53617c5.dat +0 -0
- data/lib/mikunyan/typetrees/605682f38c4566637070ca76d9c7d2fe.dat +0 -0
- data/lib/mikunyan/typetrees/60dad57ee0f8f8b133ea8cb45b9ec36e.dat +0 -0
- data/lib/mikunyan/typetrees/618e59f5518f89d1b3a5c7394befc2a2.dat +0 -0
- data/lib/mikunyan/typetrees/619374d5c7f049786553fa386d48f88b.dat +0 -0
- data/lib/mikunyan/typetrees/61a1f8107fe55e8dc70b53ee2eff2756.dat +0 -0
- data/lib/mikunyan/typetrees/61ac6bba7ed5747525d406d2d0585a95.dat +0 -0
- data/lib/mikunyan/typetrees/61fe5cedbfcc1fc0104298e4c582bfac.dat +0 -0
- data/lib/mikunyan/typetrees/620f42f8420121766d34f6447784f183.dat +0 -0
- data/lib/mikunyan/typetrees/626e47f12c9e82cbe8d22e58e9c22441.dat +0 -0
- data/lib/mikunyan/typetrees/6286036292a215a5bb0bcb1dd22f9363.dat +0 -0
- data/lib/mikunyan/typetrees/62e541c3b7db7e26fd3d18076463a677.dat +0 -0
- data/lib/mikunyan/typetrees/62fa22027c3b351611164287e25fd49f.dat +0 -0
- data/lib/mikunyan/typetrees/6348b3796b6b02138fc1dfafb5b20b0d.dat +0 -0
- data/lib/mikunyan/typetrees/63f2ec883b52eee871736caedebed659.dat +0 -0
- data/lib/mikunyan/typetrees/641020e7e2ce4264829d051c6fe93352.dat +0 -0
- data/lib/mikunyan/typetrees/6435a529e2ad3f76e629c15d69227f03.dat +0 -0
- data/lib/mikunyan/typetrees/643e11867d6e720ee84a107eb84644bd.dat +0 -0
- data/lib/mikunyan/typetrees/645b27b9c2e45aeb8f35a172ff464989.dat +0 -0
- data/lib/mikunyan/typetrees/6485f962bc35ac4b9c73ccc6e9a54a91.dat +0 -0
- data/lib/mikunyan/typetrees/64eff32a9399a62c0c1ff38ffc206094.dat +0 -0
- data/lib/mikunyan/typetrees/657663fcc23615b4f420398b9cf66800.dat +0 -0
- data/lib/mikunyan/typetrees/65d43587d7c352e4bd0630c5e2d2b298.dat +0 -0
- data/lib/mikunyan/typetrees/66405447c6973a81e978410c391172fe.dat +0 -0
- data/lib/mikunyan/typetrees/66699f4e7c97d82ff8b9383b2509b87e.dat +0 -0
- data/lib/mikunyan/typetrees/668204d5ecec40adf49520ed6a9025d2.dat +0 -0
- data/lib/mikunyan/typetrees/66c04efe53dbe7127cfdf869a8f95b15.dat +0 -0
- data/lib/mikunyan/typetrees/66e56c6f103e8a727c7ae530a8f7455d.dat +0 -0
- data/lib/mikunyan/typetrees/66fcee7a9b922f2ff5b0d9b52d46547c.dat +0 -0
- data/lib/mikunyan/typetrees/6764d788de27a14bb8ce1638fde37482.dat +0 -0
- data/lib/mikunyan/typetrees/676cc4c231281a90a6a7cd15c124eff4.dat +0 -0
- data/lib/mikunyan/typetrees/676f41d3949568666a56b6761578e00c.dat +0 -0
- data/lib/mikunyan/typetrees/678a2b17764e129def610fbc5b8c42bf.dat +0 -0
- data/lib/mikunyan/typetrees/67dc4bcb545456d2d3c96334a159cc9a.dat +0 -0
- data/lib/mikunyan/typetrees/67de679f93c1a1fada22b4ffaafbf382.dat +0 -0
- data/lib/mikunyan/typetrees/6826552d2f82ad461f4aef84f4d94ea3.dat +0 -0
- data/lib/mikunyan/typetrees/6883009ec58a82ea61000b9c42c5c162.dat +0 -0
- data/lib/mikunyan/typetrees/68d2447015cd020e38d89e52e297f90b.dat +0 -0
- data/lib/mikunyan/typetrees/68dffa1eee93c91703996387b600aa7e.dat +0 -0
- data/lib/mikunyan/typetrees/6932d6d1d46264c8680a181056f98be2.dat +0 -0
- data/lib/mikunyan/typetrees/6974f6c74321933ec4ba7437a55be2c3.dat +0 -0
- data/lib/mikunyan/typetrees/69930e70a6ce1751fde0232474bd6ee0.dat +0 -0
- data/lib/mikunyan/typetrees/69b01db128625aa95f1f92fb890ff045.dat +0 -0
- data/lib/mikunyan/typetrees/69c8dbb0802cc4bc9be68d5c7309b764.dat +0 -0
- data/lib/mikunyan/typetrees/69d2caf8f9638b6169d920c89d9ef16f.dat +0 -0
- data/lib/mikunyan/typetrees/6a315ab47bbb18fc937ba08523937b61.dat +0 -0
- data/lib/mikunyan/typetrees/6a6f68020de4f8d31c56c86f0382f285.dat +0 -0
- data/lib/mikunyan/typetrees/6ac2d1181bb850de49408801e9642c7c.dat +0 -0
- data/lib/mikunyan/typetrees/6ad9191fff669ba9974499b49a164eb6.dat +0 -0
- data/lib/mikunyan/typetrees/6b0764702e7fa567f1b7e41c78cc2429.dat +0 -0
- data/lib/mikunyan/typetrees/6bc25415a9108f87531e4c7946928d9b.dat +0 -0
- data/lib/mikunyan/typetrees/6bd7d7520290d78de5f270d96e24bb2b.dat +0 -0
- data/lib/mikunyan/typetrees/6bdc295cd9692eca0774303098f1d146.dat +0 -0
- data/lib/mikunyan/typetrees/6bf84760b5b66259d18266ef96ef7de1.dat +0 -0
- data/lib/mikunyan/typetrees/6c0f58fbee223f3b8a8fac3394f703bf.dat +0 -0
- data/lib/mikunyan/typetrees/6c7dcb0569480fe5a3393817b73dc97e.dat +0 -0
- data/lib/mikunyan/typetrees/6caeaf097185ade2eb31f23d1085537f.dat +0 -0
- data/lib/mikunyan/typetrees/6ccd29968422b0c727655900a021b33e.dat +0 -0
- data/lib/mikunyan/typetrees/6d1b97337aac9cb7094c7e1041b3e875.dat +0 -0
- data/lib/mikunyan/typetrees/6d5c997e9b5456804ba113755fc21d77.dat +0 -0
- data/lib/mikunyan/typetrees/6d624ed7be5b7d2bfe7a5333bdd41dae.dat +0 -0
- data/lib/mikunyan/typetrees/6dc0d34c2c0e79e0039a0ce24b8d7ad7.dat +0 -0
- data/lib/mikunyan/typetrees/6dcbd8595bad0e6a28405a02cf214475.dat +0 -0
- data/lib/mikunyan/typetrees/6e5277573492549897ee4815066ae959.dat +0 -0
- data/lib/mikunyan/typetrees/6ec5696dc525f7bf85a7bb2e1ae000a9.dat +0 -0
- data/lib/mikunyan/typetrees/6ed2fb56a9c16fd1781896a923bc5110.dat +0 -0
- data/lib/mikunyan/typetrees/6ef34d0e751e6b1699a5ea302b822e33.dat +0 -0
- data/lib/mikunyan/typetrees/6f0618d26354f0289c7090aaf688981a.dat +0 -0
- data/lib/mikunyan/typetrees/6f10d8f832d5adde6982d4515b3f0bb3.dat +0 -0
- data/lib/mikunyan/typetrees/6f5cd06250f9dcc3ca6c3bca26c54a4a.dat +0 -0
- data/lib/mikunyan/typetrees/6fe7137b38c0f129e598c03aabcd1b7d.dat +0 -0
- data/lib/mikunyan/typetrees/706686d4d71b0e1bf7c80acdaa4ee6f5.dat +0 -0
- data/lib/mikunyan/typetrees/70694abce333e1b33ac59f2073897f8c.dat +0 -0
- data/lib/mikunyan/typetrees/708b7450c6da65399971dc7713450987.dat +0 -0
- data/lib/mikunyan/typetrees/710ba136b5e726ce760e399a154d3147.dat +0 -0
- data/lib/mikunyan/typetrees/715d61497b6835c6d6051c1782d084d8.dat +0 -0
- data/lib/mikunyan/typetrees/7230c9eb36a0c72a7187ad952551e1e5.dat +0 -0
- data/lib/mikunyan/typetrees/72a04b61fcb3921ca9eae80f2e8116f2.dat +0 -0
- data/lib/mikunyan/typetrees/730963c6e93acb528bb26d1152f2f185.dat +0 -0
- data/lib/mikunyan/typetrees/736709e4aa82fa6e43c313608fdab426.dat +0 -0
- data/lib/mikunyan/typetrees/7426e29c09461093e756fbae4d601f21.dat +0 -0
- data/lib/mikunyan/typetrees/742c910494e1117e52cc42600eedf188.dat +0 -0
- data/lib/mikunyan/typetrees/742dfb0ecafe88a375d25ddf3b57c48f.dat +0 -0
- data/lib/mikunyan/typetrees/7487684e77cbd197aaf389864da1d8c7.dat +0 -0
- data/lib/mikunyan/typetrees/74d387e7f1b0ef0e146e96940005546f.dat +0 -0
- data/lib/mikunyan/typetrees/74dee2a3d385f2275898fdb717601239.dat +0 -0
- data/lib/mikunyan/typetrees/74e21134ffaafd89e66055c6276511eb.dat +0 -0
- data/lib/mikunyan/typetrees/7516312baadcdf604129e59e48ddd279.dat +0 -0
- data/lib/mikunyan/typetrees/75545c074fd129c54b22e1a6bcdcb66f.dat +0 -0
- data/lib/mikunyan/typetrees/7596aa057c69a1ec1a3a89ad75428393.dat +0 -0
- data/lib/mikunyan/typetrees/75be9be17431b833cd73a47d360d8ccf.dat +0 -0
- data/lib/mikunyan/typetrees/75d2f1d383a6d305cf13e74d9fbcbe27.dat +0 -0
- data/lib/mikunyan/typetrees/75e5f675169cf0850fafafa08a65cb38.dat +0 -0
- data/lib/mikunyan/typetrees/7602eb8dc1aab6b53a21f0eec61dcf50.dat +0 -0
- data/lib/mikunyan/typetrees/761ca81f78491542badc37f810ab3455.dat +0 -0
- data/lib/mikunyan/typetrees/762765b0cbe6e45e90e5327a46f736f3.dat +0 -0
- data/lib/mikunyan/typetrees/766ecf7bc48297e7896ab27f26a20718.dat +0 -0
- data/lib/mikunyan/typetrees/76ce55d4dbaf38f5c674ea9f0a344951.dat +0 -0
- data/lib/mikunyan/typetrees/76f4b627feb164db63eb7309397cc41c.dat +0 -0
- data/lib/mikunyan/typetrees/774f723655447fbac1acb3d6e2efe779.dat +0 -0
- data/lib/mikunyan/typetrees/77e140a777f2dcacb51121e0a5bd1f53.dat +0 -0
- data/lib/mikunyan/typetrees/7820575911fe2da513f40293adce9a18.dat +0 -0
- data/lib/mikunyan/typetrees/7827d12c70d793eea089e3d7f39d261d.dat +0 -0
- data/lib/mikunyan/typetrees/783160b4237e2d925847373d2e3e1f74.dat +0 -0
- data/lib/mikunyan/typetrees/78b7ad80f74e5183d7232e985f897e07.dat +0 -0
- data/lib/mikunyan/typetrees/78d8adfab8d2f5e87dc9f0940edf643e.dat +0 -0
- data/lib/mikunyan/typetrees/796f96b562ba5f95590515f1ff2b4ad4.dat +0 -0
- data/lib/mikunyan/typetrees/7a8e9c0bbba2cc55cba94498d74ce288.dat +0 -0
- data/lib/mikunyan/typetrees/7a92461726e9f3f6530e31cf5af5d1bf.dat +0 -0
- data/lib/mikunyan/typetrees/7a929c15d05fa9e0429b1b0b1aebc4fa.dat +0 -0
- data/lib/mikunyan/typetrees/7af10101ba0f53047f2ef70d8a9c804b.dat +0 -0
- data/lib/mikunyan/typetrees/7b060099aa81c5b21d273334dca40500.dat +0 -0
- data/lib/mikunyan/typetrees/7b2c23a9c82c5c46e142acfea65b3c97.dat +0 -0
- data/lib/mikunyan/typetrees/7b7447a6cf3fc8277777e805eba85851.dat +0 -0
- data/lib/mikunyan/typetrees/7bc51621c4b5daf39c657881089220a1.dat +0 -0
- data/lib/mikunyan/typetrees/7bdd8f909403558edc7cfc68ea95b815.dat +0 -0
- data/lib/mikunyan/typetrees/7c40ce9e4c671f7594f3d4fae7c32466.dat +0 -0
- data/lib/mikunyan/typetrees/7c5cf6d08d3a08f2a7974b31506de880.dat +0 -0
- data/lib/mikunyan/typetrees/7c6240188efe9290095ed1a669f90ec1.dat +0 -0
- data/lib/mikunyan/typetrees/7c68f879768df44f439ae870b70b6a9e.dat +0 -0
- data/lib/mikunyan/typetrees/7c6dc2b255110b522e6c300e8632f2a1.dat +0 -0
- data/lib/mikunyan/typetrees/7cbb1c953f2ed3ca40125e473bf2fce0.dat +0 -0
- data/lib/mikunyan/typetrees/7cdec7ef01e50eed77502d4e277c3e0d.dat +0 -0
- data/lib/mikunyan/typetrees/7cf0af7e0c7d50808a569121e7a4c0de.dat +0 -0
- data/lib/mikunyan/typetrees/7d2188e085d3917ebec9a1067d74de59.dat +0 -0
- data/lib/mikunyan/typetrees/7d7186ff509eeb1be635ead41f130cbb.dat +0 -0
- data/lib/mikunyan/typetrees/7db9444f76a2b8f439e4581d2274d36b.dat +0 -0
- data/lib/mikunyan/typetrees/7e050781d08ca9d10bc74beb7e91c3b5.dat +0 -0
- data/lib/mikunyan/typetrees/7e328a225b72b97191b52d631ccf62d2.dat +0 -0
- data/lib/mikunyan/typetrees/7ec49b5572da843e0e7d21ab5459a2da.dat +0 -0
- data/lib/mikunyan/typetrees/7ef50d120c6291f8451b25ad8abf0965.dat +0 -0
- data/lib/mikunyan/typetrees/7f52d4deb56f283a259b5e24c4bf3f54.dat +0 -0
- data/lib/mikunyan/typetrees/7f5bc8091a8db0e9aa2b5fbf64e7951b.dat +0 -0
- data/lib/mikunyan/typetrees/7f814eabb66e0fb6a82a15ef17f7e1d3.dat +0 -0
- data/lib/mikunyan/typetrees/7fab9e77215788a4f643d5f7397ffbb3.dat +0 -0
- data/lib/mikunyan/typetrees/7fb1270153bd6ccfa8bc7546dda95254.dat +0 -0
- data/lib/mikunyan/typetrees/805ccd3567f53eef88ad4ad0bfa2d5fe.dat +0 -0
- data/lib/mikunyan/typetrees/806230bcf014183c8e3ad32dfd4280ed.dat +0 -0
- data/lib/mikunyan/typetrees/80ba7945b19e87c90c6aa46fb4c7b9b2.dat +0 -0
- data/lib/mikunyan/typetrees/8146f1f01d4bf220c339260799ed1bb6.dat +0 -0
- data/lib/mikunyan/typetrees/818ddfe606de30c07daa36d729f982e2.dat +0 -0
- data/lib/mikunyan/typetrees/8198e72b2e2a96b9cfa38636b5565e13.dat +0 -0
- data/lib/mikunyan/typetrees/81d6f63da53d28f32efd4d3f6b1d3da8.dat +0 -0
- data/lib/mikunyan/typetrees/81e28d3a4102fabc98ac701e6a192ad4.dat +0 -0
- data/lib/mikunyan/typetrees/827f095b42d421f9185c642342736534.dat +0 -0
- data/lib/mikunyan/typetrees/82cbe6ba9f2fd496d8e14747a764dc4f.dat +0 -0
- data/lib/mikunyan/typetrees/82ef0bad8dda8ba9bd5e1c02d979553c.dat +0 -0
- data/lib/mikunyan/typetrees/833f8aadff717234b49269a5132edc7c.dat +0 -0
- data/lib/mikunyan/typetrees/8401d562403dab942459c07642072dd6.dat +0 -0
- data/lib/mikunyan/typetrees/841a9336c1bf3f743885c5872cc07610.dat +0 -0
- data/lib/mikunyan/typetrees/84441ff585c6e370e29c822a10ffaca8.dat +0 -0
- data/lib/mikunyan/typetrees/845046c14ae4f0948a7d3dbc4a0c539e.dat +0 -0
- data/lib/mikunyan/typetrees/8473edbc0acb04069b62cedcb384b5b3.dat +0 -0
- data/lib/mikunyan/typetrees/849b9d0ee2b45ed2b7ad871a6e9e7829.dat +0 -0
- data/lib/mikunyan/typetrees/849d2b6794bdc167b0ed4680bad500a8.dat +0 -0
- data/lib/mikunyan/typetrees/84c6ac46ef89030991cbbb3fd21d2889.dat +0 -0
- data/lib/mikunyan/typetrees/852794becbcf95f66992da2b96a69704.dat +0 -0
- data/lib/mikunyan/typetrees/863223fe4e4f151f9fac463e584de569.dat +0 -0
- data/lib/mikunyan/typetrees/86897fc97905918dc891437fa7a15696.dat +0 -0
- data/lib/mikunyan/typetrees/86d77ad7cf81dd25dd72cba6c8c6469f.dat +0 -0
- data/lib/mikunyan/typetrees/86e3dfad5ee7276a4684d1a52abff92e.dat +0 -0
- data/lib/mikunyan/typetrees/87a093027ec05bed0b579a2358a5b05d.dat +0 -0
- data/lib/mikunyan/typetrees/87dade7c5c3deedeb0ce5d9a8841f158.dat +0 -0
- data/lib/mikunyan/typetrees/87f77e11a02b179bb214bd76d685b401.dat +0 -0
- data/lib/mikunyan/typetrees/8925033300616905004fa9e086f1cbc9.dat +0 -0
- data/lib/mikunyan/typetrees/896dbaf3b3aebe84868b2f32670d760f.dat +0 -0
- data/lib/mikunyan/typetrees/89e4db8e910533e9ee1d1aea4ff83e90.dat +0 -0
- data/lib/mikunyan/typetrees/8a5260f6b3834d07a94ab067294b0cc5.dat +0 -0
- data/lib/mikunyan/typetrees/8b15ee3625eb1303de45e98f5be1f26a.dat +0 -0
- data/lib/mikunyan/typetrees/8b8d4b439b97c4ced21e607f897bafd8.dat +0 -0
- data/lib/mikunyan/typetrees/8ba111f9d4192ab8bc45d1660fd86fc6.dat +0 -0
- data/lib/mikunyan/typetrees/8c484a566ae9d66ee0aceea5a42e3789.dat +0 -0
- data/lib/mikunyan/typetrees/8c55b3391474b0260c3d86e0c2bcd993.dat +0 -0
- data/lib/mikunyan/typetrees/8c628dc93bfed0b3426a4bac24a61747.dat +0 -0
- data/lib/mikunyan/typetrees/8c76f4279782912a6b3aa48b66ed01b7.dat +0 -0
- data/lib/mikunyan/typetrees/8c86f4ac6b7f47c045560d4383aadc8d.dat +0 -0
- data/lib/mikunyan/typetrees/8d0a59169a1ccf55f552c37131047e9c.dat +0 -0
- data/lib/mikunyan/typetrees/8d3c252a2ef87c9fce3fb31e19ba56a8.dat +0 -0
- data/lib/mikunyan/typetrees/8d9b6bdaddb4b93dfcd710699c75727e.dat +0 -0
- data/lib/mikunyan/typetrees/8dd2e23af15a28379c28908e65221abe.dat +0 -0
- data/lib/mikunyan/typetrees/8df95c0391bc4e4f4e0a42aba29ab8a2.dat +0 -0
- data/lib/mikunyan/typetrees/8ea24924f881c1cd4138c7788c0ef205.dat +0 -0
- data/lib/mikunyan/typetrees/8fbd7a1c59a8d433c600d62fa2740c9d.dat +0 -0
- data/lib/mikunyan/typetrees/904f143a242ea542145368df1fc29c24.dat +0 -0
- data/lib/mikunyan/typetrees/9075bdf87ce7fe1d17fed3456a6a834b.dat +0 -0
- data/lib/mikunyan/typetrees/912cebe0cd9b0a9e0d0a548bfa2fd382.dat +0 -0
- data/lib/mikunyan/typetrees/914d9c276e68b21df32efb3447e983bf.dat +0 -0
- data/lib/mikunyan/typetrees/91ffea0726900cb751e36f83816df13e.dat +0 -0
- data/lib/mikunyan/typetrees/921d3a8ec14bca7a3ac12be64e59d740.dat +0 -0
- data/lib/mikunyan/typetrees/922285a96e080d3b0fb9d1483ace0c71.dat +0 -0
- data/lib/mikunyan/typetrees/924f3272ed53ff58e2379a7684f5069a.dat +0 -0
- data/lib/mikunyan/typetrees/927fb27ec5aa6f52f67992bafc6e1df8.dat +0 -0
- data/lib/mikunyan/typetrees/92a27f6a5e14dc6ab8018923723c818c.dat +0 -0
- data/lib/mikunyan/typetrees/92f1b9794cb255b2fbf962648186a962.dat +0 -0
- data/lib/mikunyan/typetrees/936739f45f26fd8b81a4ea70f2c8cad4.dat +0 -0
- data/lib/mikunyan/typetrees/936ac825c5beb010bed3b6b7953f4dd2.dat +0 -0
- data/lib/mikunyan/typetrees/937a6b5c5f5b313185d252e38d145b17.dat +0 -0
- data/lib/mikunyan/typetrees/93c3d14c8b88c38e3aa39de936d38caa.dat +0 -0
- data/lib/mikunyan/typetrees/940c9db2511f9898769e11849d71f82f.dat +0 -0
- data/lib/mikunyan/typetrees/94a19169d56c4f123092fd0d1e4bdba1.dat +0 -0
- data/lib/mikunyan/typetrees/94d6c861f2b382fd81a12d2a1b1e7ce2.dat +0 -0
- data/lib/mikunyan/typetrees/954706197f5ed745cd14444d281f1516.dat +0 -0
- data/lib/mikunyan/typetrees/959ce281abde8687d3ab1adce9e00f5a.dat +0 -0
- data/lib/mikunyan/typetrees/961be27d12d60b1b3421191d5256a876.dat +0 -0
- data/lib/mikunyan/typetrees/964c223b82bb8bac12cd3e53186a3e13.dat +0 -0
- data/lib/mikunyan/typetrees/9657457af3bc45d81a0b5871a0d18e77.dat +0 -0
- data/lib/mikunyan/typetrees/96785e58aac89a09fce6ca2c9448311b.dat +0 -0
- data/lib/mikunyan/typetrees/96a47566b4e135078f690a4a69935d58.dat +0 -0
- data/lib/mikunyan/typetrees/96bc046967bdbe77c417e21eb49ce1ae.dat +0 -0
- data/lib/mikunyan/typetrees/96c46d945b3cc21e2a5ca09659ae4ef2.dat +0 -0
- data/lib/mikunyan/typetrees/974cb1de01d7acb61e52fe38b84e0ee0.dat +0 -0
- data/lib/mikunyan/typetrees/97da5f4688e45a57c8b42d4f42497297.dat +0 -0
- data/lib/mikunyan/typetrees/97dc11471130df660f6d50adbeb2d686.dat +0 -0
- data/lib/mikunyan/typetrees/97ec0712102a3ea3f1cf8c0a4e47c070.dat +0 -0
- data/lib/mikunyan/typetrees/9805cf0348f163ad092ab00ca9d122d1.dat +0 -0
- data/lib/mikunyan/typetrees/983db003d56cd893ea50a9b80e743a79.dat +0 -0
- data/lib/mikunyan/typetrees/99359255da094b94c150311921ba4420.dat +0 -0
- data/lib/mikunyan/typetrees/996817b009f16e87aaae3624bce113c2.dat +0 -0
- data/lib/mikunyan/typetrees/999a8dbc0e53be755905751739c9e11c.dat +0 -0
- data/lib/mikunyan/typetrees/99bd795c8f9317e294a68c7fbe03ca20.dat +0 -0
- data/lib/mikunyan/typetrees/9a17ee635b6dc8432d0ec80c4ad73e29.dat +0 -0
- data/lib/mikunyan/typetrees/9a83846bdc10f24de3183b3d1b510d5c.dat +0 -0
- data/lib/mikunyan/typetrees/9aed068deda3d33814c4fb67736e29a2.dat +0 -0
- data/lib/mikunyan/typetrees/9af59502167704cb56d2208a8f4cb9d4.dat +0 -0
- data/lib/mikunyan/typetrees/9b387d50420c652bc1655e5246825221.dat +0 -0
- data/lib/mikunyan/typetrees/9b3c138987aed9be83010b14bab944c5.dat +0 -0
- data/lib/mikunyan/typetrees/9ba48aaf9d1e25c3df443b187b038f86.dat +0 -0
- data/lib/mikunyan/typetrees/9bcd9c6543c17c98a8822bd42ec93276.dat +0 -0
- data/lib/mikunyan/typetrees/9ca11a3c3ac28b3faadefc2077eeed2c.dat +0 -0
- data/lib/mikunyan/typetrees/9cd47fa65c9a8be7ae36db2dc33968b2.dat +0 -0
- data/lib/mikunyan/typetrees/9d1630b1d7e3bc24abe46e5860a2a179.dat +0 -0
- data/lib/mikunyan/typetrees/9e0ab8d396f3249a3958dd930f81f61b.dat +0 -0
- data/lib/mikunyan/typetrees/9e26f96591d351c8dfe911b5dc239000.dat +0 -0
- data/lib/mikunyan/typetrees/9eabac6ec66ffe818e008883728fcc1b.dat +0 -0
- data/lib/mikunyan/typetrees/9ec70d7af96c9625d1bfca15d188b85c.dat +0 -0
- data/lib/mikunyan/typetrees/9ee328006f16e91aebcb4f27698f145a.dat +0 -0
- data/lib/mikunyan/typetrees/9f1c6f94c1da7e8f10bb554b37c6790b.dat +0 -0
- data/lib/mikunyan/typetrees/9f459ec8887c3967985546f1fde8df43.dat +0 -0
- data/lib/mikunyan/typetrees/9f6e88bbe6df9df9cf7291b5706b5552.dat +0 -0
- data/lib/mikunyan/typetrees/9fc1437f6cfe5c490d2e978f16ab14c6.dat +0 -0
- data/lib/mikunyan/typetrees/9fc31ad55662eaea988a01e22a644c39.dat +0 -0
- data/lib/mikunyan/typetrees/a02319b1d2e24272d1b421900c6ad759.dat +0 -0
- data/lib/mikunyan/typetrees/a0efb292088d42a70bf1e896a86b432c.dat +0 -0
- data/lib/mikunyan/typetrees/a13e161c148750300e73c4a6fce7bfbd.dat +0 -0
- data/lib/mikunyan/typetrees/a1537a31e824cbbd6c05da4642c985b8.dat +0 -0
- data/lib/mikunyan/typetrees/a1976c4b66d47015022b085de5b49ccb.dat +0 -0
- data/lib/mikunyan/typetrees/a19b930d9a846346a5d8b896c5e96486.dat +0 -0
- data/lib/mikunyan/typetrees/a1ade835112d0f2821871fa3c6e4e587.dat +0 -0
- data/lib/mikunyan/typetrees/a1c1ffb08b1cc7f3f88f09356496a286.dat +0 -0
- data/lib/mikunyan/typetrees/a1d647cb11661f7cf6547453ea5f9861.dat +0 -0
- data/lib/mikunyan/typetrees/a1ed39a19efb6f3ebc0a032dc6d587c9.dat +0 -0
- data/lib/mikunyan/typetrees/a2612890399b22f059e37145e4db6ff9.dat +0 -0
- data/lib/mikunyan/typetrees/a2dc9dbb5b830efd10b60100b47d8d36.dat +0 -0
- data/lib/mikunyan/typetrees/a3125dde8c910a6d078682616f144a80.dat +0 -0
- data/lib/mikunyan/typetrees/a3523f5739a17bb6054dde6c088584ce.dat +0 -0
- data/lib/mikunyan/typetrees/a372646834bcaf26eab1d21b29e39553.dat +0 -0
- data/lib/mikunyan/typetrees/a3c506becc8f7d25351b47778de7ebb5.dat +0 -0
- data/lib/mikunyan/typetrees/a3d63d57b4f43b62a77e83e05699a5f6.dat +0 -0
- data/lib/mikunyan/typetrees/a439ae65edce4289e3ff832904fea27d.dat +0 -0
- data/lib/mikunyan/typetrees/a443a7ce5365c746c6e9c64036662d13.dat +0 -0
- data/lib/mikunyan/typetrees/a46a51168885aa63162102ca3f63007a.dat +0 -0
- data/lib/mikunyan/typetrees/a47e8a7b7a1ef3aba7372439af5d26a7.dat +0 -0
- data/lib/mikunyan/typetrees/a49b27a93f3de2ad5ef668735e5042b2.dat +0 -0
- data/lib/mikunyan/typetrees/a4f194097b08bc4c5019c3a4ea6f5cbd.dat +0 -0
- data/lib/mikunyan/typetrees/a52792d409265e0e596cf29f070ecb5d.dat +0 -0
- data/lib/mikunyan/typetrees/a545a5020d58adc9f675e7c540cc8528.dat +0 -0
- data/lib/mikunyan/typetrees/a5610d8eea1dd355fe6d1abe467ef169.dat +0 -0
- data/lib/mikunyan/typetrees/a5c609a17035f4d56f2ae04d1b39a920.dat +0 -0
- data/lib/mikunyan/typetrees/a5c7631994dff71adc95b7f89031b93b.dat +0 -0
- data/lib/mikunyan/typetrees/a607b371095d71157668890ef7ba9916.dat +0 -0
- data/lib/mikunyan/typetrees/a60842f261bd4d64035c8ec28d3479e8.dat +0 -0
- data/lib/mikunyan/typetrees/a6eed3721efd15a26738b18db46be12f.dat +0 -0
- data/lib/mikunyan/typetrees/a70f7abc6586fb35b3a0641aa81e9375.dat +0 -0
- data/lib/mikunyan/typetrees/a780b20860600360dca50aabf28af3a8.dat +0 -0
- data/lib/mikunyan/typetrees/a7ab35bd41beb7749427a39f92a03d4b.dat +0 -0
- data/lib/mikunyan/typetrees/a83755f3cbd13d1fb2fee65b71f3d548.dat +0 -0
- data/lib/mikunyan/typetrees/a8d5288ef078923b2de828fe161efa45.dat +0 -0
- data/lib/mikunyan/typetrees/a9151a17a865b711150442f2d88c1562.dat +0 -0
- data/lib/mikunyan/typetrees/ab4e5036e05e74cdac2d53b6019bc9eb.dat +0 -0
- data/lib/mikunyan/typetrees/ab84ab1a36bb2a6b65af81284f111350.dat +0 -0
- data/lib/mikunyan/typetrees/abaa04359c1280b858eeac4cd31a7aea.dat +0 -0
- data/lib/mikunyan/typetrees/abce5e1c4492692e276ff3d9365f9465.dat +0 -0
- data/lib/mikunyan/typetrees/abd3c4b2ff616cc78d42c5941d8569e0.dat +0 -0
- data/lib/mikunyan/typetrees/ac0b1a1717abe360c1a00057f5d2abb6.dat +0 -0
- data/lib/mikunyan/typetrees/ac5efb9153fd30cd5e78552e69f83830.dat +0 -0
- data/lib/mikunyan/typetrees/ac907a47e9d727d24ca82a3ee68dd8df.dat +0 -0
- data/lib/mikunyan/typetrees/acf82061a06bb855c2a2a6e73a2b97fb.dat +0 -0
- data/lib/mikunyan/typetrees/ad2ca9a0fe21a7cf9793d8ace16bb3cd.dat +0 -0
- data/lib/mikunyan/typetrees/add53ee9a755d72f14f4d673d2dac56b.dat +0 -0
- data/lib/mikunyan/typetrees/adf5eba4e81b1d740ea0068a30aa8a37.dat +0 -0
- data/lib/mikunyan/typetrees/ae12c8f4663719b3d423361a8b8a62d2.dat +0 -0
- data/lib/mikunyan/typetrees/aeadce2965a198a87587c0beac675004.dat +0 -0
- data/lib/mikunyan/typetrees/aeeebbdbd802239fdfc3aaf98ffc5d01.dat +0 -0
- data/lib/mikunyan/typetrees/af863b6969b9b82be9450f0574339f65.dat +0 -0
- data/lib/mikunyan/typetrees/af9a16c5c3d9f5104290fff6305334e2.dat +0 -0
- data/lib/mikunyan/typetrees/aff142075870161380a891d11baeb767.dat +0 -0
- data/lib/mikunyan/typetrees/b093ef1cb958a6b1cf5a00c31b6e05c4.dat +0 -0
- data/lib/mikunyan/typetrees/b0adafbe24f8148ebf01794ee6679925.dat +0 -0
- data/lib/mikunyan/typetrees/b0f22973848e1cf655dfdf8064bfa400.dat +0 -0
- data/lib/mikunyan/typetrees/b14bcb0865632d1b2d6e215a000e4c0f.dat +0 -0
- data/lib/mikunyan/typetrees/b1fe84b5bfdc47e2b1b930db296afb2f.dat +0 -0
- data/lib/mikunyan/typetrees/b20231c215c4c1b82b98bb49418c5cbe.dat +0 -0
- data/lib/mikunyan/typetrees/b204c22c22b1a08f780435c2cb4e6e36.dat +0 -0
- data/lib/mikunyan/typetrees/b23ac00b23adf1bb2b3d7c5553ad5dad.dat +0 -0
- data/lib/mikunyan/typetrees/b288ea39c72d3b3d238cb4f3fc076d0a.dat +0 -0
- data/lib/mikunyan/typetrees/b2c14391e281903c5a5157289977d33f.dat +0 -0
- data/lib/mikunyan/typetrees/b2cc7a58ffc0556ece83264e81dff623.dat +0 -0
- data/lib/mikunyan/typetrees/b2f39a1d526b8a4c6aad16cff7ca9ea8.dat +0 -0
- data/lib/mikunyan/typetrees/b2fbe9f493982acd18f063f7ab5a81aa.dat +0 -0
- data/lib/mikunyan/typetrees/b31c04cde0ffadc258d46846966594b1.dat +0 -0
- data/lib/mikunyan/typetrees/b3290db9f9d2e2862a1367d32838130e.dat +0 -0
- data/lib/mikunyan/typetrees/b354679381971a70db4d0035cc730543.dat +0 -0
- data/lib/mikunyan/typetrees/b35bf02952f2946208ff6b4deca3a6a9.dat +0 -0
- data/lib/mikunyan/typetrees/b36337bd6d2e99167473b8a383361c21.dat +0 -0
- data/lib/mikunyan/typetrees/b38ca8dbedd791b7ca3ca07095a9f312.dat +0 -0
- data/lib/mikunyan/typetrees/b38d9554723d82e3bc95c076ca902704.dat +0 -0
- data/lib/mikunyan/typetrees/b3fdd03ac222c685fe75187c0b44c489.dat +0 -0
- data/lib/mikunyan/typetrees/b494c2cb6c527914e903d8d6e17f30e9.dat +0 -0
- data/lib/mikunyan/typetrees/b519ba66b3244a4bfaf9a65938d61b67.dat +0 -0
- data/lib/mikunyan/typetrees/b51e06b75a0e28a9f2f242726a3814d4.dat +0 -0
- data/lib/mikunyan/typetrees/b53f2d12e7a6d302f50ad4162070fe13.dat +0 -0
- data/lib/mikunyan/typetrees/b684fb202e70b6d6c9fa64988e29576e.dat +0 -0
- data/lib/mikunyan/typetrees/b6bbd0e88d1feb636d89bd766ea5934f.dat +0 -0
- data/lib/mikunyan/typetrees/b6cc407b2d3c753bf79661a477113977.dat +0 -0
- data/lib/mikunyan/typetrees/b7056b24cf06fc6058b412a2c2dad2bb.dat +0 -0
- data/lib/mikunyan/typetrees/b78821b6aeb5b79c8961728a9f068024.dat +0 -0
- data/lib/mikunyan/typetrees/b79aed1f22f656993386add127833156.dat +0 -0
- data/lib/mikunyan/typetrees/b7b8ff0c7ec96a3bd77eabf9525d4f06.dat +0 -0
- data/lib/mikunyan/typetrees/b7d7910ac57c74d889686f738faa2129.dat +0 -0
- data/lib/mikunyan/typetrees/b7e5c868b4ec8e08bd3742a41789553f.dat +0 -0
- data/lib/mikunyan/typetrees/b927314c9878d83dca779ce9d6fc4903.dat +0 -0
- data/lib/mikunyan/typetrees/b9505154d75e141fc175dd698fcd1cef.dat +0 -0
- data/lib/mikunyan/typetrees/b97c898309dcb4b179b92f5dd4a828aa.dat +0 -0
- data/lib/mikunyan/typetrees/b980908065249a4bec8305d81d7ac7b7.dat +0 -0
- data/lib/mikunyan/typetrees/b9a41dcaf8b39c9e9f35bd4213787e0c.dat +0 -0
- data/lib/mikunyan/typetrees/ba1996aca11b1fbb146d9b0b3d8655ad.dat +0 -0
- data/lib/mikunyan/typetrees/ba26d1ee9f8242f4e94643f714aa18e1.dat +0 -0
- data/lib/mikunyan/typetrees/ba47ad58f6906c6bfe5bbf2de86de146.dat +0 -0
- data/lib/mikunyan/typetrees/ba716592649b6cfbc9f19c254a4d4517.dat +0 -0
- data/lib/mikunyan/typetrees/bb85fb2b191dd4282476910c85388c01.dat +0 -0
- data/lib/mikunyan/typetrees/bbd1f586c5ef70e20cb22656e8ce820b.dat +0 -0
- data/lib/mikunyan/typetrees/bc40049689b7cec9aa3d55e2ea8de2cf.dat +0 -0
- data/lib/mikunyan/typetrees/bc44f3fd1f7a53385f632e6a3ddb1713.dat +0 -0
- data/lib/mikunyan/typetrees/bc55158477811012972fb0d4b572d900.dat +0 -0
- data/lib/mikunyan/typetrees/bc6a0079c1aaf2c88aa0baef8cafb07b.dat +0 -0
- data/lib/mikunyan/typetrees/bc6ec2e437d1c2fdf300138d6cd908c4.dat +0 -0
- data/lib/mikunyan/typetrees/bcbec448e806266dcc4c28030f3860f1.dat +0 -0
- data/lib/mikunyan/typetrees/bcdcbeafe799355f39a43b263d10389b.dat +0 -0
- data/lib/mikunyan/typetrees/bd08188c47e3a9732b1233b9979acead.dat +0 -0
- data/lib/mikunyan/typetrees/bd3e65b436ca9bddcf08b9369dc166c9.dat +0 -0
- data/lib/mikunyan/typetrees/bd9937fc95c43ace4f598498922efdf4.dat +0 -0
- data/lib/mikunyan/typetrees/bda8c24186074c70bb3983fe48af6d0a.dat +0 -0
- data/lib/mikunyan/typetrees/bdad82ac8e818a48cc8c8c353fd1b232.dat +0 -0
- data/lib/mikunyan/typetrees/be2b49e54ae8d3aac75bd34a6d87e5e5.dat +0 -0
- data/lib/mikunyan/typetrees/be521590c2a7e119c31979e36c98789e.dat +0 -0
- data/lib/mikunyan/typetrees/be9c29138eea51e485e58ae7d0ee5eda.dat +0 -0
- data/lib/mikunyan/typetrees/bea7fa6dbf25a492093fec0b0b12c49f.dat +0 -0
- data/lib/mikunyan/typetrees/bea915a8ab3d9b55e80c969a22e692d3.dat +0 -0
- data/lib/mikunyan/typetrees/bf70bb56d86ace6047252688d663d8c4.dat +0 -0
- data/lib/mikunyan/typetrees/bf9dd695d7f2b4c1f07279f58362d4a5.dat +0 -0
- data/lib/mikunyan/typetrees/bfc41466cf63095c9a89e4defeea56f5.dat +0 -0
- data/lib/mikunyan/typetrees/c097c2178bc05715274a8513f32f5e2d.dat +0 -0
- data/lib/mikunyan/typetrees/c135fdff1ecf351ff2968c0c575a93fc.dat +0 -0
- data/lib/mikunyan/typetrees/c184743520186f546000de20f4d19736.dat +0 -0
- data/lib/mikunyan/typetrees/c1bd7854033214a22ac0e141089fbb2d.dat +0 -0
- data/lib/mikunyan/typetrees/c1e394cb8e3b83562307194fb6d429af.dat +0 -0
- data/lib/mikunyan/typetrees/c2c15e3018e440dfbc88ab67b75f4c1d.dat +0 -0
- data/lib/mikunyan/typetrees/c2ca897ba3f0d195562afbc35c837335.dat +0 -0
- data/lib/mikunyan/typetrees/c31b92b7eee9c5c57313fb562eba9dc2.dat +0 -0
- data/lib/mikunyan/typetrees/c3a49c5484231f188d2dbf0ce906983e.dat +0 -0
- data/lib/mikunyan/typetrees/c3a8bc8f5809ef66c48301555ad887c9.dat +0 -0
- data/lib/mikunyan/typetrees/c3bd45c36189c3769b3605e3e68074b6.dat +0 -0
- data/lib/mikunyan/typetrees/c3d60ce6816f9ca79e378c42fa1dce89.dat +0 -0
- data/lib/mikunyan/typetrees/c40f47d114996fd5b6fcad6dccf63698.dat +0 -0
- data/lib/mikunyan/typetrees/c42229e0ac25eba7b65d00c6bf5a14c4.dat +0 -0
- data/lib/mikunyan/typetrees/c45f92b4ac045c96d0360b5f6a3b1dc4.dat +0 -0
- data/lib/mikunyan/typetrees/c4aa8047d41bec5b2fa0fafd4d334064.dat +0 -0
- data/lib/mikunyan/typetrees/c4c62993971a4c233bae8f8954b4509c.dat +0 -0
- data/lib/mikunyan/typetrees/c545e03ac5b8e05354a606a32d652451.dat +0 -0
- data/lib/mikunyan/typetrees/c58ca61dd3a7ba754ce32006f4824d1c.dat +0 -0
- data/lib/mikunyan/typetrees/c593e13a55803ee78c43e19ed6675bcb.dat +0 -0
- data/lib/mikunyan/typetrees/c63da93518d9d5df594b4099f3e01567.dat +0 -0
- data/lib/mikunyan/typetrees/c65c019fd81d3915b9a3c8051b15953f.dat +0 -0
- data/lib/mikunyan/typetrees/c714531f729b9151841641b4bdd70994.dat +0 -0
- data/lib/mikunyan/typetrees/c8300105c5f2c3f44c2e11603f5ed908.dat +0 -0
- data/lib/mikunyan/typetrees/c838052a240cb84f4f6e2439f5bbdc53.dat +0 -0
- data/lib/mikunyan/typetrees/c91cee33fcf7382fead17e755bd7d40c.dat +0 -0
- data/lib/mikunyan/typetrees/c9531c7582f449d66888b906ac3c1d52.dat +0 -0
- data/lib/mikunyan/typetrees/c963ff70381de0acb5457051e36286c3.dat +0 -0
- data/lib/mikunyan/typetrees/c96a64061d3e391b7f3309bd4a644969.dat +0 -0
- data/lib/mikunyan/typetrees/ca2b42eb4ee5875caf48adf3239dd23b.dat +0 -0
- data/lib/mikunyan/typetrees/caeb4cbab1b7b97f81befe2c8e3f8f3f.dat +0 -0
- data/lib/mikunyan/typetrees/cb2bfcd356194433b46de145d0dfc4d8.dat +0 -0
- data/lib/mikunyan/typetrees/cb419960ac03a9307354fbf2ad2bda01.dat +0 -0
- data/lib/mikunyan/typetrees/cba283a78b20bbd9f0dd18c977b69d8e.dat +0 -0
- data/lib/mikunyan/typetrees/cbd196f0addd9143d0c36315c3c00349.dat +0 -0
- data/lib/mikunyan/typetrees/cbd6b8b86e0d05798e704eb7c8fff126.dat +0 -0
- data/lib/mikunyan/typetrees/cc38b2aee76814e979699396b0a1cfdf.dat +0 -0
- data/lib/mikunyan/typetrees/cc8f6e05143e049494c7eac0553f3883.dat +0 -0
- data/lib/mikunyan/typetrees/ccafc28ff2fb62c0cdf1694dddad079b.dat +0 -0
- data/lib/mikunyan/typetrees/ccd083c7c396a7a74c669ea21372897b.dat +0 -0
- data/lib/mikunyan/typetrees/cd04f39396ad93511bc1502e8e00ebb4.dat +0 -0
- data/lib/mikunyan/typetrees/cd0b1e6d795a4dc2b94ed471a625657e.dat +0 -0
- data/lib/mikunyan/typetrees/cd1cec16765c251d9e919147cf6d75c7.dat +0 -0
- data/lib/mikunyan/typetrees/cd299f8158c5d24d299bc2279a86222d.dat +0 -0
- data/lib/mikunyan/typetrees/cd3b5a93c404b34df1fac33b45db8014.dat +0 -0
- data/lib/mikunyan/typetrees/cd7036db3b0bbff750fff707bdce6daf.dat +0 -0
- data/lib/mikunyan/typetrees/cdecd039c577a343625b366d85a65f6b.dat +0 -0
- data/lib/mikunyan/typetrees/cdf9eaa879b1eb8edb28e8d7fa3781ce.dat +0 -0
- data/lib/mikunyan/typetrees/ce791e8dc4d4746cf247a6ac354e6f3e.dat +0 -0
- data/lib/mikunyan/typetrees/ce9c15fa0aa98a21872deef3bb0abf34.dat +0 -0
- data/lib/mikunyan/typetrees/ceb5d2c8db7960822dc7d09aa88560e9.dat +0 -0
- data/lib/mikunyan/typetrees/cf068435a0d00c8aed4a68588d17d84d.dat +0 -0
- data/lib/mikunyan/typetrees/cfcb6a2bde1d6c4a4d79aeda69a03c07.dat +0 -0
- data/lib/mikunyan/typetrees/cfcf0bf1fa4aa6ec8af172c71511c4c5.dat +0 -0
- data/lib/mikunyan/typetrees/d09ffdff0a7e59357e132c6ae6fbc684.dat +0 -0
- data/lib/mikunyan/typetrees/d0c0ea0c6027a67ea3393d78532a38fb.dat +0 -0
- data/lib/mikunyan/typetrees/d19c5b14d3d7fe6cdbba6b28f26bc5f4.dat +0 -0
- data/lib/mikunyan/typetrees/d1e5ac65e1fefbcda6d8529c7ccda50b.dat +0 -0
- data/lib/mikunyan/typetrees/d2235066094fe1c59efb053510588202.dat +0 -0
- data/lib/mikunyan/typetrees/d2e60ea70fea8a46f75f8a0b79e37085.dat +0 -0
- data/lib/mikunyan/typetrees/d327ffd20422395c6d4d0c7a2c64a4a4.dat +0 -0
- data/lib/mikunyan/typetrees/d34b5033c863b49dfd4099d9f3e33fe3.dat +0 -0
- data/lib/mikunyan/typetrees/d3e0b0fbe2d0a17d3800a352918ab265.dat +0 -0
- data/lib/mikunyan/typetrees/d463e5d17a1b3f4e2e2f1eb758afc38e.dat +0 -0
- data/lib/mikunyan/typetrees/d49ddfcb81983289b99cecbffd99d8d2.dat +0 -0
- data/lib/mikunyan/typetrees/d4e580aaf357b26f4871f454ab582ad2.dat +0 -0
- data/lib/mikunyan/typetrees/d50ed13362e98df8096b2f735131fce5.dat +0 -0
- data/lib/mikunyan/typetrees/d5b7bfdef1a7f9dcf49d5de2c66fb8fd.dat +0 -0
- data/lib/mikunyan/typetrees/d5d86f79c1252a3e0a705f20245b62b8.dat +0 -0
- data/lib/mikunyan/typetrees/d5e4d09396f117b44668f6c8641951fc.dat +0 -0
- data/lib/mikunyan/typetrees/d618295bd5f15441b5b80b1f57e92d09.dat +0 -0
- data/lib/mikunyan/typetrees/d624d87c75f079cf5797d57ac192e10d.dat +0 -0
- data/lib/mikunyan/typetrees/d666be4e5ffab140996a508b8f06b603.dat +0 -0
- data/lib/mikunyan/typetrees/d677ef142571961a07528e617aae530a.dat +0 -0
- data/lib/mikunyan/typetrees/d67a1e2b0bd2c0b45c1a642fa73fd86e.dat +0 -0
- data/lib/mikunyan/typetrees/d6b5627bef78f5332bb56ae8c96f34ab.dat +0 -0
- data/lib/mikunyan/typetrees/d6d471fc0db035cd0defecbfa79a4e28.dat +0 -0
- data/lib/mikunyan/typetrees/d77f09bf46daff2b01a707c22fcbc7ce.dat +0 -0
- data/lib/mikunyan/typetrees/d7aa5e4b473e8db1304692781a1f3b36.dat +0 -0
- data/lib/mikunyan/typetrees/d7beb51f676a59524f08312b07fa50f7.dat +0 -0
- data/lib/mikunyan/typetrees/d8082d7a3661a3f9ca00a93a61606585.dat +0 -0
- data/lib/mikunyan/typetrees/d8129cfedf80a401fc1b3ce0483b6193.dat +0 -0
- data/lib/mikunyan/typetrees/d819fe24897f62ed37bcd142f64cec80.dat +0 -0
- data/lib/mikunyan/typetrees/d82c324c1e384bdc4d7aabbdbf8dd810.dat +0 -0
- data/lib/mikunyan/typetrees/d871346d990bbc294d02f4c366bf1b6d.dat +0 -0
- data/lib/mikunyan/typetrees/d898fab65c5d063bc9112924123b5a04.dat +0 -0
- data/lib/mikunyan/typetrees/d8e8eeb43589ccd7019398e56f6c16b0.dat +0 -0
- data/lib/mikunyan/typetrees/d8f1b25bf145804bd41da2d64684d605.dat +0 -0
- data/lib/mikunyan/typetrees/d9333d68827fe2bdc8fa96fe1ce7999e.dat +0 -0
- data/lib/mikunyan/typetrees/d9b4fdc987ccf6d8f51cad51e0c670c6.dat +0 -0
- data/lib/mikunyan/typetrees/d9b73d39e28f3c5a204fa213d75eaea7.dat +0 -0
- data/lib/mikunyan/typetrees/da0763bf72eacb89ecd40739beb1ba31.dat +0 -0
- data/lib/mikunyan/typetrees/da3150094bf1eec8e02a26c939a77d05.dat +0 -0
- data/lib/mikunyan/typetrees/da594265aaa32ec1513c20e38a22fa2e.dat +0 -0
- data/lib/mikunyan/typetrees/da773af1b759eb7b7e78287900688f5d.dat +0 -0
- data/lib/mikunyan/typetrees/dad240b3d990c591b278699ec10e2713.dat +0 -0
- data/lib/mikunyan/typetrees/daea1bb1bba6613afb2cb001ca8fa0d4.dat +0 -0
- data/lib/mikunyan/typetrees/dafc7f89ba2f5601cd2526021334cfcd.dat +0 -0
- data/lib/mikunyan/typetrees/db088f9c2f2224da9f488879467856e5.dat +0 -0
- data/lib/mikunyan/typetrees/db262b9303bf96c55e2659bd9160e777.dat +0 -0
- data/lib/mikunyan/typetrees/db26e3ff617afe3cca8a02d00552384e.dat +0 -0
- data/lib/mikunyan/typetrees/dbc0e1ec44a805978e86400d908d4d5a.dat +0 -0
- data/lib/mikunyan/typetrees/dc20bb5dce8aed56990dd70f922fead8.dat +0 -0
- data/lib/mikunyan/typetrees/dc400e4ff2bb2f6cdca60904df0222f2.dat +0 -0
- data/lib/mikunyan/typetrees/dca16d4c10b4556ce0e9c6c86477b440.dat +0 -0
- data/lib/mikunyan/typetrees/dca74f64d0c6c5f509f6c2ce5004d66c.dat +0 -0
- data/lib/mikunyan/typetrees/dcc6d28c8eb43df915f267cc86333b22.dat +0 -0
- data/lib/mikunyan/typetrees/dccb16892b1b29f371d169ba3aadeb12.dat +0 -0
- data/lib/mikunyan/typetrees/dd60b1a6007dbd03008831cfd65e8022.dat +0 -0
- data/lib/mikunyan/typetrees/dd7e75f0d9d8a22fbe5235e6a80fc5ea.dat +0 -0
- data/lib/mikunyan/typetrees/dd8a8dc899d108bd73ea860b3c7b4b15.dat +0 -0
- data/lib/mikunyan/typetrees/ddb7ea81de202d2cefc209032a964347.dat +0 -0
- data/lib/mikunyan/typetrees/de60f732e8b03f6e641f80eccb420cce.dat +0 -0
- data/lib/mikunyan/typetrees/de8a0e72e5ae4d3290885d747ee2f795.dat +0 -0
- data/lib/mikunyan/typetrees/dedb7920e007cccc3ca975508f6311cd.dat +0 -0
- data/lib/mikunyan/typetrees/df01f78f4cb2cbed36b07db19999441e.dat +0 -0
- data/lib/mikunyan/typetrees/df2881fda3119da4394887df7b8e88de.dat +0 -0
- data/lib/mikunyan/typetrees/df50c70d41d6f24fa723847c2c7407f6.dat +0 -0
- data/lib/mikunyan/typetrees/df54f5406f3668f71b1ece65e3d4562f.dat +0 -0
- data/lib/mikunyan/typetrees/dfccf24e87b7a76d31300cfce8a0c8c3.dat +0 -0
- data/lib/mikunyan/typetrees/dff9668a0370d6e3f16d48d636add5bf.dat +0 -0
- data/lib/mikunyan/typetrees/e03bc577acb91ed2706fbeb58f51241a.dat +0 -0
- data/lib/mikunyan/typetrees/e0cc825cdb14661932d6c4bf8eeb597a.dat +0 -0
- data/lib/mikunyan/typetrees/e0da148901d81b94249c67d75de59cc6.dat +0 -0
- data/lib/mikunyan/typetrees/e13585c1bbc23c440db580ed3d0362dd.dat +0 -0
- data/lib/mikunyan/typetrees/e1931794ed428aa347fe3d987a8b5e6d.dat +0 -0
- data/lib/mikunyan/typetrees/e1e986a1b885972b1ff7b6905a2afbea.dat +0 -0
- data/lib/mikunyan/typetrees/e232e87951beb0fc3097191cb5aa968f.dat +0 -0
- data/lib/mikunyan/typetrees/e241f28178d3e724ea66416e5fe2736e.dat +0 -0
- data/lib/mikunyan/typetrees/e28c7475d2cb1a19cc7d210255f13d9a.dat +0 -0
- data/lib/mikunyan/typetrees/e28e40019ee35b908e56695a08f3c2dd.dat +0 -0
- data/lib/mikunyan/typetrees/e2dc296f9670fe78e3841d5fb16526f9.dat +0 -0
- data/lib/mikunyan/typetrees/e35dc2334427143c92b135fe05dc7499.dat +0 -0
- data/lib/mikunyan/typetrees/e4184d1639fc6d9a8101b66019fdb80b.dat +0 -0
- data/lib/mikunyan/typetrees/e42d5322b636717b1e982e6b9c08157e.dat +0 -0
- data/lib/mikunyan/typetrees/e4de96c0565383286459bb71ac3d4b85.dat +0 -0
- data/lib/mikunyan/typetrees/e5c6784d6aabe45f9896a4e094d5d72d.dat +0 -0
- data/lib/mikunyan/typetrees/e5f032f87a6e3b55a01f41073c64f14c.dat +0 -0
- data/lib/mikunyan/typetrees/e5f31cd4b52fedfd9e332593b92efbf2.dat +0 -0
- data/lib/mikunyan/typetrees/e605ecd82fcbccc59af10e5c18e21be0.dat +0 -0
- data/lib/mikunyan/typetrees/e66580394f7a6f4e216dbea294359b03.dat +0 -0
- data/lib/mikunyan/typetrees/e684e7e25dd1208ec3941c7772968ada.dat +0 -0
- data/lib/mikunyan/typetrees/e6b0a13d67395893ae32d073391c98af.dat +0 -0
- data/lib/mikunyan/typetrees/e6ccb0d2545a8b68470d8d4d75d1f393.dat +0 -0
- data/lib/mikunyan/typetrees/e70da99ccfbec08ec2d115a9f0ef2fd5.dat +0 -0
- data/lib/mikunyan/typetrees/e7920ac1d49d79dc3f687686799e0ecb.dat +0 -0
- data/lib/mikunyan/typetrees/e7c5c01b0369574e9346ce846e1e8e63.dat +0 -0
- data/lib/mikunyan/typetrees/e81731c627c30de466ff682b23d7c632.dat +0 -0
- data/lib/mikunyan/typetrees/e82f8100e40450d13763382e74934faa.dat +0 -0
- data/lib/mikunyan/typetrees/e8745221bf0bd118c59f77acbe2de613.dat +0 -0
- data/lib/mikunyan/typetrees/e8dfd8445172115d9ccd6f118c1beaef.dat +0 -0
- data/lib/mikunyan/typetrees/e913b190fb6ca58cd5cbb51754561bd1.dat +0 -0
- data/lib/mikunyan/typetrees/e91d61574d8fb627100d63a6ad9bfcab.dat +0 -0
- data/lib/mikunyan/typetrees/e95f93e7dffba80b23fbc5b44496b51e.dat +0 -0
- data/lib/mikunyan/typetrees/e96e85f943700fbdb57bb61d19aa730d.dat +0 -0
- data/lib/mikunyan/typetrees/e9c3c929e25ebe9de9505392a9426ec4.dat +0 -0
- data/lib/mikunyan/typetrees/e9f83061bf74a880b666d0539803c172.dat +0 -0
- data/lib/mikunyan/typetrees/ea9335449f130234d8486da657354acd.dat +0 -0
- data/lib/mikunyan/typetrees/eaf04b5cbffbbebfe7fe8a866f5ed3e3.dat +0 -0
- data/lib/mikunyan/typetrees/eb2806c128b82c691ff963bc0fa37038.dat +0 -0
- data/lib/mikunyan/typetrees/eb4711bbcbb00a279d29cd0cb734f6f1.dat +0 -0
- data/lib/mikunyan/typetrees/eb4bb38a272b5d85f159bc696932c343.dat +0 -0
- data/lib/mikunyan/typetrees/eb5cf6f66af0538b78f704b634162faa.dat +0 -0
- data/lib/mikunyan/typetrees/eb5e2816cebf56985ba81ee03349f325.dat +0 -0
- data/lib/mikunyan/typetrees/eb86f10c75a157897597106e42951b00.dat +0 -0
- data/lib/mikunyan/typetrees/eba8e3a474fde830eedf44a13f03493b.dat +0 -0
- data/lib/mikunyan/typetrees/ebc5a7a5411c30dea91bd80b1fcb71dd.dat +0 -0
- data/lib/mikunyan/typetrees/ebd4d04d411da3b590de51463d7584f6.dat +0 -0
- data/lib/mikunyan/typetrees/ec25d4a542c858ee7230bd1ff1768977.dat +0 -0
- data/lib/mikunyan/typetrees/ec6c2973d8ad71bc666598added919e2.dat +0 -0
- data/lib/mikunyan/typetrees/eca5aeef2c82a4fdf70258dadca6323a.dat +0 -0
- data/lib/mikunyan/typetrees/ed16c17652451d76127c1d415347ed23.dat +0 -0
- data/lib/mikunyan/typetrees/ed679b72116efeb79d041d5e3dee85ca.dat +0 -0
- data/lib/mikunyan/typetrees/ed76a79b75aebeb69ee5ad327b2c26d5.dat +0 -0
- data/lib/mikunyan/typetrees/ee8f51d166e4c36c87fa7528d9466862.dat +0 -0
- data/lib/mikunyan/typetrees/eebf7a0e1e861754c32f9d1e60da7441.dat +0 -0
- data/lib/mikunyan/typetrees/eef9fa4e8d272cd355b412791b976ddc.dat +0 -0
- data/lib/mikunyan/typetrees/ef03a9a9742d133cf3384f086e38d520.dat +0 -0
- data/lib/mikunyan/typetrees/ef442cab6e5b2a46e824bfc89123f18d.dat +0 -0
- data/lib/mikunyan/typetrees/f096c494641d018027771df703dae7e6.dat +0 -0
- data/lib/mikunyan/typetrees/f0b195f17349096039608cb289e89556.dat +0 -0
- data/lib/mikunyan/typetrees/f0c6a3bed58042425e17e3588613bb51.dat +0 -0
- data/lib/mikunyan/typetrees/f0dca30b01b82a4ab96277658e0d881b.dat +0 -0
- data/lib/mikunyan/typetrees/f0e0e320fc2816897ac3195551d8e4c5.dat +0 -0
- data/lib/mikunyan/typetrees/f0e3106a5e7d38edfe031abc0c11ce2a.dat +0 -0
- data/lib/mikunyan/typetrees/f123b055a61dfa7dc679d78cdaecd383.dat +0 -0
- data/lib/mikunyan/typetrees/f18647acbd67659ea3f45a97872f757b.dat +0 -0
- data/lib/mikunyan/typetrees/f1d3f171c0a6aa755d45ffe681516b65.dat +0 -0
- data/lib/mikunyan/typetrees/f2357d4424504d3797409ff6565e8e68.dat +0 -0
- data/lib/mikunyan/typetrees/f262f66cbdb4e8ec53bc0c21902fff33.dat +0 -0
- data/lib/mikunyan/typetrees/f26318c9a762d9dfe2990bc5c55b5210.dat +0 -0
- data/lib/mikunyan/typetrees/f284abb6f2df17ebedae2b6b50436810.dat +0 -0
- data/lib/mikunyan/typetrees/f2962bad2e61ec5e86287cfa284af6b4.dat +0 -0
- data/lib/mikunyan/typetrees/f2f0f99209263f27fcf761c6c20c5f2a.dat +0 -0
- data/lib/mikunyan/typetrees/f334a53f9a22db7ab446d9e59e60e53f.dat +0 -0
- data/lib/mikunyan/typetrees/f3998c4215bd94309ae5a56c52838094.dat +0 -0
- data/lib/mikunyan/typetrees/f42ed84d2873663c47f7c18efd8435c2.dat +0 -0
- data/lib/mikunyan/typetrees/f46f884b442e214dc17a8df302020320.dat +0 -0
- data/lib/mikunyan/typetrees/f532b7426ff24ff9247beee7720e3f42.dat +0 -0
- data/lib/mikunyan/typetrees/f54f7f1d24fb230b26b5fcfdf259cbe5.dat +0 -0
- data/lib/mikunyan/typetrees/f560c0e71bafc0222f509e6af590fed6.dat +0 -0
- data/lib/mikunyan/typetrees/f5b27e405af2e548e271d0f29a4fc21c.dat +0 -0
- data/lib/mikunyan/typetrees/f5b5fea04cce293cc62cf0f76ec5de49.dat +0 -0
- data/lib/mikunyan/typetrees/f5b73814acb8f989f4895cdcf9e3adfe.dat +0 -0
- data/lib/mikunyan/typetrees/f615a0c0f5849665cedca12a8fd64020.dat +0 -0
- data/lib/mikunyan/typetrees/f628e2d5cd5f7460380920e45b6a9266.dat +0 -0
- data/lib/mikunyan/typetrees/f6718cde49aeab7f67aefb7da858bbab.dat +0 -0
- data/lib/mikunyan/typetrees/f6ac78e7f50065f7c64f720fdeaa9390.dat +0 -0
- data/lib/mikunyan/typetrees/f6cd0e46d404dd7cbd7ad89ae2a4d7a9.dat +0 -0
- data/lib/mikunyan/typetrees/f7ea57efda613d6963a53144446638cf.dat +0 -0
- data/lib/mikunyan/typetrees/f7f1afe8ae04ddc34d023a09ed279e8d.dat +0 -0
- data/lib/mikunyan/typetrees/f811a923135bc4ee86dd31237b2ab06a.dat +0 -0
- data/lib/mikunyan/typetrees/f8377d7fe2ca5564e137d9f82a5b7fe5.dat +0 -0
- data/lib/mikunyan/typetrees/f83f9a801dfbac3b28bcee57ff29182f.dat +0 -0
- data/lib/mikunyan/typetrees/f92d618c5266ea3a8ca770b6eca728c8.dat +0 -0
- data/lib/mikunyan/typetrees/f983b0102ccb04ded5fd745943e862be.dat +0 -0
- data/lib/mikunyan/typetrees/f9a5bbb8c5391b4f94fc32542ab1f981.dat +0 -0
- data/lib/mikunyan/typetrees/faa71a41455d0e928529ff5b0b036af3.dat +0 -0
- data/lib/mikunyan/typetrees/fab5d0fd4c471ada3931c6ec7cf983ec.dat +0 -0
- data/lib/mikunyan/typetrees/fab9ae76e42df0fda7b88a0b103ac202.dat +0 -0
- data/lib/mikunyan/typetrees/face58ace35dbc4d23883cc9f9625a4f.dat +0 -0
- data/lib/mikunyan/typetrees/fad2d0a58e9174708176102b418facf1.dat +0 -0
- data/lib/mikunyan/typetrees/faf23bf08eb2a9759598748b2ed55c7a.dat +0 -0
- data/lib/mikunyan/typetrees/fb0635f60817266fc2448281f0e1bf8e.dat +0 -0
- data/lib/mikunyan/typetrees/fb734904d47701a0f2042181d6018c2f.dat +0 -0
- data/lib/mikunyan/typetrees/fbc6f8d82d3c39fe76174186e3b47e3b.dat +0 -0
- data/lib/mikunyan/typetrees/fbf6b031c32e461ee61be429e5fee7eb.dat +0 -0
- data/lib/mikunyan/typetrees/fc3125dbdb8e1f0607d135c1ae3414cb.dat +0 -0
- data/lib/mikunyan/typetrees/fc4d5e15f8c386c584aba84f72df32a6.dat +0 -0
- data/lib/mikunyan/typetrees/fccd9eb5f018e78d8dca6e9a2b63d656.dat +0 -0
- data/lib/mikunyan/typetrees/fcd09d1b65ada0699f1ee9ef752d98bb.dat +0 -0
- data/lib/mikunyan/typetrees/fce816c697c05580074a53812ffb4d26.dat +0 -0
- data/lib/mikunyan/typetrees/fcf3c3ff8300095cad677c7d6fcad3c1.dat +0 -0
- data/lib/mikunyan/typetrees/fd27a2cde103557bda73e902a622cd9d.dat +0 -0
- data/lib/mikunyan/typetrees/fd6f5cd3c75d7a3b4be7ca15f4d7ae9e.dat +0 -0
- data/lib/mikunyan/typetrees/fd961e9e4f3f3e5a32d3a30299105968.dat +0 -0
- data/lib/mikunyan/typetrees/fdd42e830fb415af977c2b2222b5d948.dat +0 -0
- data/lib/mikunyan/typetrees/fe0412c56eaa9e664d20b9ae98864e48.dat +0 -0
- data/lib/mikunyan/typetrees/fe3443710f1e93ed0fdb39a499dcad2e.dat +0 -0
- data/lib/mikunyan/typetrees/fe69769eea751f4dae4470a2d2a4f033.dat +0 -0
- data/lib/mikunyan/typetrees/fe94ca842ca0f4d66581e7d021fc5445.dat +0 -0
- data/lib/mikunyan/typetrees/feb462635cb14d7fc886781f76647359.dat +0 -0
- data/lib/mikunyan/typetrees/febce05d662e846d44276cb3ead554a9.dat +0 -0
- data/lib/mikunyan/typetrees/fefc3f27b196eb018086c22cba376f75.dat +0 -0
- data/lib/mikunyan/typetrees/ff001a2e51937aa5add9eaf9cd3d8ae4.dat +0 -0
- data/lib/mikunyan/typetrees/ff382d6c2780a3e68481688cce904104.dat +0 -0
- data/lib/mikunyan/typetrees/ff3a8cf3da343f8722464c416e3479ee.dat +0 -0
- data/lib/mikunyan/typetrees/ff8fa01e9243c910f7d7301b7586a1b1.dat +0 -0
- data/lib/mikunyan/typetrees/ffdc51773b4c4ce79ff982449bbbabff.dat +0 -0
- 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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
16
|
+
Base64.strict_encode64(obj)
|
|
18
17
|
end
|
|
18
|
+
else
|
|
19
|
+
obj
|
|
20
|
+
end
|
|
19
21
|
end
|
|
20
22
|
|
|
21
|
-
opts = {:
|
|
23
|
+
opts = { as_asset: false, pretty: false, yaml: false }
|
|
22
24
|
arg = nil
|
|
23
25
|
i = 0
|
|
24
26
|
while i < ARGV.count
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
36
|
+
warn("Unknown option: #{ARGV[i]}")
|
|
38
37
|
end
|
|
39
|
-
|
|
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
|
-
|
|
48
|
-
|
|
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
|
-
|
|
75
|
-
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
+
//------------------------------------------------------------------------------
|