From ad627b132f31a39a15d0a5063bb86ef22d6fd7fc Mon Sep 17 00:00:00 2001 From: 1Hyena Date: Fri, 9 Sep 2016 16:06:08 +0300 Subject: [PATCH] Initial commit. --- LICENSE | 2 +- Makefile | 39 + README.md | 17 + atomorph.cpp | 1161 +++++ atomorph.h | 389 ++ color.cpp | 181 + color.h | 33 + demo/Makefile | 45 + demo/README | 12 + demo/allegro5/AtoMorph-GUI.cbp | 48 + demo/allegro5/Makefile | 44 + demo/allegro5/README | 15 + demo/allegro5/data/fixed_font.tga | Bin 0 -> 25839 bytes demo/allegro5/main.cpp | 561 +++ demo/allegro5/main.h | 50 + demo/allegro5/obj/.gitignore | 4 + demo/lodepng.cpp | 6260 ++++++++++++++++++++++++ demo/lodepng.h | 1716 +++++++ demo/main.cpp | 299 ++ demo/main.h | 38 + demo/obj/.gitignore | 4 + demo/options.h | 226 + demo/tests/README | 9 + demo/tests/data/RGB_1.png | Bin 0 -> 628 bytes demo/tests/data/RGB_2.png | Bin 0 -> 402 bytes demo/tests/data/RGB_3.png | Bin 0 -> 385 bytes demo/tests/data/RGB_4.png | Bin 0 -> 417 bytes demo/tests/data/armors/a-0.png | Bin 0 -> 1500 bytes demo/tests/data/armors/a-1.png | Bin 0 -> 1658 bytes demo/tests/data/armors/a-10.png | Bin 0 -> 2096 bytes demo/tests/data/armors/a-11.png | Bin 0 -> 1527 bytes demo/tests/data/armors/a-12.png | Bin 0 -> 1925 bytes demo/tests/data/armors/a-13.png | Bin 0 -> 1709 bytes demo/tests/data/armors/a-14.png | Bin 0 -> 2082 bytes demo/tests/data/armors/a-15.png | Bin 0 -> 1694 bytes demo/tests/data/armors/a-16.png | Bin 0 -> 1118 bytes demo/tests/data/armors/a-17.png | Bin 0 -> 1830 bytes demo/tests/data/armors/a-18.png | Bin 0 -> 2248 bytes demo/tests/data/armors/a-19.png | Bin 0 -> 2314 bytes demo/tests/data/armors/a-2.png | Bin 0 -> 1930 bytes demo/tests/data/armors/a-3.png | Bin 0 -> 1575 bytes demo/tests/data/armors/a-4.png | Bin 0 -> 1631 bytes demo/tests/data/armors/a-5.png | Bin 0 -> 1627 bytes demo/tests/data/armors/a-6.png | Bin 0 -> 1430 bytes demo/tests/data/armors/a-7.png | Bin 0 -> 1279 bytes demo/tests/data/armors/a-8.png | Bin 0 -> 3144 bytes demo/tests/data/armors/a-9.png | Bin 0 -> 2064 bytes demo/tests/data/battlelord/body_1.png | Bin 0 -> 11142 bytes demo/tests/data/battlelord/body_2.png | Bin 0 -> 11719 bytes demo/tests/data/battlelord/body_3.png | Bin 0 -> 11035 bytes demo/tests/data/battlelord/body_4.png | Bin 0 -> 11592 bytes demo/tests/data/battlelord/body_5.png | Bin 0 -> 13518 bytes demo/tests/data/battlelord/body_6.png | Bin 0 -> 10357 bytes demo/tests/data/battlelord/head_1.png | Bin 0 -> 4480 bytes demo/tests/data/battlelord/head_2.png | Bin 0 -> 4273 bytes demo/tests/data/battlelord/head_3.png | Bin 0 -> 5291 bytes demo/tests/data/battlelord/head_4.png | Bin 0 -> 4732 bytes demo/tests/data/battlelord/head_5.png | Bin 0 -> 5518 bytes demo/tests/data/battlelord/head_6.png | Bin 0 -> 3205 bytes demo/tests/data/battlelord/lfoot_1.png | Bin 0 -> 942 bytes demo/tests/data/battlelord/lfoot_2.png | Bin 0 -> 925 bytes demo/tests/data/battlelord/lfoot_3.png | Bin 0 -> 932 bytes demo/tests/data/battlelord/lfoot_4.png | Bin 0 -> 999 bytes demo/tests/data/battlelord/lfoot_5.png | Bin 0 -> 1058 bytes demo/tests/data/battlelord/lfoot_6.png | Bin 0 -> 1052 bytes demo/tests/data/battlelord/lleg_1.png | Bin 0 -> 1473 bytes demo/tests/data/battlelord/lleg_2.png | Bin 0 -> 1614 bytes demo/tests/data/battlelord/lleg_3.png | Bin 0 -> 1552 bytes demo/tests/data/battlelord/lleg_4.png | Bin 0 -> 1242 bytes demo/tests/data/battlelord/lleg_5.png | Bin 0 -> 1542 bytes demo/tests/data/battlelord/lleg_6.png | Bin 0 -> 1926 bytes demo/tests/data/battlelord/rarm_1.png | Bin 0 -> 3258 bytes demo/tests/data/battlelord/rarm_2.png | Bin 0 -> 3107 bytes demo/tests/data/battlelord/rarm_3.png | Bin 0 -> 3127 bytes demo/tests/data/battlelord/rarm_4.png | Bin 0 -> 3171 bytes demo/tests/data/battlelord/rarm_5.png | Bin 0 -> 3748 bytes demo/tests/data/battlelord/rarm_6.png | Bin 0 -> 4425 bytes demo/tests/data/battlelord/rfoot_1.png | Bin 0 -> 2680 bytes demo/tests/data/battlelord/rfoot_2.png | Bin 0 -> 2364 bytes demo/tests/data/battlelord/rfoot_3.png | Bin 0 -> 2290 bytes demo/tests/data/battlelord/rfoot_4.png | Bin 0 -> 2637 bytes demo/tests/data/battlelord/rfoot_5.png | Bin 0 -> 3117 bytes demo/tests/data/battlelord/rfoot_6.png | Bin 0 -> 2908 bytes demo/tests/data/battlelord/rhand_1.png | Bin 0 -> 4300 bytes demo/tests/data/battlelord/rhand_2.png | Bin 0 -> 3634 bytes demo/tests/data/battlelord/rhand_3.png | Bin 0 -> 3389 bytes demo/tests/data/battlelord/rhand_4.png | Bin 0 -> 4049 bytes demo/tests/data/battlelord/rhand_5.png | Bin 0 -> 4451 bytes demo/tests/data/battlelord/rhand_6.png | Bin 0 -> 4508 bytes demo/tests/data/battlelord/rleg_1.png | Bin 0 -> 2903 bytes demo/tests/data/battlelord/rleg_2.png | Bin 0 -> 2446 bytes demo/tests/data/battlelord/rleg_3.png | Bin 0 -> 2347 bytes demo/tests/data/battlelord/rleg_4.png | Bin 0 -> 2777 bytes demo/tests/data/battlelord/rleg_5.png | Bin 0 -> 3254 bytes demo/tests/data/battlelord/rleg_6.png | Bin 0 -> 3084 bytes demo/tests/data/battlelord_1.png | Bin 0 -> 14841 bytes demo/tests/data/battlelord_2.png | Bin 0 -> 15072 bytes demo/tests/data/battlelord_3.png | Bin 0 -> 14090 bytes demo/tests/data/battlelord_4.png | Bin 0 -> 14720 bytes demo/tests/data/battlelord_5.png | Bin 0 -> 18387 bytes demo/tests/data/battlelord_6.png | Bin 0 -> 14525 bytes demo/tests/data/cat_1.png | Bin 0 -> 721 bytes demo/tests/data/cat_2.png | Bin 0 -> 730 bytes demo/tests/data/cat_3.png | Bin 0 -> 710 bytes demo/tests/data/cat_4.png | Bin 0 -> 725 bytes demo/tests/data/cat_5.png | Bin 0 -> 713 bytes demo/tests/data/cat_6.png | Bin 0 -> 704 bytes demo/tests/data/cd_1.png | Bin 0 -> 5612 bytes demo/tests/data/cd_2.png | Bin 0 -> 5580 bytes demo/tests/data/cd_3.png | Bin 0 -> 5478 bytes demo/tests/data/cd_4.png | Bin 0 -> 5636 bytes demo/tests/data/dots_1.png | Bin 0 -> 443 bytes demo/tests/data/dots_2.png | Bin 0 -> 452 bytes demo/tests/data/dots_3.png | Bin 0 -> 476 bytes demo/tests/data/dots_4.png | Bin 0 -> 462 bytes demo/tests/data/empty.png | Bin 0 -> 136 bytes demo/tests/data/flowers.png | Bin 0 -> 131985 bytes demo/tests/data/food/berry_1.png | Bin 0 -> 19740 bytes demo/tests/data/food/berry_2.png | Bin 0 -> 27560 bytes demo/tests/data/food/berry_3.png | Bin 0 -> 14579 bytes demo/tests/data/food/berry_4.png | Bin 0 -> 24347 bytes demo/tests/data/food/berry_5.png | Bin 0 -> 31380 bytes demo/tests/data/food/berry_6.png | Bin 0 -> 18775 bytes demo/tests/data/food/fruit_1.png | Bin 0 -> 19768 bytes demo/tests/data/food/fruit_2.png | Bin 0 -> 11472 bytes demo/tests/data/food/fruit_3.png | Bin 0 -> 14289 bytes demo/tests/data/food/lettuce_1.png | Bin 0 -> 19714 bytes demo/tests/data/food/lettuce_2.png | Bin 0 -> 14373 bytes demo/tests/data/food/lettuce_3.png | Bin 0 -> 17380 bytes demo/tests/data/food/lettuce_4.png | Bin 0 -> 17206 bytes demo/tests/data/food/lettuce_5.png | Bin 0 -> 9329 bytes demo/tests/data/food/lettuce_6.png | Bin 0 -> 16612 bytes demo/tests/data/food/spice_1.png | Bin 0 -> 18474 bytes demo/tests/data/food/spice_2.png | Bin 0 -> 14553 bytes demo/tests/data/food/spice_3.png | Bin 0 -> 12076 bytes demo/tests/data/food/spice_4.png | Bin 0 -> 17324 bytes demo/tests/data/food/spice_5.png | Bin 0 -> 7321 bytes demo/tests/data/food/spice_6.png | Bin 0 -> 10407 bytes demo/tests/data/mage_1.png | Bin 0 -> 1064 bytes demo/tests/data/mage_2.png | Bin 0 -> 1126 bytes demo/tests/data/mage_3.png | Bin 0 -> 1108 bytes demo/tests/data/mage_4.png | Bin 0 -> 1044 bytes demo/tests/data/mage_5.png | Bin 0 -> 1021 bytes demo/tests/data/merilin.png | Bin 0 -> 97777 bytes demo/tests/data/monsters/baron.png | Bin 0 -> 2128 bytes demo/tests/data/monsters/cd.png | Bin 0 -> 2992 bytes demo/tests/data/monsters/cg.png | Bin 0 -> 1447 bytes demo/tests/data/monsters/d.png | Bin 0 -> 1714 bytes demo/tests/data/monsters/hero.png | Bin 0 -> 1314 bytes demo/tests/data/monsters/hk.png | Bin 0 -> 1976 bytes demo/tests/data/monsters/imp.png | Bin 0 -> 1078 bytes demo/tests/data/monsters/mc.png | Bin 0 -> 4097 bytes demo/tests/data/monsters/pain.png | Bin 0 -> 2787 bytes demo/tests/data/monsters/revenant.png | Bin 0 -> 1981 bytes demo/tests/data/monsters/sg.png | Bin 0 -> 1299 bytes demo/tests/data/monsters/spider.png | Bin 0 -> 2457 bytes demo/tests/data/monsters/vile.png | Bin 0 -> 1948 bytes demo/tests/data/monsters/zm.png | Bin 0 -> 1473 bytes demo/tests/data/otu_1.png | Bin 0 -> 21212 bytes demo/tests/data/otu_2.png | Bin 0 -> 12026 bytes demo/tests/data/otu_3.png | Bin 0 -> 15475 bytes demo/tests/data/regenmorph_clouds.png | Bin 0 -> 82235 bytes demo/tests/data/regenmorph_face.png | Bin 0 -> 115614 bytes demo/tests/data/shape_1.png | Bin 0 -> 1077 bytes demo/tests/data/shape_2.png | Bin 0 -> 1157 bytes demo/tests/data/shape_3.png | Bin 0 -> 1064 bytes demo/tests/data/shape_4.png | Bin 0 -> 1104 bytes demo/tests/data/shape_5.png | Bin 0 -> 1089 bytes demo/tests/data/shape_6.png | Bin 0 -> 373 bytes demo/tests/data/squares_1.png | Bin 0 -> 272 bytes demo/tests/data/squares_2.png | Bin 0 -> 295 bytes demo/tests/data/squares_3.png | Bin 0 -> 268 bytes demo/tests/data/squares_4.png | Bin 0 -> 216 bytes demo/tests/data/transformer_1.png | Bin 0 -> 52154 bytes demo/tests/data/transformer_2.png | Bin 0 -> 59487 bytes demo/tests/data/volatile_1.png | Bin 0 -> 238 bytes demo/tests/data/volatile_2.png | Bin 0 -> 204 bytes demo/tests/data/volatile_3.png | Bin 0 -> 204 bytes demo/tests/data/volatile_4.png | Bin 0 -> 254 bytes demo/tests/output/.gitignore | 4 + demo/tests/test_armors.sh | 14 + demo/tests/test_battlelord.sh | 14 + demo/tests/test_cat.sh | 14 + demo/tests/test_combine.sh | 59 + demo/tests/test_fluid.sh | 34 + demo/tests/test_food.sh | 40 + demo/tests/test_monsters.sh | 16 + demo/tests/test_perlin.sh | 14 + demo/tests/test_quick.sh | 47 + demo/tests/test_regenmorph.sh | 34 + demo/tests/test_rotation.sh | 18 + demo/tests/test_spline.sh | 26 + demo/tests/test_transformer.sh | 14 + demo/tests/test_unrelated.sh | 34 + demo/tests/tests.sh | 18 + fluidmodel.cpp | 602 +++ fluidmodel.h | 169 + morph.cpp | 1573 ++++++ morph.h | 147 + obj/.gitignore | 4 + perlin.cpp | 90 + perlin.h | 48 + spline.cpp | 68 + spline.h | 45 + thread.cpp | 1236 +++++ thread.h | 134 + vec3d.h | 88 + 207 files changed, 15756 insertions(+), 1 deletion(-) create mode 100644 Makefile create mode 100644 atomorph.cpp create mode 100644 atomorph.h create mode 100644 color.cpp create mode 100644 color.h create mode 100644 demo/Makefile create mode 100644 demo/README create mode 100644 demo/allegro5/AtoMorph-GUI.cbp create mode 100644 demo/allegro5/Makefile create mode 100644 demo/allegro5/README create mode 100755 demo/allegro5/data/fixed_font.tga create mode 100644 demo/allegro5/main.cpp create mode 100644 demo/allegro5/main.h create mode 100644 demo/allegro5/obj/.gitignore create mode 100644 demo/lodepng.cpp create mode 100644 demo/lodepng.h create mode 100644 demo/main.cpp create mode 100644 demo/main.h create mode 100644 demo/obj/.gitignore create mode 100644 demo/options.h create mode 100644 demo/tests/README create mode 100644 demo/tests/data/RGB_1.png create mode 100644 demo/tests/data/RGB_2.png create mode 100644 demo/tests/data/RGB_3.png create mode 100644 demo/tests/data/RGB_4.png create mode 100644 demo/tests/data/armors/a-0.png create mode 100644 demo/tests/data/armors/a-1.png create mode 100644 demo/tests/data/armors/a-10.png create mode 100644 demo/tests/data/armors/a-11.png create mode 100644 demo/tests/data/armors/a-12.png create mode 100644 demo/tests/data/armors/a-13.png create mode 100644 demo/tests/data/armors/a-14.png create mode 100644 demo/tests/data/armors/a-15.png create mode 100644 demo/tests/data/armors/a-16.png create mode 100644 demo/tests/data/armors/a-17.png create mode 100644 demo/tests/data/armors/a-18.png create mode 100644 demo/tests/data/armors/a-19.png create mode 100644 demo/tests/data/armors/a-2.png create mode 100644 demo/tests/data/armors/a-3.png create mode 100644 demo/tests/data/armors/a-4.png create mode 100644 demo/tests/data/armors/a-5.png create mode 100644 demo/tests/data/armors/a-6.png create mode 100644 demo/tests/data/armors/a-7.png create mode 100644 demo/tests/data/armors/a-8.png create mode 100644 demo/tests/data/armors/a-9.png create mode 100644 demo/tests/data/battlelord/body_1.png create mode 100644 demo/tests/data/battlelord/body_2.png create mode 100644 demo/tests/data/battlelord/body_3.png create mode 100644 demo/tests/data/battlelord/body_4.png create mode 100644 demo/tests/data/battlelord/body_5.png create mode 100644 demo/tests/data/battlelord/body_6.png create mode 100644 demo/tests/data/battlelord/head_1.png create mode 100644 demo/tests/data/battlelord/head_2.png create mode 100644 demo/tests/data/battlelord/head_3.png create mode 100644 demo/tests/data/battlelord/head_4.png create mode 100644 demo/tests/data/battlelord/head_5.png create mode 100644 demo/tests/data/battlelord/head_6.png create mode 100644 demo/tests/data/battlelord/lfoot_1.png create mode 100644 demo/tests/data/battlelord/lfoot_2.png create mode 100644 demo/tests/data/battlelord/lfoot_3.png create mode 100644 demo/tests/data/battlelord/lfoot_4.png create mode 100644 demo/tests/data/battlelord/lfoot_5.png create mode 100644 demo/tests/data/battlelord/lfoot_6.png create mode 100644 demo/tests/data/battlelord/lleg_1.png create mode 100644 demo/tests/data/battlelord/lleg_2.png create mode 100644 demo/tests/data/battlelord/lleg_3.png create mode 100644 demo/tests/data/battlelord/lleg_4.png create mode 100644 demo/tests/data/battlelord/lleg_5.png create mode 100644 demo/tests/data/battlelord/lleg_6.png create mode 100644 demo/tests/data/battlelord/rarm_1.png create mode 100644 demo/tests/data/battlelord/rarm_2.png create mode 100644 demo/tests/data/battlelord/rarm_3.png create mode 100644 demo/tests/data/battlelord/rarm_4.png create mode 100644 demo/tests/data/battlelord/rarm_5.png create mode 100644 demo/tests/data/battlelord/rarm_6.png create mode 100644 demo/tests/data/battlelord/rfoot_1.png create mode 100644 demo/tests/data/battlelord/rfoot_2.png create mode 100644 demo/tests/data/battlelord/rfoot_3.png create mode 100644 demo/tests/data/battlelord/rfoot_4.png create mode 100644 demo/tests/data/battlelord/rfoot_5.png create mode 100644 demo/tests/data/battlelord/rfoot_6.png create mode 100644 demo/tests/data/battlelord/rhand_1.png create mode 100644 demo/tests/data/battlelord/rhand_2.png create mode 100644 demo/tests/data/battlelord/rhand_3.png create mode 100644 demo/tests/data/battlelord/rhand_4.png create mode 100644 demo/tests/data/battlelord/rhand_5.png create mode 100644 demo/tests/data/battlelord/rhand_6.png create mode 100644 demo/tests/data/battlelord/rleg_1.png create mode 100644 demo/tests/data/battlelord/rleg_2.png create mode 100644 demo/tests/data/battlelord/rleg_3.png create mode 100644 demo/tests/data/battlelord/rleg_4.png create mode 100644 demo/tests/data/battlelord/rleg_5.png create mode 100644 demo/tests/data/battlelord/rleg_6.png create mode 100644 demo/tests/data/battlelord_1.png create mode 100644 demo/tests/data/battlelord_2.png create mode 100644 demo/tests/data/battlelord_3.png create mode 100644 demo/tests/data/battlelord_4.png create mode 100644 demo/tests/data/battlelord_5.png create mode 100644 demo/tests/data/battlelord_6.png create mode 100644 demo/tests/data/cat_1.png create mode 100644 demo/tests/data/cat_2.png create mode 100644 demo/tests/data/cat_3.png create mode 100644 demo/tests/data/cat_4.png create mode 100644 demo/tests/data/cat_5.png create mode 100644 demo/tests/data/cat_6.png create mode 100644 demo/tests/data/cd_1.png create mode 100644 demo/tests/data/cd_2.png create mode 100644 demo/tests/data/cd_3.png create mode 100644 demo/tests/data/cd_4.png create mode 100644 demo/tests/data/dots_1.png create mode 100644 demo/tests/data/dots_2.png create mode 100644 demo/tests/data/dots_3.png create mode 100644 demo/tests/data/dots_4.png create mode 100644 demo/tests/data/empty.png create mode 100644 demo/tests/data/flowers.png create mode 100644 demo/tests/data/food/berry_1.png create mode 100644 demo/tests/data/food/berry_2.png create mode 100644 demo/tests/data/food/berry_3.png create mode 100644 demo/tests/data/food/berry_4.png create mode 100644 demo/tests/data/food/berry_5.png create mode 100644 demo/tests/data/food/berry_6.png create mode 100644 demo/tests/data/food/fruit_1.png create mode 100644 demo/tests/data/food/fruit_2.png create mode 100644 demo/tests/data/food/fruit_3.png create mode 100644 demo/tests/data/food/lettuce_1.png create mode 100644 demo/tests/data/food/lettuce_2.png create mode 100644 demo/tests/data/food/lettuce_3.png create mode 100644 demo/tests/data/food/lettuce_4.png create mode 100644 demo/tests/data/food/lettuce_5.png create mode 100644 demo/tests/data/food/lettuce_6.png create mode 100644 demo/tests/data/food/spice_1.png create mode 100644 demo/tests/data/food/spice_2.png create mode 100644 demo/tests/data/food/spice_3.png create mode 100644 demo/tests/data/food/spice_4.png create mode 100644 demo/tests/data/food/spice_5.png create mode 100644 demo/tests/data/food/spice_6.png create mode 100644 demo/tests/data/mage_1.png create mode 100644 demo/tests/data/mage_2.png create mode 100644 demo/tests/data/mage_3.png create mode 100644 demo/tests/data/mage_4.png create mode 100644 demo/tests/data/mage_5.png create mode 100644 demo/tests/data/merilin.png create mode 100644 demo/tests/data/monsters/baron.png create mode 100644 demo/tests/data/monsters/cd.png create mode 100644 demo/tests/data/monsters/cg.png create mode 100644 demo/tests/data/monsters/d.png create mode 100644 demo/tests/data/monsters/hero.png create mode 100644 demo/tests/data/monsters/hk.png create mode 100644 demo/tests/data/monsters/imp.png create mode 100644 demo/tests/data/monsters/mc.png create mode 100644 demo/tests/data/monsters/pain.png create mode 100644 demo/tests/data/monsters/revenant.png create mode 100644 demo/tests/data/monsters/sg.png create mode 100644 demo/tests/data/monsters/spider.png create mode 100644 demo/tests/data/monsters/vile.png create mode 100644 demo/tests/data/monsters/zm.png create mode 100644 demo/tests/data/otu_1.png create mode 100644 demo/tests/data/otu_2.png create mode 100644 demo/tests/data/otu_3.png create mode 100644 demo/tests/data/regenmorph_clouds.png create mode 100644 demo/tests/data/regenmorph_face.png create mode 100644 demo/tests/data/shape_1.png create mode 100644 demo/tests/data/shape_2.png create mode 100644 demo/tests/data/shape_3.png create mode 100644 demo/tests/data/shape_4.png create mode 100644 demo/tests/data/shape_5.png create mode 100644 demo/tests/data/shape_6.png create mode 100644 demo/tests/data/squares_1.png create mode 100644 demo/tests/data/squares_2.png create mode 100644 demo/tests/data/squares_3.png create mode 100644 demo/tests/data/squares_4.png create mode 100644 demo/tests/data/transformer_1.png create mode 100644 demo/tests/data/transformer_2.png create mode 100644 demo/tests/data/volatile_1.png create mode 100644 demo/tests/data/volatile_2.png create mode 100644 demo/tests/data/volatile_3.png create mode 100644 demo/tests/data/volatile_4.png create mode 100644 demo/tests/output/.gitignore create mode 100755 demo/tests/test_armors.sh create mode 100755 demo/tests/test_battlelord.sh create mode 100755 demo/tests/test_cat.sh create mode 100755 demo/tests/test_combine.sh create mode 100755 demo/tests/test_fluid.sh create mode 100755 demo/tests/test_food.sh create mode 100755 demo/tests/test_monsters.sh create mode 100755 demo/tests/test_perlin.sh create mode 100755 demo/tests/test_quick.sh create mode 100755 demo/tests/test_regenmorph.sh create mode 100755 demo/tests/test_rotation.sh create mode 100755 demo/tests/test_spline.sh create mode 100755 demo/tests/test_transformer.sh create mode 100755 demo/tests/test_unrelated.sh create mode 100755 demo/tests/tests.sh create mode 100644 fluidmodel.cpp create mode 100644 fluidmodel.h create mode 100644 morph.cpp create mode 100644 morph.h create mode 100644 obj/.gitignore create mode 100644 perlin.cpp create mode 100644 perlin.h create mode 100644 spline.cpp create mode 100644 spline.h create mode 100644 thread.cpp create mode 100644 thread.h create mode 100644 vec3d.h diff --git a/LICENSE b/LICENSE index 5f60e46..8815623 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2016 Hyena +Copyright (c) 2016 Erich Erstu Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..027b735 --- /dev/null +++ b/Makefile @@ -0,0 +1,39 @@ +NAME = atomorph +CC = gcc +PROF = -O2 +C_FLAGS = -std=c++11 -Wall -pedantic $(PROF) +OBJ_DIR = obj + +SRC_FILES := $(wildcard *.cpp) +O_FILES := $(patsubst %.cpp,$(OBJ_DIR)/%.o,$(SRC_FILES)) + +OUT = ./lib$(NAME).a + +all: + @printf "\033[0mHINT: On errors, try \033[1;33m-std=gnu++11 -stdlib=libc++\033[0m compiler flags.\033[0m\n" + @printf "\033[0mHINT: Use \033[1;33mmake opencv\033[0m for OpenCV optimizations (experimental).\033[0m\n" + @printf "\033[0mHINT: Use \033[1;33mmake deprecated\033[0m to compile the old version.\033[0m\n" + @$(MAKE) $(OUT) -s + +opencv: DEFINES = -D ATOMORPH_OPENCV +opencv: $(O_FILES) + @ar rcs $(OUT) $(O_FILES) + @printf "\033[1;32mOpenCV dependent lib$(NAME).a DONE!\033[0m\n" + +deprecated: DEFINES = -D ATOMORPH_DEPRECATED +deprecated: $(O_FILES) + @ar rcs $(OUT) $(O_FILES) + @printf "\033[1;32mDeprecated lib$(NAME).a DONE!\033[0m\n" + +$(OUT): $(O_FILES) + @ar rcs $(OUT) $(O_FILES) + @printf "\033[1;32mlib$(NAME).a DONE!\033[0m\n" + +$(OBJ_DIR)/%.o: %.cpp + @printf "\033[1m\033[31mCompiling \033[37m....\033[34m %-20s\t\033[33m%6s\033[31m lines\033[0m \n" $*.cpp "`wc -l $*.cpp | cut -f1 -d' '`" + @$(CC) $(INCLUDE) $< $(DEFINES) $(C_FLAGS) -c -o $@ + +clean: + @printf "\033[1;36mCleaning \033[37m ...." + @rm -f $(O_FILES) $(OUT) *~ *.bak *.orig *.rej + @printf "\033[1;37m lib$(NAME).a cleaned!\033[0m\n" diff --git a/README.md b/README.md index 5e26e90..2e0b7b6 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,19 @@ # atomorph Image morphing library that uses fluid dynamics and optimal transport to produce intuitive morphs. + +http://atomorph.org + +AtoMorph Library uses the C++11 standard. The included Makefiles +have been tested on Linux operating systems. iOS users may encounter +some problems due to poor support of the C++11 standard on their +system. One should try modifying the Makefile by adding -std=gnu++11 +and -stdlib=libc++ compiler flags. + +Build instructions: + Run make in this folder. + +Example usage: + See README in demo folder. + +If you like this software, please consider making a donation +by sending Bitcoins to 1Erich1YUdkUAp9ynf4Rfw2ug8nBtuUmMu. diff --git a/atomorph.cpp b/atomorph.cpp new file mode 100644 index 0000000..4261fcb --- /dev/null +++ b/atomorph.cpp @@ -0,0 +1,1161 @@ +/* + * See Copyright Notice in atomorph.h + */ + +#include "atomorph.h" + +#ifdef ATOMORPH_DEPRECATED +const char * am_get_version() { + return "0.51"; +} + +size_t am_get_warning() { + size_t flags = 0; + if (sizeof(void *) < 8) flags = flags|AM_WARN_POINTER_SIZE; + if (sizeof(AM_ATOM)> 8) flags = flags|AM_WARN_ATOM_SIZE; + return flags; +} + +AM_SCENE::AM_SCENE() { + atoms = 0; + frames = 0; + map = nullptr; + candidates = nullptr; + splines = nullptr; +} + +AM_SCENE::~AM_SCENE() { + clear(); +} + +void AM_SCENE::clear(void) { + if (candidates) { + delete[] candidates; + candidates = nullptr; + } + if (splines) { + delete[] splines; + splines = nullptr; + } + if (map) { + for ( size_t i = 0; i < atoms; ++i) { + free (map[i]); + } + free(map); + map = NULL; + atoms = 0; + frames = 0; + } +} + +bool AM_SCENE::init(size_t atoms, size_t frames) { + if (map != nullptr) return false; + + this->atoms = atoms; + this->frames = frames; + + size_t i; + map = (AM_ATOM **) malloc( atoms * sizeof(AM_ATOM *) ); + if (!map) return false; + + for (i = 0 ; i < atoms ; ++i ) { + map[i] = (AM_ATOM *) malloc( frames * sizeof(AM_ATOM) ); + if (map[i] == nullptr) { + for(size_t j = 0; j<=i; ++j) { + free(map[j]); + } + free(map); + return false; + } + } + + candidates = new (std::nothrow) std::vector[frames]; + if (!candidates) { + clear(); + return false; + } + for (i = 0; i < frames; ++i) candidates[i].reserve(atoms); + + splines = new (std::nothrow) glnemo::CRSpline[atoms]; + if (!splines) { + clear(); + return false; + } + for (i = 0; i < atoms; ++i) splines[i].clearCPoints(); + + return true; +} + +void AM_SCENE::renew_splines() { + for (size_t i = 0; i < atoms; ++i) { + splines[i].clearCPoints(); + for (size_t j = 0; j < frames; ++j) { + double x = map[i][j].x / 65536.0; + double y = map[i][j].y / 65536.0; + splines[i].AddSplinePoint(glnemo::Vec3D(x, y, 0.0)); + } + } +} + +void AM_SCENE::get_xy(size_t atom, double t, double *x, double *y, unsigned interpolation) const { + if (interpolation == AM_SPLINE) { + glnemo::Vec3D v = splines[atom].GetInterpolatedSplinePoint(t); + *x = v.x; + *y = v.y; + return; + } + + size_t cur_frame = get_current_frame(t); + AM_ATOM a1 = map[atom][cur_frame]; + if (interpolation == AM_LINEAR) { + size_t next_frame = (cur_frame+1) % frames; + AM_ATOM a2 = map[atom][next_frame]; + + double p = 1.0/frames; + double str = 1.0 - (t - p*cur_frame)/p; + if (str > 1.0) str = 1.0; + if (str < 0.0) str = 0.0; + + *x = (str*a1.x + (1.0-str)*a2.x)/65535.0; + *y = (str*a1.y + (1.0-str)*a2.y)/65535.0; + return; + } + + *x = a1.x / 65535.0; + *y = a1.y / 65535.0; +} + +// Returns 1.0 when interpolation at t is close to key frames. +// Returns 0.0 when interpolation at t is the farthest from key frames. +double AM_SCENE::get_certainty(double t) const { + const double pi = 3.14159265358; + size_t cur_frame = get_current_frame(t); + + double p = 1.0/frames; + double str = 1.0 - (t - p*cur_frame)/p; + if (str > 1.0) str = 1.0; + if (str < 0.0) str = 0.0; + + return ((cos(str*(pi/0.5))+1.0)/2.0); +} + +size_t AM_SCENE::get_current_frame(double t) const { + size_t cur_frame = t*frames; + cur_frame %= frames; + return cur_frame; +} + +AM_COLOR AM_SCENE::get_rgba(size_t atom, double t, double lag, double slope, unsigned interpolation) const { + size_t cur_frame = get_current_frame(t); + AM_COLOR color; + + if (interpolation == AM_NONE) { + color.r = map[atom][cur_frame].r; + color.g = map[atom][cur_frame].g; + color.b = map[atom][cur_frame].b; + color.a = map[atom][cur_frame].a; + return color; + } + + const double pi = 3.14159265358; + size_t next_frame = (cur_frame+1) % frames; + + // Linear interpolation: + double p = 1.0/frames; + double str = 1.0 - (t - p*cur_frame)/p; + if (str > 1.0) str = 1.0; + if (str < 0.0) str = 0.0; + + if (interpolation == AM_COSINE || interpolation == AM_PERLIN) { + double s = (slope+0.1)/1.1; + double l = (1.0 - s) * lag; + + if (str <= l ) str = 0.0; + else if (str >= (l+s)) str = 1.0; + else str = ((-cos((str-l)*(pi/s))+1.0)/2.0); + } + + color.r = (str)*map[atom][cur_frame].r + (1.0-str)*map[atom][next_frame].r; + color.g = (str)*map[atom][cur_frame].g + (1.0-str)*map[atom][next_frame].g; + color.b = (str)*map[atom][cur_frame].b + (1.0-str)*map[atom][next_frame].b; + color.a = (str)*map[atom][cur_frame].a + (1.0-str)*map[atom][next_frame].a; + return color; +} + +double AM_SCENE::get_current_path_length(size_t atom, double t) const { + size_t cur_frame = get_current_frame(t); + size_t next_frame = (cur_frame+1) % frames; + + return am_atom_distance(map[atom][cur_frame], map[atom][next_frame]); +} + +bool AM_SCENE::push_atom(size_t frame, AM_ATOM atom) { + if (frame >= frames) return false; + size_t sz_before = candidates[frame].size(); + candidates[frame].push_back(atom); + if (candidates[frame].size() == sz_before) return false; + return true; +} + +bool AM_SCENE::elect_atoms() { + for (size_t i=0; i= atoms) return -1.0; + + double distance = 0.0; + for (size_t f=0; f= atoms || frames==0) return -1.0; + + double r = 0.0; + double g = 0.0; + double b = 0.0; + double a = 0.0; + + for (size_t f=0; f row; + row.reserve(atoms); + for (f=0; f= sorted_atoms.size()) return 0; + return sorted_atoms[position]; +} + +bool am_compare_pairs( const std::pair& i, const std::pair& j ) { + return j.second < i.second; +} + +void AM_SCENE::sort_atoms() { + std::vector< std::pair > paths; + paths.reserve(atoms); + + for (size_t a=0; a *AM_SCENE::get_candidates(size_t frame) const { + return (const std::vector *) &(candidates[frame]); +} + +bool AM_SCENE::copy_map_from(const AM_SCENE *scene) { + size_t atoms = scene->atom_count(); + size_t frames = scene->frame_count(); + if (atoms == 0 || frames == 0) return false; + + if (atom_count() != atoms || frame_count() != frames) { + clear(); + if (!init(atoms, frames)) return false; + } + + for (size_t j=0; jget_atom(i,j); + } + } + return true; +} + +bool AM_SCENE::copy_candidates_from(const AM_SCENE *scene) { + if (frame_count() != scene->frame_count() + || atom_count() != scene->atom_count()) return false; + + for (size_t i=0; iget_candidates(i)); + } + return true; +} + +bool AM_SCENE::swap_atoms(size_t frame, size_t atom1, size_t atom2) { + if (frame >= frames || atom1 >= atoms || atom2 >= atoms) return false; + if (atom1 == atom2) return true; + + AM_ATOM abuf = map[atom1][frame]; + map[atom1][frame] = map[atom2][frame]; + map[atom2][frame] = abuf; + + return true; +} + +AM_ATOM am_create_atom(double x, double y, unsigned char r, unsigned char g, unsigned char b, unsigned char a) { + uint16_t real_x, real_y; + if (x >= 1.0) real_x = 65535; + else if (x <= 0.0) real_x = 0; + else real_x = round(x*65536.0); + + if (y >= 1.0) real_y = 65535; + else if (y <= 0.0) real_y = 0; + else real_y = round(y*65536.0); + + AM_ATOM atom; + atom.x = real_x; + atom.y = real_y; + atom.r = r; + atom.g = g; + atom.b = b; + atom.a = a; + return atom; +} + +double am_atom_gradient(AM_ATOM a1, AM_ATOM a2) { + double gradient = sqrt(pow(abs(a1.r-a2.r)/8.0, 2.0) + pow(abs(a1.g-a2.g)/8.0, 2.0) + pow(abs(a1.b-a2.b)/8.0, 2.0)) / 55.209119491; + return (gradient < 0.0 ? 0.0 : (gradient > 1.0 ? 1.0 : gradient)); +} + +double am_atom_distance(AM_ATOM a1, AM_ATOM a2) { + double cost = 0.0; + cost = sqrt(pow(fabs((a1.x - a2.x)/256.0),2.0) + pow(fabs((a1.y - a2.y)/256.0),2.0)) / 362.033147696; + return (cost < 0.0 ? 0.0 : (cost > 1.0 ? 1.0 : cost)); +} + +AM_THREAD::AM_THREAD() { + running = false; + signal_stop = false; + signal_pause = false; + paused = true; + subcost = nullptr; + cost = 0.0; +} + +AM_THREAD::~AM_THREAD() { + if (step_thread.joinable()) { + pause(); + stop(); + } + clear(); +} + +bool AM_THREAD::init(const AM_SCENE *scene) { + if (running && !paused) return false; + if (!this->scene.copy_map_from(scene)) return false; + + // Original candidates are copied from the input scene. + // Then individual atoms for this thread get elected so + // that the map of this thread would be different than + // of the input scene's. + if (!this->scene.copy_candidates_from(scene)) return false; + if (!this->scene.elect_atoms()) return false; + + size_t atoms = scene->atom_count(); + subcost = new (std::nothrow) double[atoms]; + if (!subcost) return false; + + cost = this->scene.get_cost(); + for (size_t i = 0; i < atoms; ++i) subcost[i]=0.0; + + std::default_random_engine e(0); + e1 = e; + + this->step_size = 1000; + magic_exponent = 3.0; + + gradient_importance = 0.0; + + return true; +} + +void AM_THREAD::set_seed(unsigned seed) { + if (running && !paused) return; + std::default_random_engine e(seed); + e1 = e; +} + +// Sane range: [100, 1000] +// Very high number will make the threads to respond to signals very slowly. +void AM_THREAD::set_step_size(int step_size) { + if (running && !paused) return; + this->step_size = step_size; +} + +// Sane range: [1.0, 3.0] +void AM_THREAD::set_magic_exponent(double exponent) { + if (running && !paused) return; + magic_exponent = exponent; +} + +// Sane range: [0.0, 1.0] +void AM_THREAD::set_gradient_importance(double importance) { + if (running && !paused) return; + gradient_importance = importance; +} + +bool AM_THREAD::clear() { + if (running && !paused) return false; + scene.clear(); + + if (subcost) { + delete[] subcost; + subcost = nullptr; + } + + return true; +} + +double AM_THREAD::chain_length(AM_ATOM a1, AM_ATOM a2, AM_ATOM a3) { + return am_atom_distance(a1, a2) + am_atom_distance(a2, a3); +} + +double AM_THREAD::chain_gradient(AM_ATOM a1, AM_ATOM a2, AM_ATOM a3) { + return am_atom_gradient(a1, a2) + am_atom_gradient(a2, a3); +} + +void AM_THREAD::step() { + size_t frames = scene.frame_count(); + size_t atoms = scene.atom_count(); + + int max_tries=step_size; + + if (frames == 0 || atoms <= 1) return; + + std::uniform_int_distribution uniform_dist_atoms (0, atoms - 1); + std::uniform_int_distribution uniform_dist_frames(0, frames - 1); + + double cost_per_atom = cost / atoms; + double cost_per_frame = cost_per_atom / frames; + + size_t frame = uniform_dist_frames(e1); + size_t frame_before = (frame == 0 ? frames-1 : frame-1); + size_t frame_after = (frame + 1) % frames; + size_t atom1 = 0, atom2; + AM_ATOM a1b,a1c,a1a; + double chain1b; + double gradient1b=0.0; + + EvalAtom1: + if (max_tries-- <= 0) return; + atom1 = uniform_dist_atoms(e1); + a1b = scene.get_atom(atom1, frame_before); + a1c = scene.get_atom(atom1, frame); + a1a = scene.get_atom(atom1, frame_after); + chain1b = chain_length (a1b,a1c,a1a); + + if (gradient_importance > 0.0) { + gradient1b = chain_gradient(a1b,a1c,a1a); + } + + if (chain1b/2.0 < cost_per_frame) goto EvalAtom1; + max_tries++; + Again: + if (max_tries-- <= 0) return; + atom2 = uniform_dist_atoms(e1); + if (atom1 == atom2) goto Again; + + { + AM_ATOM a2b = scene.get_atom(atom2, frame_before); + AM_ATOM a2c = scene.get_atom(atom2, frame); + AM_ATOM a2a = scene.get_atom(atom2, frame_after); + + double chain2b = chain_length(a2b,a2c,a2a); + double chain1a = chain_length(a1b,a2c,a1a); + double chain2a = chain_length(a2b,a1c,a2a); + + double gain = (chain1b - chain1a) + (chain2b - chain2a); + + double c1a3 = pow(chain1a, magic_exponent); + double c2a3 = pow(chain2a, magic_exponent); + double c1b3 = pow(chain1b, magic_exponent); + double c2b3 = pow(chain2b, magic_exponent); + + if (gradient_importance > 0.0) { + double gradient2b = chain_gradient(a2b,a2c,a2a); + double gradient1a = chain_gradient(a1b,a2c,a1a); + double gradient2a = chain_gradient(a2b,a1c,a2a); + + double inv = 1.0 - gradient_importance; + c1a3 = c1a3*inv + gradient_importance*gradient1a; + c2a3 = c2a3*inv + gradient_importance*gradient2a; + c1b3 = c1b3*inv + gradient_importance*gradient1b; + c2b3 = c2b3*inv + gradient_importance*gradient2b; + } + + if ((c1a3 + c2a3) < (c1b3 + c2b3)) { + cost -= gain; + scene.swap_atoms(frame, atom1, atom2); + } + else goto Again; + } +} + +void AM_THREAD::run() { + while (!signal_stop) { + if (!signal_pause && !paused) { + step(); + } + else { + paused = true; + std::this_thread::sleep_for(std::chrono::milliseconds(0)); + } + } + running = false; + signal_stop = false; + signal_pause = false; + paused = true; +} + +bool AM_THREAD::fetch_scene(AM_SCENE *target) const { + if (running && !paused) return false; + return target->copy_map_from(&scene); +} + +AM_IMAGE::AM_IMAGE() { + w = 0; + h = 0; + done = true; + + running = false; + signal_stop = false; + signal_pause = false; + paused = true; +} + +AM_IMAGE::~AM_IMAGE() { + if (step_thread.joinable()) { + pause(); + stop(); + } +} + +void AM_IMAGE::run() { + while (!signal_stop) { + if (!signal_pause && !paused) { + render(); + if (done) paused = true; + } + else { + paused = true; + std::this_thread::sleep_for(std::chrono::milliseconds(0)); + } + } + running = false; + signal_stop = false; + signal_pause = false; + paused = true; + color_interpolation = AM_NONE; + path_interpolation = AM_NONE; +} + +void AM_IMAGE::render() { + if (done) return; + + if (w == 0 || h == 0) { + atoms.clear(); + done = true; + return; + } + size_t atom_count = scene.atom_count(); + + scene.renew_splines(); + atoms.clear(); + atoms.reserve(atom_count); + + std::map rs; // red components + std::map gs; // green components + std::map bs; // blue components + std::map as; // alpha components + std::map weight; // sum of weights + + for (size_t i=0; i 1.0) px = 1.0; + else if (px < 0.0) px = 0.0; + if (py > 1.0) py = 1.0; + else if (py < 0.0) py = 0.0; + x = std::min(size_t(round(px*w)),size_t(w-1)); + y = std::min(size_t(round(py*h)),size_t(h-1)); + + AM_COLOR color; + AM_ATOM atom = scene.get_atom(i, scene.get_current_frame(t)); + unsigned char r,g,b,a; + + if (color_interpolation == AM_PERLIN) { + double f = 8.0; // Frequency + int octaves = 8; // Octaves + double perlin_x = (atom.x / 65535.0)*f; + double perlin_y = (atom.y / 65535.0)*f; + double lag = lag_map. octaveNoise(perlin_x, perlin_y, octaves)*0.5 + 0.5; + double slope = slope_map.octaveNoise(perlin_x,perlin_y,8)*0.5 + 0.5; + color = scene.get_rgba(i, t, lag, slope, AM_PERLIN); + } + else color = scene.get_rgba(i, t, 0.5, 0.5, color_interpolation); + + r = color.r; + g = color.g; + b = color.b; + a = color.a; + + size_t index = y*w + x; + + double d = 1.0 - scene.get_current_path_length(i, t); + + if (weight.find(index) == weight.end()) weight[index] = d; else weight[index]+= d; + if (rs.find(index) == rs.end()) rs [index] = d*(r/255.0); else rs [index]+= d*(r/255.0); + if (gs.find(index) == gs.end()) gs [index] = d*(g/255.0); else gs [index]+= d*(g/255.0); + if (bs.find(index) == bs.end()) bs [index] = d*(b/255.0); else bs [index]+= d*(b/255.0); + if (as.find(index) == as.end()) as [index] = d*(a/255.0); else as [index]+= d*(a/255.0); + } + + AM_ATOM atom; + for (auto& kv : weight) { + double p = kv.second; + atom.r = 255*(rs[kv.first] / p); + atom.g = 255*(gs[kv.first] / p); + atom.b = 255*(bs[kv.first] / p); + atom.a = 255*(as[kv.first] / p); + atom.x = kv.first % w; + atom.y = kv.first / w; + atoms.push_back(atom); + } + + done = true; +} + +bool AM_IMAGE::set_scene(const AM_SCENE *scene) { + if (running && !paused) return false; + if (!this->scene.copy_map_from(scene)) return false; + + done = false; + + return true; +} + +bool AM_IMAGE::set_resolution(size_t width, size_t height) { + if (running && !paused) return false; + w = width; + h = height; + + return true; +} + +bool AM_IMAGE::set_time(double time) { + if (running && !paused) return false; + t = time; + + return true; +} + +bool AM_IMAGE::set_seed(unsigned seed) { + if (running && !paused) return false; + this->seed = seed; + + PerlinNoise l_map(seed); lag_map = l_map; + PerlinNoise s_map(seed+1); slope_map = s_map; + + return true; +} + +bool AM_IMAGE::set_color_interpolation(unsigned method) { + if (running && !paused) return false; + color_interpolation = method; + + return true; +} + +bool AM_IMAGE::set_path_interpolation(unsigned method) { + if (running && !paused) return false; + path_interpolation = method; + + return true; +} + +bool AM_IMAGE::get_xy(size_t pixel, int *x, int *y) const { + if (running && !paused) return false; + if (pixel >= atoms.size()) return false; + AM_ATOM a = atoms[pixel]; + + *x = a.x; + *y = a.y; + return true; +} + +bool AM_IMAGE::get_rgba(size_t pixel, unsigned char *r, unsigned char *g, unsigned char *b, unsigned char *a) const { + if (running && !paused) return false; + if (pixel >= atoms.size()) return false; + AM_ATOM atom = atoms[pixel]; + + *r = atom.r; + *g = atom.g; + *b = atom.b; + *a = atom.a; + return true; +} + +bool AM_IMAGE::fetch_pixels(std::vector *to) const { + if (running && !paused) return false; + if (to == nullptr) return false; + + size_t sz = atoms.size(); + to->reserve(sz); + + for (size_t i=0; ipush_back(atoms[i]); + } + return true; +} + +// AM_BLENDER: + +AM_BLENDER::AM_BLENDER() { + w = 0; + h = 0; + done = true; + + running = false; + signal_stop = false; + signal_pause = false; + paused = true; + median_combining = false; +} + +AM_BLENDER::~AM_BLENDER() { + if (step_thread.joinable()) { + pause(); + stop(); + } + clear(); +} + +bool AM_BLENDER::clear() { + if (running && !paused) return false; + atoms.clear(); + done = true; + layers.clear(); + + return true; +} + +void AM_BLENDER::run() { + while (!signal_stop) { + if (!signal_pause && !paused) { + render(); + if (done) paused = true; + } + else { + paused = true; + std::this_thread::sleep_for(std::chrono::milliseconds(0)); + } + } + running = false; + signal_stop = false; + signal_pause = false; + paused = true; +} + +void AM_BLENDER::render() { + if (done) return; + size_t layer_count = layers.size(); + + if (w == 0 || h == 0 || layer_count == 0) { + atoms.clear(); + done = true; + return; + } + + size_t atom_count = atoms.size(); + + std::map counts; // number of atoms + std::map > rs; // red components for median combining + std::map > gs; // green components for median combining + std::map > bs; // blue components for median combining + std::map > as; // alpha components for median combining + std::map rsa; // red components for averaging + std::map gsa; // green components for averaging + std::map bsa; // blue components for averaging + std::map asa; // alpha components for averaging + std::vector indices; + + indices.reserve(atom_count); + + double weight = 1.0 / layer_count; + + for (size_t i=0; i 255) r = 255; + g = gsa[index]/p; if (g > 255) g = 255; + b = bsa[index]/p; if (b > 255) b = 255; + a = asa[index]/p; if (a > 255) a = 255; + } + + atom.r = r; + atom.g = g; + atom.b = b; + atom.a = a; + atoms.push_back(atom); + } + + done = true; +} + +bool AM_BLENDER::add_image(const AM_IMAGE *img) { + if (running && !paused) return false; + + size_t pixels_before = atoms.size(); + img->fetch_pixels(&atoms); + + done = false; + layers.push_back(pixels_before); + + return true; +} + +bool AM_BLENDER::set_resolution(size_t width, size_t height) { + if (running && !paused) return false; + w = width; + h = height; + + return true; +} + +bool AM_BLENDER::set_median_combining(bool value) { + if (running && !paused) return false; + median_combining = value; + + return true; +} + +bool AM_BLENDER::get_xy(size_t pixel, int *x, int *y) const { + if (running && !paused) return false; + if (pixel >= atoms.size()) return false; + AM_ATOM a = atoms[pixel]; + + *x = a.x; + *y = a.y; + return true; +} + +bool AM_BLENDER::get_rgba(size_t pixel, unsigned char *r, unsigned char *g, unsigned char *b, unsigned char *a) const { + if (running && !paused) return false; + if (pixel >= atoms.size()) return false; + AM_ATOM atom = atoms[pixel]; + + *r = atom.r; + *g = atom.g; + *b = atom.b; + *a = atom.a; + return true; +} + +#endif + +namespace am { + +pixel create_pixel(uint16_t x, uint16_t y, unsigned char r, unsigned char g, unsigned char b, unsigned char a) { + pixel px; + px.x = x; + px.y = y; + px.c.r = r; + px.c.g = g; + px.c.b = b; + px.c.a = a; + return px; +} + +pixel create_pixel(uint16_t x, uint16_t y, color c) { + return create_pixel(x, y, c.r, c.g, c.b, c.a); +} + +const char * get_version() { + return "1.0"; +} + +size_t get_warning() { + size_t flags = 0; + if (sizeof(void *) < 8) flags = flags|WARN_POINTER_SIZE; + if (sizeof(pixel) > 8) flags = flags|WARN_PIXEL_SIZE; + if (sizeof(point) > 8) flags = flags|WARN_POINT_SIZE; + return flags; +} + +bool uses_opencv() { +#ifdef ATOMORPH_OPENCV + return true; +#endif + return false; +} + +// Clears the chain, freeing dynamically allocated memory. +// After calling this, chain can be safely deleted. +void clear_chain(chain *c) { + if (c->points) { + for (size_t i=0; iwidth; ++i) { + delete [] c->points[i]; + } + delete [] c->points; + c->points = nullptr; + } + + if (c->places) { + for (size_t i=0; iwidth; ++i) { + delete [] c->places[i]; + } + delete [] c->places; + c->places = nullptr; + } + + if (c->splines) { + delete [] c->splines; + c->splines = nullptr; + } + +#ifdef ATOMORPH_OPENCV + if (c->kdtrees) { + for (size_t i=0; iheight; ++i) { + if (c->kdtrees[i] == nullptr) continue; + cv::flann::Index *kdtree = (cv::flann::Index *) c->kdtrees[i]; + delete kdtree; + } + delete [] c->kdtrees; + c->kdtrees = nullptr; + } + + if (c->feature) { + for (size_t i=0; iheight; ++i) { + if (c->feature[i] == nullptr) continue; + cv::Mat *m = (cv::Mat *) c->feature[i]; + delete m; + } + delete [] c->feature; + c->feature = nullptr; + } +#endif + + c->width =0; + c->height=0; + c->energy=0.0; + c->max_surface=0; +} + +// Returns false if memory allocation has failed, chain will be left in a cleared state. +bool renew_chain(chain *c, size_t width, size_t height) { + clear_chain(c); + + c->points = new (std::nothrow) point* [width]; + if (c->points == nullptr) { + return false; + } + + for (size_t k = 0; k < width; ++k ) { + c->points[k] = new (std::nothrow) point [height]; + if (c->points[k] == nullptr) { + for (size_t t = 0; t<=k; ++t) { + delete [] c->points[t]; + } + delete [] c->points; + // Unable to allocate enough memory. + c->points = nullptr; + return false; + } + } + + c->places = new (std::nothrow) size_t* [width]; + if (c->places == nullptr) { + clear_chain(c); + return false; + } + + for (size_t k = 0; k < width; ++k ) { + c->places[k] = new (std::nothrow) size_t [height]; + if (c->places[k] == nullptr) { + for (size_t t = 0; t<=k; ++t) { + delete [] c->places[t]; + } + delete [] c->places; + // Unable to allocate enough memory. + c->places = nullptr; + return false; + } + } + + c->splines = new (std::nothrow) glnemo::CRSpline[width]; + if (c->splines == nullptr) { + clear_chain(c); + return false; + } + +#ifdef ATOMORPH_OPENCV + c->kdtrees = new (std::nothrow) void* [height]; + if (c->kdtrees == nullptr) { + clear_chain(c); + return false; + } + + for (size_t i=0; ikdtrees[i] = nullptr; + } + + c->feature = new (std::nothrow) void* [height]; + if (c->feature == nullptr) { + clear_chain(c); + return false; + } + + for (size_t i=0; ifeature[i] = nullptr; + } +#endif + + c->width = width; + c->height= height; + + return true; +} + +} + + diff --git a/atomorph.h b/atomorph.h new file mode 100644 index 0000000..e7cbe05 --- /dev/null +++ b/atomorph.h @@ -0,0 +1,389 @@ +/* + * AtoMorph - Simple Library for Morphing 2D Particle Clouds + * See Copyright Notice at the end of this file. + */ + +#ifndef _ATOMORPH_H_ +#define _ATOMORPH_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef ATOMORPH_OPENCV +#include +#endif + +#include "spline.h" +#include "perlin.h" +#include "fluidmodel.h" +#include "color.h" + +#ifdef ATOMORPH_DEPRECATED +#define AM_NONE 0 +#define AM_LINEAR 1 +#define AM_COSINE 2 +#define AM_PERLIN 3 +#define AM_SPLINE 4 + +#define AM_WARN_POINTER_SIZE 1 // Set when sizeof(void *) is less than 64 bits. +#define AM_WARN_ATOM_SIZE 2 // Set when sizeof(AM_ATOM) is more than 64 bits. + +typedef struct AM_COLOR { + unsigned char r; + unsigned char g; + unsigned char b; + unsigned char a; +} AM_COLOR; + +typedef struct AM_ATOM { + uint16_t x; + uint16_t y; + unsigned char r; + unsigned char g; + unsigned char b; + unsigned char a; +} AM_ATOM; + +class AM_SCENE { + public: + AM_SCENE(); + ~AM_SCENE(); + + void clear(); + bool init(size_t atoms, size_t frames); + bool push_atom(size_t frame, AM_ATOM atom); + void renew_splines(); + double get_certainty(double t) const; + void get_xy (size_t atom, double t, double *x, double *y, unsigned method) const; + AM_COLOR get_rgba(size_t atom, double t, double lag, double slope, unsigned interpolation) const; + double get_current_path_length(size_t atom, double t) const; + AM_ATOM get_atom(size_t atom, size_t frame) const; + size_t atom_count() const {return atoms;} + size_t frame_count() const {return frames;} + size_t get_sorted_atom_at(size_t position); + size_t get_current_frame(double t) const; + bool copy_map_from(const AM_SCENE *scene); + bool copy_candidates_from(const AM_SCENE *scene); + void shuffle(); + void sort_atoms(); + double get_cost() const; + double get_path_length(size_t atom) const; + double get_path_color(size_t atom) const; + bool elect_atoms(); + bool swap_atoms(size_t frame, size_t atom1, size_t atom2); + const std::vector *get_candidates(size_t frame) const; + + private: + size_t atoms; + size_t frames; + + std::vector sorted_atoms; + std::vector *candidates; + glnemo::CRSpline *splines; + + AM_ATOM **map; +}; + +class AM_THREAD { + public: + AM_THREAD(); + ~AM_THREAD(); + + bool clear(); + bool init(const AM_SCENE *scene); + + void set_seed(unsigned seed); + void set_step_size(int step_size); + void set_gradient_importance(double weight); + void set_magic_exponent(double exponent); + + bool is_running() const {return running;} + bool is_paused() const {return paused;} + + void stop() { signal_stop = true; while(running) std::this_thread::sleep_for(std::chrono::milliseconds(0)); step_thread.join();} + void start() { running = true; step_thread = std::thread(&AM_THREAD::run, this);} + void pause() { signal_pause = true; while(!paused) std::this_thread::sleep_for(std::chrono::milliseconds(0)); signal_pause = false;} + void resume() { paused = false;} + + double get_cost() const {return cost;} + bool fetch_scene(AM_SCENE *target) const; + + private: + void run(); + void step(); + double chain_length(AM_ATOM a1, AM_ATOM a2, AM_ATOM a3); + double chain_gradient(AM_ATOM a1, AM_ATOM a2, AM_ATOM a3); + AM_SCENE scene; + double *subcost; + double cost; + std::default_random_engine e1; + int step_size; + double magic_exponent; + double gradient_importance; + + std::atomic signal_stop; + std::atomic running; + std::atomic signal_pause; + std::atomic paused; + std::thread step_thread; +}; + +class AM_IMAGE { + public: + AM_IMAGE(); + ~AM_IMAGE(); + + bool set_scene(const AM_SCENE *scene); + bool set_resolution(size_t width, size_t height); + bool set_time(double time); + bool set_seed(unsigned seed); + bool set_color_interpolation(unsigned method); + bool set_path_interpolation(unsigned method); + + bool is_running() const {return running;} + bool is_paused() const {return paused;} + size_t pixel_count() const {return atoms.size();} + + bool get_xy (size_t pixel, int *x, int *y) const; + bool get_rgba(size_t pixel, unsigned char *r, unsigned char *g, unsigned char *b, unsigned char *a) const; + size_t get_pixel_count() const {return atoms.size();} + + bool fetch_pixels(std::vector *to) const; + + void stop() { signal_stop = true; while(running) std::this_thread::sleep_for(std::chrono::milliseconds(0)); step_thread.join();} + void start() { running = true; step_thread = std::thread(&AM_IMAGE::run, this);} + void pause() { signal_pause = true; while(!paused) std::this_thread::sleep_for(std::chrono::milliseconds(0)); signal_pause = false;} + void resume() { paused = false;} + + private: + void run(); + void render(); + std::vector atoms; + size_t w; + size_t h; + double t; + AM_SCENE scene; + bool done; + unsigned seed; + unsigned color_interpolation; + unsigned path_interpolation; + PerlinNoise lag_map; + PerlinNoise slope_map; + + std::atomic signal_stop; + std::atomic running; + std::atomic signal_pause; + std::atomic paused; + std::thread step_thread; +}; + +class AM_BLENDER { + public: + AM_BLENDER(); + ~AM_BLENDER(); + + bool set_resolution(size_t width, size_t height); + bool set_median_combining(bool value); + bool clear(); + bool add_image(const AM_IMAGE *img); + + bool get_xy (size_t pixel, int *x, int *y) const; + bool get_rgba(size_t pixel, unsigned char *r, unsigned char *g, unsigned char *b, unsigned char *a) const; + size_t pixel_count() const {return atoms.size();} + + bool is_running() const {return running;} + bool is_paused() const {return paused;} + + void stop() { signal_stop = true; while(running) std::this_thread::sleep_for(std::chrono::milliseconds(0)); step_thread.join();} + void start() { running = true; step_thread = std::thread(&AM_BLENDER::run, this);} + void pause() { signal_pause = true; while(!paused) std::this_thread::sleep_for(std::chrono::milliseconds(0)); signal_pause = false;} + void resume() { paused = false;} + + private: + void run(); + void render(); + std::vector atoms; + std::vector layers; + size_t w; + size_t h; + bool done; + bool median_combining; + + std::atomic signal_stop; + std::atomic running; + std::atomic signal_pause; + std::atomic paused; + std::thread step_thread; +}; + +AM_ATOM am_create_atom(double x, double y, unsigned char r, unsigned char g, unsigned char b, unsigned char a); +double am_atom_distance(AM_ATOM a1, AM_ATOM a2); +double am_atom_gradient(AM_ATOM a1, AM_ATOM a2); +const char * am_get_version(); +size_t am_get_warning(); +#endif + +namespace am { + +const unsigned RGB = 0; // Don't change the color space. +const unsigned HSP = 1; // Convert from RGB to HSP. +const unsigned NONE = 2; // Color/motion interpolation is off. +const unsigned LINEAR = 3; // Uses linear interpolation. +const unsigned SPLINE = 4; // Spline interpolation (motion only). +const unsigned COSINE = 5; // Cosine interpolation (colors only). +const unsigned PERLIN = 6; // Perlin noise dependent interpolation (colors only). +const unsigned STATE_BLOB_DETECTION = 0; +const unsigned STATE_BLOB_UNIFICATION = 1; +const unsigned STATE_BLOB_MATCHING = 2; +const unsigned STATE_ATOM_MORPHING = 3; +const unsigned STATE_DONE = 4; +const unsigned char HAS_PIXEL = 1; +const unsigned char HAS_FLUID = 2; +typedef struct pixel { + uint16_t x; + uint16_t y; + + color c; +} pixel; + +typedef struct blob { + size_t index; // Position in the nest vector. + std::set surface; // Pixel positions for surface. + std::set border; // Pixel positions around surface. + size_t group =0; + bool unified=false; + double x,y,r,g,b,a; +} blob; + +typedef struct key_frame { + std::vector blobs; // Vector of blobs. + std::map pixels; // Map of pixels by position. + std::map owners; // Map of blobs by position. + double x,y,r,g,b,a; + size_t index =0; // Position in the nest container. + size_t first_expansion=0; // Blobs before this index cannot expand. + size_t first_dust =0; // First under-sized blob to be unified. +} frame; + +typedef union key_point { + struct { + uint16_t x; + uint16_t y; + uint8_t x_fract; + uint8_t y_fract; + uint8_t flags; + } s; + uint64_t word; +} point; + +typedef struct blob_chain { + size_t width =0; + size_t height=0; + point **points=nullptr; + size_t **places=nullptr; + double energy=0.0; + size_t max_surface=0; + glnemo::CRSpline *splines=nullptr; +#ifdef ATOMORPH_OPENCV + void **kdtrees=nullptr; + void **feature=nullptr; +#endif +} chain; + +const size_t WARN_POINTER_SIZE = 1; // Set when sizeof(void *) is less than 64 bits. +const size_t WARN_PIXEL_SIZE = 2; // Set when sizeof(pixel) is more than 64 bits. +const size_t WARN_POINT_SIZE = 3; // Set when sizeof(point) is more than 64 bits. + +const unsigned TEXTURE = 0; +const unsigned AVERAGE = 1; +const unsigned DISTINCT = 2; + +void clear_chain(chain *c); +bool renew_chain(chain *c, size_t width, size_t height); + +pixel create_pixel(uint16_t x, uint16_t y, unsigned char r, unsigned char g, unsigned char b, unsigned char a); +pixel create_pixel(uint16_t x, uint16_t y, color c); +inline size_t xy2pos (uint16_t x, uint16_t y) {return (y*(UINT16_MAX+1)+x);} + +inline void point2xy(point pt, float *x, float *y) { + *x = pt.s.x + pt.s.x_fract/float(UINT8_MAX+1); + *y = pt.s.y + pt.s.y_fract/float(UINT8_MAX+1); +} + +inline uint32_t pixel_distance (pixel p1, pixel p2 ) { + int32_t xd = p1.x-p2.x; + int32_t yd = p1.y-p2.y; + + return xd*xd+yd*yd; +} + +inline uint32_t approx_point_distance (point p1, point p2) { + int32_t xd = p1.s.x-p2.s.x; + int32_t yd = p1.s.y-p2.s.y; + + return xd*xd + yd*yd; +} + +inline uint64_t point_distance (point p1, point p2) { + uint64_t xd = std::abs(((UINT8_MAX+1)*p1.s.x+p1.s.x_fract) - ((UINT8_MAX+1)*p2.s.x+p2.s.x_fract)); + uint64_t yd = std::abs(((UINT8_MAX+1)*p1.s.y+p1.s.y_fract) - ((UINT8_MAX+1)*p2.s.y+p2.s.y_fract)); + + return (xd*xd + yd*yd); +} + +inline double distance(double x1, double y1, double x2, double y2) { + double xd = x1-x2; + double yd = y1-y2; + + return xd*xd+yd*yd; +} + +inline bool point_has_pixel(point p) { + return (p.s.flags & HAS_PIXEL); +} + +inline bool point_has_fluid(point p) { + return (p.s.flags & HAS_FLUID); +} + +const char * get_version(); +size_t get_warning(); +bool uses_opencv(); + +} + +#include "thread.h" +#include "morph.h" + +#endif +/* +The MIT License (MIT) + +Copyright (c) 2013-2014 Erich Erstu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + diff --git a/color.cpp b/color.cpp new file mode 100644 index 0000000..109577f --- /dev/null +++ b/color.cpp @@ -0,0 +1,181 @@ +/* + * See Copyright Notice in atomorph.h + */ + +#include +#include +#include + +#include "color.h" + +namespace am { + +color create_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a) { + color c; + c.r = r; + c.g = g; + c.b = b; + c.a = a; + return c; +} + +color create_color(double r, double g, double b, double a) { + color c; + c.r = std::round(r*255.0); + c.g = std::round(g*255.0); + c.b = std::round(b*255.0); + c.a = std::round(a*255.0); + return c; +} + +color rgb_to_hsp(color c) { + color hsp = c; + + double r,g,b,h,s,p; + r = c.r/255.0; + g = c.g/255.0; + b = c.b/255.0; + RGBtoHSP(r,g,b,&h,&s,&p); + hsp.r = std::round(h*255.0); + hsp.g = std::round(s*255.0); + hsp.b = std::round(p*255.0); + + return hsp; +} + +color hsp_to_rgb(color c) { + color rgb = c; + + double r,g,b,h,s,p; + h = c.r/255.0; + s = c.g/255.0; + p = c.b/255.0; + HSPtoRGB(h,s,p,&r,&g,&b); + rgb.r = std::min(std::round(r*255.0), 255.0); + rgb.g = std::min(std::round(g*255.0), 255.0); + rgb.b = std::min(std::round(b*255.0), 255.0); + + return rgb; +} + +const double Pr = 0.299; +const double Pg = 0.587; +const double Pb = 0.114; + +// public domain function by Darel Rex Finley, 2006 +// +// This function expects the passed-in values to be on a scale +// of 0 to 1, and uses that same scale for the return values. +// +// See description/examples at alienryderflex.com/hsp.html +void RGBtoHSP(double R, double G, double B, double *H, double *S, double *P) { + // Calculate the Perceived brightness. + *P=sqrt(R*R*Pr+G*G*Pg+B*B*Pb); + + // Calculate the Hue and Saturation. (This part works + // the same way as in the HSV/B and HSL systems???.) + if (R==G && R==B) { + *H=0.; + *S=0.; + return; + } + + if (R>=G && R>=B) {// R is largest + if (B>=G) { + *H=6./6.-1./6.*(B-G)/(R-G); + *S=1.-G/R; + } + else { + *H=0./6.+1./6.*(G-B)/(R-B); + *S=1.-B/R; + } + } + else if (G>=R && G>=B) {// G is largest + if (R>=B) { + *H=2./6.-1./6.*(R-B)/(G-B); *S=1.-B/G; + } + else { + *H=2./6.+1./6.*(B-R)/(G-R); *S=1.-R/G; + } + } + else {// B is largest + if (G>=R) { + *H=4./6.-1./6.*(G-R)/(B-R); *S=1.-R/B; + } + else { + *H=4./6.+1./6.*(R-G)/(B-G); *S=1.-G/B; + } + } +} + + + +// public domain function by Darel Rex Finley, 2006 +// +// This function expects the passed-in values to be on a scale +// of 0 to 1, and uses that same scale for the return values. +// +// Note that some combinations of HSP, even if in the scale +// 0-1, may return RGB values that exceed a value of 1. For +// example, if you pass in the HSP color 0,1,1, the result +// will be the RGB color 2.037,0,0. +// +// See description/examples at alienryderflex.com/hsp.html +void HSPtoRGB(double H, double S, double P, double *R, double *G, double *B) { + double part, minOverMax=1.-S ; + + if (minOverMax>0.) { + if ( H<1./6.) { // R>G>B + H= 6.*( H-0./6.); part=1.+H*(1./minOverMax-1.); + *B=P/sqrt(Pr/minOverMax/minOverMax+Pg*part*part+Pb); + *R=(*B)/minOverMax; *G=(*B)+H*((*R)-(*B)); + } + else if ( H<2./6.) { // G>R>B + H= 6.*(-H+2./6.); part=1.+H*(1./minOverMax-1.); + *B=P/sqrt(Pg/minOverMax/minOverMax+Pr*part*part+Pb); + *G=(*B)/minOverMax; *R=(*B)+H*((*G)-(*B)); + } + else if ( H<3./6.) { // G>B>R + H= 6.*( H-2./6.); part=1.+H*(1./minOverMax-1.); + *R=P/sqrt(Pg/minOverMax/minOverMax+Pb*part*part+Pr); + *G=(*R)/minOverMax; *B=(*R)+H*((*G)-(*R)); + } + else if ( H<4./6.) { // B>G>R + H= 6.*(-H+4./6.); part=1.+H*(1./minOverMax-1.); + *R=P/sqrt(Pb/minOverMax/minOverMax+Pg*part*part+Pr); + *B=(*R)/minOverMax; *G=(*R)+H*((*B)-(*R)); + } + else if ( H<5./6.) { // B>R>G + H= 6.*( H-4./6.); part=1.+H*(1./minOverMax-1.); + *G=P/sqrt(Pb/minOverMax/minOverMax+Pr*part*part+Pg); + *B=(*G)/minOverMax; *R=(*G)+H*((*B)-(*G)); } + else { // R>B>G + H= 6.*(-H+6./6.); part=1.+H*(1./minOverMax-1.); + *G=P/sqrt(Pr/minOverMax/minOverMax+Pb*part*part+Pg); + *R=(*G)/minOverMax; *B=(*G)+H*((*R)-(*G)); + } + } + else { + if ( H<1./6.) { // R>G>B + H= 6.*( H-0./6.); *R=sqrt(P*P/(Pr+Pg*H*H)); *G=(*R)*H; *B=0.; + } + else if ( H<2./6.) { // G>R>B + H= 6.*(-H+2./6.); *G=sqrt(P*P/(Pg+Pr*H*H)); *R=(*G)*H; *B=0.; + } + else if ( H<3./6.) { // G>B>R + H= 6.*( H-2./6.); *G=sqrt(P*P/(Pg+Pb*H*H)); *B=(*G)*H; *R=0.; + } + else if ( H<4./6.) { // B>G>R + H= 6.*(-H+4./6.); *B=sqrt(P*P/(Pb+Pg*H*H)); *G=(*B)*H; *R=0.; + } + else if ( H<5./6.) { // B>R>G + H= 6.*( H-4./6.); *B=sqrt(P*P/(Pb+Pr*H*H)); *R=(*B)*H; *G=0.; + } + else { // R>B>G + H= 6.*(-H+6./6.); *R=sqrt(P*P/(Pr+Pb*H*H)); *B=(*R)*H; *G=0.; + } + } +} + +} + diff --git a/color.h b/color.h new file mode 100644 index 0000000..f235e12 --- /dev/null +++ b/color.h @@ -0,0 +1,33 @@ +/* + * See Copyright Notice in atomorph.h + */ + +namespace am { + +typedef struct color { + uint8_t r; + uint8_t g; + uint8_t b; + uint8_t a; +} color; + +color create_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a); +color create_color(double r, double g, double b, double a); + +inline double color_distance(color c1, color c2) { + int16_t rd = c1.r-c2.r; + int16_t gd = c1.g-c2.g; + int16_t bd = c1.b-c2.b; + int16_t ad = c1.a-c2.a; + + return sqrt(rd*rd+gd*gd+bd*bd+ad*ad)/510.0; +} + +color rgb_to_hsp(color c); +color hsp_to_rgb(color c); + +void RGBtoHSP(double R, double G, double B, double *H, double *S, double *P); +void HSPtoRGB(double H, double S, double P, double *R, double *G, double *B); + +} + diff --git a/demo/Makefile b/demo/Makefile new file mode 100644 index 0000000..a053b14 --- /dev/null +++ b/demo/Makefile @@ -0,0 +1,45 @@ +NAME = atomorph +CC = gcc +PROF = -O2 +C_FLAGS = -std=c++11 -Wall $(PROF) +L_FLAGS = -lm -lstdc++ -pthread $(PROF) +OBJ_DIR = obj +OPENCV = 0 + +#Change the LIB_DIR to the path where the MODULES are located: +LIB_DIR = ../ +MODULES = atomorph.a + +SRC_FILES := $(wildcard *.cpp) +LIB_FILES := $(patsubst %,$(LIB_DIR)/lib%,$(MODULES)) +O_FILES := $(patsubst %.cpp,$(OBJ_DIR)/%.o,$(SRC_FILES)) + +OUT = ./$(NAME) + +all: + @printf "\033[0mHINT: On errors, try \033[1;33m-std=gnu++11 -stdlib=libc++\033[0m compiler flags.\033[0m\n" + @printf "\033[0mHINT: On linker errors, try \033[1;33mmake opencv\033[0m to link with OpenCV.\033[0m\n" + @$(MAKE) independently_linked -s + +opencv: + @$(MAKE) opencv_linked -s + +opencv_linked: L_FLAGS+= -lopencv_core -lopencv_flann +opencv_linked: $(O_FILES) + @printf "\033[1;33mMaking \033[37m ...." + $(CC) -o ./$(NAME) $(O_FILES) $(LIB_FILES) $(L_FLAGS) + @printf "\033[1;32m OpenCV dependent %s DONE!\033[0m\n" $(NAME) + +independently_linked: $(O_FILES) + @printf "\033[1;33mMaking \033[37m ...." + $(CC) -o ./$(NAME) $(O_FILES) $(LIB_FILES) $(L_FLAGS) + @printf "\033[1;32m %s DONE!\033[0m\n" $(NAME) + +$(OBJ_DIR)/%.o: %.cpp + @printf "\033[1m\033[31mCompiling \033[37m....\033[34m %-20s\t\033[33m%6s\033[31m lines\033[0m \n" $*.cpp "`wc -l $*.cpp | cut -f1 -d' '`" + @$(CC) $< $(DEFINES) $(C_FLAGS) -c -o $@ + +clean: + @printf "\033[1;36mCleaning \033[37m ...." + @rm -f $(O_FILES) $(OUT) *~ *.bak *.orig *.rej + @printf "\033[1;37m $(NAME) cleaned!\033[0m\n" diff --git a/demo/README b/demo/README new file mode 100644 index 0000000..8d285bd --- /dev/null +++ b/demo/README @@ -0,0 +1,12 @@ +Build instructions: + Run make in this folder. + Edit the Makefile if needed. + +Testing out AtoMorph: + See README in tests folder. + +For a graphical version of AtoMorph: + See README in allegro5 folder. + +If you like this software, please consider making a donation +by sending Bitcoins to 1Erich1YUdkUAp9ynf4Rfw2ug8nBtuUmMu. diff --git a/demo/allegro5/AtoMorph-GUI.cbp b/demo/allegro5/AtoMorph-GUI.cbp new file mode 100644 index 0000000..3a2dbf6 --- /dev/null +++ b/demo/allegro5/AtoMorph-GUI.cbp @@ -0,0 +1,48 @@ + + + + + + diff --git a/demo/allegro5/Makefile b/demo/allegro5/Makefile new file mode 100644 index 0000000..1da2c57 --- /dev/null +++ b/demo/allegro5/Makefile @@ -0,0 +1,44 @@ +NAME = atomorph-gui +CC = gcc +PROF = -O2 +C_FLAGS = -std=c++11 -Wall $(PROF) +L_FLAGS = ../../libatomorph.a -lm -lstdc++ $(PROF) +OBJ_DIR = obj +DEFINES = -D ATOMORPH_DEPRECATED + +#Change the LIB_DIR to the path where the MODULES are located: +LIB_DIR = /usr/lib/ +MODULES = allegro.so allegro_image.so allegro_font.so allegro_primitives.so + +SRC_FILES := $(wildcard *.cpp) +LIB_FILES := $(patsubst %,$(LIB_DIR)/lib%,$(MODULES)) +O_FILES := $(patsubst %.cpp,$(OBJ_DIR)/%.o,$(SRC_FILES)) + +OUT = ./$(NAME) + +all: + @printf "\033[0mHINT: libatomorph.a has to be compiled using the \033[1;33mmake deprecated\033[0m command.\033[0m\n" + @printf "\033[0mHINT: Use \033[1;33mmake static\033[0m to link statically.\033[0m\n" + @$(MAKE) dynamically_linked -s + +static: + @$(MAKE) statically_linked -s + +statically_linked: $(O_FILES) + @printf "\033[1;33mMaking \033[37m ...." + $(CC) -static -o ./$(NAME) $(O_FILES) $(LIB_FILES) $(L_FLAGS) + @printf "\033[1;32m Statically linked %s DONE!\033[0m\n" $(NAME) + +dynamically_linked: $(O_FILES) + @printf "\033[1;33mMaking \033[37m ...." + $(CC) -o ./$(NAME) $(O_FILES) $(LIB_FILES) $(L_FLAGS) + @printf "\033[1;32m Dynamically linked %s DONE!\033[0m\n" $(NAME) + +$(OBJ_DIR)/%.o: %.cpp + @printf "\033[1m\033[31mCompiling \033[37m....\033[34m %-20s\t\033[33m%6s\033[31m lines\033[0m \n" $*.cpp "`wc -l $*.cpp | cut -f1 -d' '`" + @$(CC) $< $(DEFINES) $(C_FLAGS) -c -o $@ + +clean: + @printf "\033[1;36mCleaning \033[37m ...." + @rm -f $(O_FILES) $(OUT) *~ *.bak *.orig *.rej + @printf "\033[1;37m $(NAME) cleaned!\033[0m\n" diff --git a/demo/allegro5/README b/demo/allegro5/README new file mode 100644 index 0000000..ff7ad76 --- /dev/null +++ b/demo/allegro5/README @@ -0,0 +1,15 @@ +This AtoMorph-GUI implementation is deprecated because it uses +an older version of the AtoMorph Library. The latter has to be +compiled using the `deprecated` build target. + +AtoMorph-GUI requires Allegro5.1 installed on your system. + +Build instructions: + Run make in this folder. + Edit the Makefile if needed. + +Alternative build instructions: + Use CodeBlocks and open AtoMorph-GUI.cbp. + +If you like this software, please consider making a donation +by sending Bitcoins to 1Erich1YUdkUAp9ynf4Rfw2ug8nBtuUmMu. diff --git a/demo/allegro5/data/fixed_font.tga b/demo/allegro5/data/fixed_font.tga new file mode 100755 index 0000000000000000000000000000000000000000..bc751239a6cb1a4df06e90213c242732d14bf0e0 GIT binary patch literal 25839 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 +#include + +#include "main.h" + +const float FPS = 60.0; // Maximum FPS. +const int SCREEN_W = 800; +const int SCREEN_H = 600; +const int MORPH_W = 128; // Width of the morph. Should be at most the width of the input image. +const int MORPH_H = 128; // Height of the morph. Should be at most the height of the input image. +const int ATOMS = 10000; // Number of atoms used in one thread. +const size_t THREAD_N = 5; // Number of threads to use to find a perfect morph. +const size_t SLOWNESS = 50; // How many frames to render per animation cycle. + +size_t morph_time = 0; +int view_frame = 0; +bool pressed_keys[ALLEGRO_KEY_MAX]; + +size_t active_thread = 0; // When render is ON, morph only one thread at a time. +int color_fade = AM_NONE; // Color interpolation method. +int trajectory = AM_NONE; // Atom trajectory interpolation method. +bool median_combining = false; // Noise reduction method. FALSE for averaging. +bool stop_morphing = false; // To halt the morph time temporarily. +bool no_render = false; // When TRUE no blending is done, just atom morphing. + +ALLEGRO_DISPLAY *display = NULL; +ALLEGRO_EVENT_QUEUE *event_queue = NULL; +ALLEGRO_TIMER *timer = NULL; +ALLEGRO_FONT *font = NULL; +ALLEGRO_BITMAP *morph_bmp = NULL; // Holds the final morph as a bitmap. +ALLEGRO_BITMAP *thread_bmp[THREAD_N]; // Holds the results of the morphing threads. + +// Helper function to initially populate the AM_SCENE object according to the provided +// image file. +bool fill_scene(AM_SCENE *scene, size_t frame, const char *png_file) { + std::random_device rd; + std::default_random_engine re(rd()); + std::uniform_real_distribution uniform_dist(0.0, 1.0); + + ALLEGRO_BITMAP * bmp = al_load_bitmap(png_file); + int bmp_w = al_get_bitmap_width(bmp); + int bmp_h = al_get_bitmap_height(bmp); + + al_lock_bitmap(bmp, ALLEGRO_PIXEL_FORMAT_ANY, ALLEGRO_LOCK_READONLY); + + for (int j=0; jpush_atom(frame, am_create_atom(px,py,r,g,b,a)); + } + } + + al_unlock_bitmap(bmp); + al_destroy_bitmap(bmp); + return true; +} + +int main(int argc, char **argv) { + if (!init(argc, argv)) { + fprintf(stderr, "Failed to initialize!\n"); + return -1; + } + + std::random_device rd; + std::default_random_engine seed_engine(rd()); + std::uniform_int_distribution uniform_dist(1, std::numeric_limits::max()); + + morph_bmp = al_create_bitmap(MORPH_W, MORPH_H); + al_set_target_bitmap(morph_bmp); + al_clear_to_color(al_map_rgba(0,0,0,0)); + + AM_BLENDER blender; // Used to combine the thread results into the final morph. + blender.set_resolution(MORPH_W, MORPH_H); + blender.set_median_combining(median_combining); + blender.start(); + + AM_THREAD scene_thread[THREAD_N]; // Each of these will morph its own version of the animation. + AM_SCENE scene_buf [THREAD_N]; // Temporarily holds the last results of the morphing threads. + AM_IMAGE image_buf [THREAD_N]; // Used to render the final image of the provided scene. + + { + AM_SCENE scene; // Needed temporarily to store the raw input data. + + scene.init(ATOMS, 6); // Reserve 6 frames for this scene. + fill_scene(&scene, 0, "../tests/data/battlelord_1.png"); + fill_scene(&scene, 1, "../tests/data/battlelord_2.png"); + fill_scene(&scene, 2, "../tests/data/battlelord_3.png"); + fill_scene(&scene, 3, "../tests/data/battlelord_4.png"); + fill_scene(&scene, 4, "../tests/data/battlelord_5.png"); + fill_scene(&scene, 5, "../tests/data/battlelord_6.png"); + + for (size_t i=0; ipixel_count(); + for (size_t i=0; iget_xy(i, &x, &y); + img->get_rgba(i, &r, &g, &b, &a); + + al_put_pixel(x, y, al_map_rgba(r,g,b,a)); + } + + // Finally unlock the bitmap: + if (lock) al_unlock_bitmap(to); +} + +void blend_morphs(AM_BLENDER *blender, ALLEGRO_BITMAP *to) { + // Clear old bitmap: + al_set_target_bitmap(to); + al_set_blender(ALLEGRO_DEST_MINUS_SRC, ALLEGRO_ALPHA, ALLEGRO_INVERSE_ALPHA); + al_draw_filled_rectangle(0.0, 0.0, MORPH_W, MORPH_H, al_map_rgba(0,0,0,255)); + + // Prepare to render: + al_set_blender(ALLEGRO_ADD, ALLEGRO_ALPHA, ALLEGRO_INVERSE_ALPHA); + ALLEGRO_LOCKED_REGION * lock = al_lock_bitmap(to,ALLEGRO_PIXEL_FORMAT_ANY,ALLEGRO_LOCK_READWRITE); + if (lock == NULL) return; + + // Put the pixels: + size_t pixels = blender->pixel_count(); + for (size_t i=0; iget_xy(i, &x, &y); + blender->get_rgba(i, &r, &g, &b, &a); + + al_put_pixel(x, y, al_map_rgba(r,g,b,a)); + } + + // Finally unlock the bitmap: + if (lock) al_unlock_bitmap(to); +} + +bool init(int argc, char **argv) { + if (true == (am_get_warning()&AM_WARN_POINTER_SIZE)) { + fprintf(stderr, "Pointer size is insufficiently small.\n"); + } + if (true == (am_get_warning()&AM_WARN_ATOM_SIZE)) { + fprintf(stderr, "Atom size (%lu) is larger than optimal (%lu).\n", + sizeof(AM_ATOM), + sizeof(void *) + ); + } + + if(!al_init()) { + fprintf(stderr, "failed to initialize allegro!\n"); + return false; + } + + if(!al_install_keyboard()) { + fprintf(stderr, "failed to initialize the keyboard!\n"); + return false; + } + + al_install_mouse(); + al_init_image_addon(); + al_init_font_addon(); + al_init_primitives_addon(); + + timer = al_create_timer(1.0 / FPS); + if(!timer) { + fprintf(stderr, "failed to create timer!\n"); + return false; + } + + display = al_create_display(SCREEN_W, SCREEN_H); + if(!display) { + fprintf(stderr, "failed to create display!\n"); + al_destroy_timer(timer); + return false; + } + + al_set_new_bitmap_flags(ALLEGRO_MAG_LINEAR|ALLEGRO_MIN_LINEAR); + + font = al_load_font("data/fixed_font.tga", 0, 0); + if (font==NULL) { + fprintf(stderr, "failed to load font!\n"); + al_destroy_display(display); + al_destroy_timer(timer); + return false; + } + + al_set_target_bitmap(al_get_backbuffer(display)); + + event_queue = al_create_event_queue(); + if(!event_queue) { + fprintf(stderr, "failed to create event_queue!\n"); + al_destroy_display(display); + al_destroy_timer(timer); + al_destroy_font(font); + return false; + } + + al_register_event_source(event_queue, al_get_display_event_source(display)); + al_register_event_source(event_queue, al_get_timer_event_source(timer)); + al_register_event_source(event_queue, al_get_keyboard_event_source()); + al_register_event_source(event_queue, al_get_mouse_event_source()); + + al_clear_to_color(al_map_rgb(0,0,0)); + al_draw_textf(font, al_map_rgb(0,255,0), SCREEN_W/2, SCREEN_H/2, + ALLEGRO_ALIGN_CENTRE, + "LOADING..."); + + al_flip_display(); + + al_start_timer(timer); + calculate_fps(); + + return true; +} + +int round_int( double r ) { + return (r > 0.0) ? (r + 0.5) : (r - 0.5); +} + +int calculate_fps() { + static int times = 0; + static double old_time = 0.0; + static double delta_sum = 0.0; + static int old_fps = -1; + + static bool first = true; + if (first) { + first = false; + old_time = al_get_time(); + return -1; + } + + int rec_times = 0; + int max_times = round_int(FPS); + double new_time = al_get_time(); + double delta = new_time - old_time; + delta_sum += delta; + old_time = new_time; + double p = delta_sum * max_times; + rec_times = round_int(p); + + if (times > rec_times) { + return -1; + } + times++; + + int fps = 0; + if (delta_sum >= 1.0 || times>=max_times) { + fps = times; + old_fps = fps; + times=0; + delta_sum=0.0; + } + else { + if (old_fps == -1) fps = times; + else fps = old_fps; + } + + return fps; +} diff --git a/demo/allegro5/main.h b/demo/allegro5/main.h new file mode 100644 index 0000000..3836b3a --- /dev/null +++ b/demo/allegro5/main.h @@ -0,0 +1,50 @@ +/* + * AtoMorph Demo - Simple Demo showing what AtoMorph is capable of doing. + * See Copyright Notice at the end of this file. + */ + +#include "../../atomorph.h" + +#include +#include +#include +#include +#include + +extern const float FPS; +extern const int SCREEN_W; +extern const int SCREEN_H; + +extern ALLEGRO_DISPLAY *display ; +extern ALLEGRO_EVENT_QUEUE *event_queue ; +extern ALLEGRO_TIMER *timer ; +extern ALLEGRO_FONT *font ; + +bool init(int argc, char **argv); +int calculate_fps(); +void draw(AM_SCENE *scene, ALLEGRO_BITMAP *to, double t, double weight); +void render_morph(AM_IMAGE *img, ALLEGRO_BITMAP *to); +void blend_morphs(AM_BLENDER *b, ALLEGRO_BITMAP *to); +/* +The MIT License (MIT) + +Copyright (c) 2013-2014 Erich Erstu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ diff --git a/demo/allegro5/obj/.gitignore b/demo/allegro5/obj/.gitignore new file mode 100644 index 0000000..5e7d273 --- /dev/null +++ b/demo/allegro5/obj/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore diff --git a/demo/lodepng.cpp b/demo/lodepng.cpp new file mode 100644 index 0000000..e4f35d7 --- /dev/null +++ b/demo/lodepng.cpp @@ -0,0 +1,6260 @@ +/* +LodePNG version 20131222 + +Copyright (c) 2005-2013 Lode Vandevenne + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ + +/* +The manual and changelog are in the header file "lodepng.h" +Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for C. +*/ + +#include "lodepng.h" + +#include +#include + +#ifdef LODEPNG_COMPILE_CPP +#include +#endif /*LODEPNG_COMPILE_CPP*/ + +#define VERSION_STRING "20131222" + +/* +This source file is built up in the following large parts. The code sections +with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way. +-Tools for C and common code for PNG and Zlib +-C Code for Zlib (huffman, deflate, ...) +-C Code for PNG (file format chunks, adam7, PNG filters, color conversions, ...) +-The C++ wrapper around all of the above +*/ + +/*The malloc, realloc and free functions defined here with "lodepng_" in front +of the name, so that you can easily change them to others related to your +platform if needed. Everything else in the code calls these. Pass +-DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler, or comment out +#define LODEPNG_COMPILE_ALLOCATORS in the header, to disable the ones here and +define them in your own project's source files without needing to change +lodepng source code. Don't forget to remove "static" if you copypaste them +from here.*/ + +#ifdef LODEPNG_COMPILE_ALLOCATORS +static void* lodepng_malloc(size_t size) +{ + return malloc(size); +} + +static void* lodepng_realloc(void* ptr, size_t new_size) +{ + return realloc(ptr, new_size); +} + +static void lodepng_free(void* ptr) +{ + free(ptr); +} +#else /*LODEPNG_COMPILE_ALLOCATORS*/ +void* lodepng_malloc(size_t size); +void* lodepng_realloc(void* ptr, size_t new_size); +void lodepng_free(void* ptr); +#endif /*LODEPNG_COMPILE_ALLOCATORS*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // Tools for C, and common code for PNG and Zlib. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/* +Often in case of an error a value is assigned to a variable and then it breaks +out of a loop (to go to the cleanup phase of a function). This macro does that. +It makes the error handling code shorter and more readable. + +Example: if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83); +*/ +#define CERROR_BREAK(errorvar, code)\ +{\ + errorvar = code;\ + break;\ +} + +/*version of CERROR_BREAK that assumes the common case where the error variable is named "error"*/ +#define ERROR_BREAK(code) CERROR_BREAK(error, code) + +/*Set error var to the error code, and return it.*/ +#define CERROR_RETURN_ERROR(errorvar, code)\ +{\ + errorvar = code;\ + return code;\ +} + +/*Try the code, if it returns error, also return the error.*/ +#define CERROR_TRY_RETURN(call)\ +{\ + unsigned error = call;\ + if(error) return error;\ +} + +/* +About uivector, ucvector and string: +-All of them wrap dynamic arrays or text strings in a similar way. +-LodePNG was originally written in C++. The vectors replace the std::vectors that were used in the C++ version. +-The string tools are made to avoid problems with compilers that declare things like strncat as deprecated. +-They're not used in the interface, only internally in this file as static functions. +-As with many other structs in this file, the init and cleanup functions serve as ctor and dtor. +*/ + +#ifdef LODEPNG_COMPILE_ZLIB +/*dynamic vector of unsigned ints*/ +typedef struct uivector +{ + unsigned* data; + size_t size; /*size in number of unsigned longs*/ + size_t allocsize; /*allocated size in bytes*/ +} uivector; + +static void uivector_cleanup(void* p) +{ + ((uivector*)p)->size = ((uivector*)p)->allocsize = 0; + lodepng_free(((uivector*)p)->data); + ((uivector*)p)->data = NULL; +} + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_resize(uivector* p, size_t size) +{ + if(size * sizeof(unsigned) > p->allocsize) + { + size_t newsize = size * sizeof(unsigned) * 2; + void* data = lodepng_realloc(p->data, newsize); + if(data) + { + p->allocsize = newsize; + p->data = (unsigned*)data; + p->size = size; + } + else return 0; + } + else p->size = size; + return 1; +} + +/*resize and give all new elements the value*/ +static unsigned uivector_resizev(uivector* p, size_t size, unsigned value) +{ + size_t oldsize = p->size, i; + if(!uivector_resize(p, size)) return 0; + for(i = oldsize; i < size; i++) p->data[i] = value; + return 1; +} + +static void uivector_init(uivector* p) +{ + p->data = NULL; + p->size = p->allocsize = 0; +} + +#ifdef LODEPNG_COMPILE_ENCODER +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_push_back(uivector* p, unsigned c) +{ + if(!uivector_resize(p, p->size + 1)) return 0; + p->data[p->size - 1] = c; + return 1; +} + +/*copy q to p, returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_copy(uivector* p, const uivector* q) +{ + size_t i; + if(!uivector_resize(p, q->size)) return 0; + for(i = 0; i < q->size; i++) p->data[i] = q->data[i]; + return 1; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_ZLIB*/ + +/* /////////////////////////////////////////////////////////////////////////// */ + +/*dynamic vector of unsigned chars*/ +typedef struct ucvector +{ + unsigned char* data; + size_t size; /*used size*/ + size_t allocsize; /*allocated size*/ +} ucvector; + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned ucvector_resize(ucvector* p, size_t size) +{ + if(size * sizeof(unsigned char) > p->allocsize) + { + size_t newsize = size * sizeof(unsigned char) * 2; + void* data = lodepng_realloc(p->data, newsize); + if(data) + { + p->allocsize = newsize; + p->data = (unsigned char*)data; + p->size = size; + } + else return 0; /*error: not enough memory*/ + } + else p->size = size; + return 1; +} + +#ifdef LODEPNG_COMPILE_PNG + +static void ucvector_cleanup(void* p) +{ + ((ucvector*)p)->size = ((ucvector*)p)->allocsize = 0; + lodepng_free(((ucvector*)p)->data); + ((ucvector*)p)->data = NULL; +} + +static void ucvector_init(ucvector* p) +{ + p->data = NULL; + p->size = p->allocsize = 0; +} + +#ifdef LODEPNG_COMPILE_DECODER +/*resize and give all new elements the value*/ +static unsigned ucvector_resizev(ucvector* p, size_t size, unsigned char value) +{ + size_t oldsize = p->size, i; + if(!ucvector_resize(p, size)) return 0; + for(i = oldsize; i < size; i++) p->data[i] = value; + return 1; +} +#endif /*LODEPNG_COMPILE_DECODER*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ZLIB +/*you can both convert from vector to buffer&size and vica versa. If you use +init_buffer to take over a buffer and size, it is not needed to use cleanup*/ +static void ucvector_init_buffer(ucvector* p, unsigned char* buffer, size_t size) +{ + p->data = buffer; + p->allocsize = p->size = size; +} +#endif /*LODEPNG_COMPILE_ZLIB*/ + +#if (defined(LODEPNG_COMPILE_PNG) && defined(LODEPNG_COMPILE_ANCILLARY_CHUNKS)) || defined(LODEPNG_COMPILE_ENCODER) +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned ucvector_push_back(ucvector* p, unsigned char c) +{ + if(!ucvector_resize(p, p->size + 1)) return 0; + p->data[p->size - 1] = c; + return 1; +} +#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ + + +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_PNG +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned string_resize(char** out, size_t size) +{ + char* data = (char*)lodepng_realloc(*out, size + 1); + if(data) + { + data[size] = 0; /*null termination char*/ + *out = data; + } + return data != 0; +} + +/*init a {char*, size_t} pair for use as string*/ +static void string_init(char** out) +{ + *out = NULL; + string_resize(out, 0); +} + +/*free the above pair again*/ +static void string_cleanup(char** out) +{ + lodepng_free(*out); + *out = NULL; +} + +static void string_set(char** out, const char* in) +{ + size_t insize = strlen(in), i = 0; + if(string_resize(out, insize)) + { + for(i = 0; i < insize; i++) + { + (*out)[i] = in[i]; + } + } +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +/* ////////////////////////////////////////////////////////////////////////// */ + +unsigned lodepng_read32bitInt(const unsigned char* buffer) +{ + return (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]; +} + +#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER) +/*buffer must have at least 4 allocated bytes available*/ +static void lodepng_set32bitInt(unsigned char* buffer, unsigned value) +{ + buffer[0] = (unsigned char)((value >> 24) & 0xff); + buffer[1] = (unsigned char)((value >> 16) & 0xff); + buffer[2] = (unsigned char)((value >> 8) & 0xff); + buffer[3] = (unsigned char)((value ) & 0xff); +} +#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ + +#ifdef LODEPNG_COMPILE_ENCODER +static void lodepng_add32bitInt(ucvector* buffer, unsigned value) +{ + ucvector_resize(buffer, buffer->size + 4); /*todo: give error if resize failed*/ + lodepng_set32bitInt(&buffer->data[buffer->size - 4], value); +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / File IO / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_DISK + +unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename) +{ + FILE* file; + long size; + + /*provide some proper output values if error will happen*/ + *out = 0; + *outsize = 0; + + file = fopen(filename, "rb"); + if(!file) return 78; + + /*get filesize:*/ + fseek(file , 0 , SEEK_END); + size = ftell(file); + rewind(file); + + /*read contents of the file into the vector*/ + *outsize = 0; + *out = (unsigned char*)lodepng_malloc((size_t)size); + if(size && (*out)) (*outsize) = fread(*out, 1, (size_t)size, file); + + fclose(file); + if(!(*out) && size) return 83; /*the above malloc failed*/ + return 0; +} + +/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ +unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename) +{ + FILE* file; + file = fopen(filename, "wb" ); + if(!file) return 79; + fwrite((char*)buffer , 1 , buffersize, file); + fclose(file); + return 0; +} + +#endif /*LODEPNG_COMPILE_DISK*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // End of common code and tools. Begin of Zlib related code. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_ENCODER +/*TODO: this ignores potential out of memory errors*/ +#define addBitToStream(/*size_t**/ bitpointer, /*ucvector**/ bitstream, /*unsigned char*/ bit)\ +{\ + /*add a new byte at the end*/\ + if(((*bitpointer) & 7) == 0) ucvector_push_back(bitstream, (unsigned char)0);\ + /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/\ + (bitstream->data[bitstream->size - 1]) |= (bit << ((*bitpointer) & 0x7));\ + (*bitpointer)++;\ +} + +static void addBitsToStream(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits) +{ + size_t i; + for(i = 0; i < nbits; i++) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> i) & 1)); +} + +static void addBitsToStreamReversed(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits) +{ + size_t i; + for(i = 0; i < nbits; i++) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> (nbits - 1 - i)) & 1)); +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +#define READBIT(bitpointer, bitstream) ((bitstream[bitpointer >> 3] >> (bitpointer & 0x7)) & (unsigned char)1) + +static unsigned char readBitFromStream(size_t* bitpointer, const unsigned char* bitstream) +{ + unsigned char result = (unsigned char)(READBIT(*bitpointer, bitstream)); + (*bitpointer)++; + return result; +} + +static unsigned readBitsFromStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) +{ + unsigned result = 0, i; + for(i = 0; i < nbits; i++) + { + result += ((unsigned)READBIT(*bitpointer, bitstream)) << i; + (*bitpointer)++; + } + return result; +} +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Deflate - Huffman / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#define FIRST_LENGTH_CODE_INDEX 257 +#define LAST_LENGTH_CODE_INDEX 285 +/*256 literals, the end code, some length codes, and 2 unused codes*/ +#define NUM_DEFLATE_CODE_SYMBOLS 288 +/*the distance codes have their own symbols, 30 used, 2 unused*/ +#define NUM_DISTANCE_SYMBOLS 32 +/*the code length codes. 0-15: code lengths, 16: copy previous 3-6 times, 17: 3-10 zeros, 18: 11-138 zeros*/ +#define NUM_CODE_LENGTH_CODES 19 + +/*the base lengths represented by codes 257-285*/ +static const unsigned LENGTHBASE[29] + = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, + 67, 83, 99, 115, 131, 163, 195, 227, 258}; + +/*the extra bits used by codes 257-285 (added to base length)*/ +static const unsigned LENGTHEXTRA[29] + = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, + 4, 4, 4, 4, 5, 5, 5, 5, 0}; + +/*the base backwards distances (the bits of distance codes appear after length codes and use their own huffman tree)*/ +static const unsigned DISTANCEBASE[30] + = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, + 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; + +/*the extra bits of backwards distances (added to base)*/ +static const unsigned DISTANCEEXTRA[30] + = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, + 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; + +/*the order in which "code length alphabet code lengths" are stored, out of this +the huffman tree of the dynamic huffman tree lengths is generated*/ +static const unsigned CLCL_ORDER[NUM_CODE_LENGTH_CODES] + = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + +/* ////////////////////////////////////////////////////////////////////////// */ + +/* +Huffman tree struct, containing multiple representations of the tree +*/ +typedef struct HuffmanTree +{ + unsigned* tree2d; + unsigned* tree1d; + unsigned* lengths; /*the lengths of the codes of the 1d-tree*/ + unsigned maxbitlen; /*maximum number of bits a single code can get*/ + unsigned numcodes; /*number of symbols in the alphabet = number of codes*/ +} HuffmanTree; + +/*function used for debug purposes to draw the tree in ascii art with C++*/ +/* +static void HuffmanTree_draw(HuffmanTree* tree) +{ + std::cout << "tree. length: " << tree->numcodes << " maxbitlen: " << tree->maxbitlen << std::endl; + for(size_t i = 0; i < tree->tree1d.size; i++) + { + if(tree->lengths.data[i]) + std::cout << i << " " << tree->tree1d.data[i] << " " << tree->lengths.data[i] << std::endl; + } + std::cout << std::endl; +}*/ + +static void HuffmanTree_init(HuffmanTree* tree) +{ + tree->tree2d = 0; + tree->tree1d = 0; + tree->lengths = 0; +} + +static void HuffmanTree_cleanup(HuffmanTree* tree) +{ + lodepng_free(tree->tree2d); + lodepng_free(tree->tree1d); + lodepng_free(tree->lengths); +} + +/*the tree representation used by the decoder. return value is error*/ +static unsigned HuffmanTree_make2DTree(HuffmanTree* tree) +{ + unsigned nodefilled = 0; /*up to which node it is filled*/ + unsigned treepos = 0; /*position in the tree (1 of the numcodes columns)*/ + unsigned n, i; + + tree->tree2d = (unsigned*)lodepng_malloc(tree->numcodes * 2 * sizeof(unsigned)); + if(!tree->tree2d) return 83; /*alloc fail*/ + + /* + convert tree1d[] to tree2d[][]. In the 2D array, a value of 32767 means + uninited, a value >= numcodes is an address to another bit, a value < numcodes + is a code. The 2 rows are the 2 possible bit values (0 or 1), there are as + many columns as codes - 1. + A good huffmann tree has N * 2 - 1 nodes, of which N - 1 are internal nodes. + Here, the internal nodes are stored (what their 0 and 1 option point to). + There is only memory for such good tree currently, if there are more nodes + (due to too long length codes), error 55 will happen + */ + for(n = 0; n < tree->numcodes * 2; n++) + { + tree->tree2d[n] = 32767; /*32767 here means the tree2d isn't filled there yet*/ + } + + for(n = 0; n < tree->numcodes; n++) /*the codes*/ + { + for(i = 0; i < tree->lengths[n]; i++) /*the bits for this code*/ + { + unsigned char bit = (unsigned char)((tree->tree1d[n] >> (tree->lengths[n] - i - 1)) & 1); + if(treepos > tree->numcodes - 2) return 55; /*oversubscribed, see comment in lodepng_error_text*/ + if(tree->tree2d[2 * treepos + bit] == 32767) /*not yet filled in*/ + { + if(i + 1 == tree->lengths[n]) /*last bit*/ + { + tree->tree2d[2 * treepos + bit] = n; /*put the current code in it*/ + treepos = 0; + } + else + { + /*put address of the next step in here, first that address has to be found of course + (it's just nodefilled + 1)...*/ + nodefilled++; + /*addresses encoded with numcodes added to it*/ + tree->tree2d[2 * treepos + bit] = nodefilled + tree->numcodes; + treepos = nodefilled; + } + } + else treepos = tree->tree2d[2 * treepos + bit] - tree->numcodes; + } + } + + for(n = 0; n < tree->numcodes * 2; n++) + { + if(tree->tree2d[n] == 32767) tree->tree2d[n] = 0; /*remove possible remaining 32767's*/ + } + + return 0; +} + +/* +Second step for the ...makeFromLengths and ...makeFromFrequencies functions. +numcodes, lengths and maxbitlen must already be filled in correctly. return +value is error. +*/ +static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) +{ + uivector blcount; + uivector nextcode; + unsigned bits, n, error = 0; + + uivector_init(&blcount); + uivector_init(&nextcode); + + tree->tree1d = (unsigned*)lodepng_malloc(tree->numcodes * sizeof(unsigned)); + if(!tree->tree1d) error = 83; /*alloc fail*/ + + if(!uivector_resizev(&blcount, tree->maxbitlen + 1, 0) + || !uivector_resizev(&nextcode, tree->maxbitlen + 1, 0)) + error = 83; /*alloc fail*/ + + if(!error) + { + /*step 1: count number of instances of each code length*/ + for(bits = 0; bits < tree->numcodes; bits++) blcount.data[tree->lengths[bits]]++; + /*step 2: generate the nextcode values*/ + for(bits = 1; bits <= tree->maxbitlen; bits++) + { + nextcode.data[bits] = (nextcode.data[bits - 1] + blcount.data[bits - 1]) << 1; + } + /*step 3: generate all the codes*/ + for(n = 0; n < tree->numcodes; n++) + { + if(tree->lengths[n] != 0) tree->tree1d[n] = nextcode.data[tree->lengths[n]]++; + } + } + + uivector_cleanup(&blcount); + uivector_cleanup(&nextcode); + + if(!error) return HuffmanTree_make2DTree(tree); + else return error; +} + +/* +given the code lengths (as stored in the PNG file), generate the tree as defined +by Deflate. maxbitlen is the maximum bits that a code in the tree can have. +return value is error. +*/ +static unsigned HuffmanTree_makeFromLengths(HuffmanTree* tree, const unsigned* bitlen, + size_t numcodes, unsigned maxbitlen) +{ + unsigned i; + tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned)); + if(!tree->lengths) return 83; /*alloc fail*/ + for(i = 0; i < numcodes; i++) tree->lengths[i] = bitlen[i]; + tree->numcodes = (unsigned)numcodes; /*number of symbols*/ + tree->maxbitlen = maxbitlen; + return HuffmanTree_makeFromLengths2(tree); +} + +#ifdef LODEPNG_COMPILE_ENCODER + +/* +A coin, this is the terminology used for the package-merge algorithm and the +coin collector's problem. This is used to generate the huffman tree. +A coin can be multiple coins (when they're merged) +*/ +typedef struct Coin +{ + uivector symbols; + float weight; /*the sum of all weights in this coin*/ +} Coin; + +static void coin_init(Coin* c) +{ + uivector_init(&c->symbols); +} + +/*argument c is void* so that this dtor can be given as function pointer to the vector resize function*/ +static void coin_cleanup(void* c) +{ + uivector_cleanup(&((Coin*)c)->symbols); +} + +static void coin_copy(Coin* c1, const Coin* c2) +{ + c1->weight = c2->weight; + uivector_copy(&c1->symbols, &c2->symbols); +} + +static void add_coins(Coin* c1, const Coin* c2) +{ + size_t i; + for(i = 0; i < c2->symbols.size; i++) uivector_push_back(&c1->symbols, c2->symbols.data[i]); + c1->weight += c2->weight; +} + +static void init_coins(Coin* coins, size_t num) +{ + size_t i; + for(i = 0; i < num; i++) coin_init(&coins[i]); +} + +static void cleanup_coins(Coin* coins, size_t num) +{ + size_t i; + for(i = 0; i < num; i++) coin_cleanup(&coins[i]); +} + +static int coin_compare(const void* a, const void* b) { + float wa = ((const Coin*)a)->weight; + float wb = ((const Coin*)b)->weight; + return wa > wb ? 1 : wa < wb ? -1 : 0; +} + +static unsigned append_symbol_coins(Coin* coins, const unsigned* frequencies, unsigned numcodes, size_t sum) +{ + unsigned i; + unsigned j = 0; /*index of present symbols*/ + for(i = 0; i < numcodes; i++) + { + if(frequencies[i] != 0) /*only include symbols that are present*/ + { + coins[j].weight = frequencies[i] / (float)sum; + uivector_push_back(&coins[j].symbols, i); + j++; + } + } + return 0; +} + +unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, + size_t numcodes, unsigned maxbitlen) +{ + unsigned i, j; + size_t sum = 0, numpresent = 0; + unsigned error = 0; + Coin* coins; /*the coins of the currently calculated row*/ + Coin* prev_row; /*the previous row of coins*/ + unsigned numcoins; + unsigned coinmem; + + if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/ + + for(i = 0; i < numcodes; i++) + { + if(frequencies[i] > 0) + { + numpresent++; + sum += frequencies[i]; + } + } + + for(i = 0; i < numcodes; i++) lengths[i] = 0; + + /*ensure at least two present symbols. There should be at least one symbol + according to RFC 1951 section 3.2.7. To decoders incorrectly require two. To + make these work as well ensure there are at least two symbols. The + Package-Merge code below also doesn't work correctly if there's only one + symbol, it'd give it the theoritical 0 bits but in practice zlib wants 1 bit*/ + if(numpresent == 0) + { + lengths[0] = lengths[1] = 1; /*note that for RFC 1951 section 3.2.7, only lengths[0] = 1 is needed*/ + } + else if(numpresent == 1) + { + for(i = 0; i < numcodes; i++) + { + if(frequencies[i]) + { + lengths[i] = 1; + lengths[i == 0 ? 1 : 0] = 1; + break; + } + } + } + else + { + /*Package-Merge algorithm represented by coin collector's problem + For every symbol, maxbitlen coins will be created*/ + + coinmem = numpresent * 2; /*max amount of coins needed with the current algo*/ + coins = (Coin*)lodepng_malloc(sizeof(Coin) * coinmem); + prev_row = (Coin*)lodepng_malloc(sizeof(Coin) * coinmem); + if(!coins || !prev_row) + { + lodepng_free(coins); + lodepng_free(prev_row); + return 83; /*alloc fail*/ + } + init_coins(coins, coinmem); + init_coins(prev_row, coinmem); + + /*first row, lowest denominator*/ + error = append_symbol_coins(coins, frequencies, numcodes, sum); + numcoins = numpresent; + qsort(coins, numcoins, sizeof(Coin), coin_compare); + if(!error) + { + unsigned numprev = 0; + for(j = 1; j <= maxbitlen && !error; j++) /*each of the remaining rows*/ + { + unsigned tempnum; + Coin* tempcoins; + /*swap prev_row and coins, and their amounts*/ + tempcoins = prev_row; prev_row = coins; coins = tempcoins; + tempnum = numprev; numprev = numcoins; numcoins = tempnum; + + cleanup_coins(coins, numcoins); + init_coins(coins, numcoins); + + numcoins = 0; + + /*fill in the merged coins of the previous row*/ + for(i = 0; i + 1 < numprev; i += 2) + { + /*merge prev_row[i] and prev_row[i + 1] into new coin*/ + Coin* coin = &coins[numcoins++]; + coin_copy(coin, &prev_row[i]); + add_coins(coin, &prev_row[i + 1]); + } + /*fill in all the original symbols again*/ + if(j < maxbitlen) + { + error = append_symbol_coins(coins + numcoins, frequencies, numcodes, sum); + numcoins += numpresent; + } + qsort(coins, numcoins, sizeof(Coin), coin_compare); + } + } + + if(!error) + { + /*calculate the lenghts of each symbol, as the amount of times a coin of each symbol is used*/ + for(i = 0; i < numpresent - 1; i++) + { + Coin* coin = &coins[i]; + for(j = 0; j < coin->symbols.size; j++) lengths[coin->symbols.data[j]]++; + } + } + + cleanup_coins(coins, coinmem); + lodepng_free(coins); + cleanup_coins(prev_row, coinmem); + lodepng_free(prev_row); + } + + return error; +} + +/*Create the Huffman tree given the symbol frequencies*/ +static unsigned HuffmanTree_makeFromFrequencies(HuffmanTree* tree, const unsigned* frequencies, + size_t mincodes, size_t numcodes, unsigned maxbitlen) +{ + unsigned error = 0; + while(!frequencies[numcodes - 1] && numcodes > mincodes) numcodes--; /*trim zeroes*/ + tree->maxbitlen = maxbitlen; + tree->numcodes = (unsigned)numcodes; /*number of symbols*/ + tree->lengths = (unsigned*)lodepng_realloc(tree->lengths, numcodes * sizeof(unsigned)); + if(!tree->lengths) return 83; /*alloc fail*/ + /*initialize all lengths to 0*/ + memset(tree->lengths, 0, numcodes * sizeof(unsigned)); + + error = lodepng_huffman_code_lengths(tree->lengths, frequencies, numcodes, maxbitlen); + if(!error) error = HuffmanTree_makeFromLengths2(tree); + return error; +} + +static unsigned HuffmanTree_getCode(const HuffmanTree* tree, unsigned index) +{ + return tree->tree1d[index]; +} + +static unsigned HuffmanTree_getLength(const HuffmanTree* tree, unsigned index) +{ + return tree->lengths[index]; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/*get the literal and length code tree of a deflated block with fixed tree, as per the deflate specification*/ +static unsigned generateFixedLitLenTree(HuffmanTree* tree) +{ + unsigned i, error = 0; + unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); + if(!bitlen) return 83; /*alloc fail*/ + + /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/ + for(i = 0; i <= 143; i++) bitlen[i] = 8; + for(i = 144; i <= 255; i++) bitlen[i] = 9; + for(i = 256; i <= 279; i++) bitlen[i] = 7; + for(i = 280; i <= 287; i++) bitlen[i] = 8; + + error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DEFLATE_CODE_SYMBOLS, 15); + + lodepng_free(bitlen); + return error; +} + +/*get the distance code tree of a deflated block with fixed tree, as specified in the deflate specification*/ +static unsigned generateFixedDistanceTree(HuffmanTree* tree) +{ + unsigned i, error = 0; + unsigned* bitlen = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); + if(!bitlen) return 83; /*alloc fail*/ + + /*there are 32 distance codes, but 30-31 are unused*/ + for(i = 0; i < NUM_DISTANCE_SYMBOLS; i++) bitlen[i] = 5; + error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DISTANCE_SYMBOLS, 15); + + lodepng_free(bitlen); + return error; +} + +#ifdef LODEPNG_COMPILE_DECODER + +/* +returns the code, or (unsigned)(-1) if error happened +inbitlength is the length of the complete buffer, in bits (so its byte length times 8) +*/ +static unsigned huffmanDecodeSymbol(const unsigned char* in, size_t* bp, + const HuffmanTree* codetree, size_t inbitlength) +{ + unsigned treepos = 0, ct; + for(;;) + { + if(*bp >= inbitlength) return (unsigned)(-1); /*error: end of input memory reached without endcode*/ + /* + decode the symbol from the tree. The "readBitFromStream" code is inlined in + the expression below because this is the biggest bottleneck while decoding + */ + ct = codetree->tree2d[(treepos << 1) + READBIT(*bp, in)]; + (*bp)++; + if(ct < codetree->numcodes) return ct; /*the symbol is decoded, return it*/ + else treepos = ct - codetree->numcodes; /*symbol not yet decoded, instead move tree position*/ + + if(treepos >= codetree->numcodes) return (unsigned)(-1); /*error: it appeared outside the codetree*/ + } +} +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Inflator (Decompressor) / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*get the tree of a deflated block with fixed tree, as specified in the deflate specification*/ +static void getTreeInflateFixed(HuffmanTree* tree_ll, HuffmanTree* tree_d) +{ + /*TODO: check for out of memory errors*/ + generateFixedLitLenTree(tree_ll); + generateFixedDistanceTree(tree_d); +} + +/*get the tree of a deflated block with dynamic tree, the tree itself is also Huffman compressed with a known tree*/ +static unsigned getTreeInflateDynamic(HuffmanTree* tree_ll, HuffmanTree* tree_d, + const unsigned char* in, size_t* bp, size_t inlength) +{ + /*make sure that length values that aren't filled in will be 0, or a wrong tree will be generated*/ + unsigned error = 0; + unsigned n, HLIT, HDIST, HCLEN, i; + size_t inbitlength = inlength * 8; + + /*see comments in deflateDynamic for explanation of the context and these variables, it is analogous*/ + unsigned* bitlen_ll = 0; /*lit,len code lengths*/ + unsigned* bitlen_d = 0; /*dist code lengths*/ + /*code length code lengths ("clcl"), the bit lengths of the huffman tree used to compress bitlen_ll and bitlen_d*/ + unsigned* bitlen_cl = 0; + HuffmanTree tree_cl; /*the code tree for code length codes (the huffman tree for compressed huffman trees)*/ + + if((*bp) >> 3 >= inlength - 2) return 49; /*error: the bit pointer is or will go past the memory*/ + + /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/ + HLIT = readBitsFromStream(bp, in, 5) + 257; + /*number of distance codes. Unlike the spec, the value 1 is added to it here already*/ + HDIST = readBitsFromStream(bp, in, 5) + 1; + /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/ + HCLEN = readBitsFromStream(bp, in, 4) + 4; + + HuffmanTree_init(&tree_cl); + + while(!error) + { + /*read the code length codes out of 3 * (amount of code length codes) bits*/ + + bitlen_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(unsigned)); + if(!bitlen_cl) ERROR_BREAK(83 /*alloc fail*/); + + for(i = 0; i < NUM_CODE_LENGTH_CODES; i++) + { + if(i < HCLEN) bitlen_cl[CLCL_ORDER[i]] = readBitsFromStream(bp, in, 3); + else bitlen_cl[CLCL_ORDER[i]] = 0; /*if not, it must stay 0*/ + } + + error = HuffmanTree_makeFromLengths(&tree_cl, bitlen_cl, NUM_CODE_LENGTH_CODES, 7); + if(error) break; + + /*now we can use this tree to read the lengths for the tree that this function will return*/ + bitlen_ll = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); + bitlen_d = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); + if(!bitlen_ll || !bitlen_d) ERROR_BREAK(83 /*alloc fail*/); + for(i = 0; i < NUM_DEFLATE_CODE_SYMBOLS; i++) bitlen_ll[i] = 0; + for(i = 0; i < NUM_DISTANCE_SYMBOLS; i++) bitlen_d[i] = 0; + + /*i is the current symbol we're reading in the part that contains the code lengths of lit/len and dist codes*/ + i = 0; + while(i < HLIT + HDIST) + { + unsigned code = huffmanDecodeSymbol(in, bp, &tree_cl, inbitlength); + if(code <= 15) /*a length code*/ + { + if(i < HLIT) bitlen_ll[i] = code; + else bitlen_d[i - HLIT] = code; + i++; + } + else if(code == 16) /*repeat previous*/ + { + unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/ + unsigned value; /*set value to the previous code*/ + + if(*bp >= inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ + if (i == 0) ERROR_BREAK(54); /*can't repeat previous if i is 0*/ + + replength += readBitsFromStream(bp, in, 2); + + if(i < HLIT + 1) value = bitlen_ll[i - 1]; + else value = bitlen_d[i - HLIT - 1]; + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; n++) + { + if(i >= HLIT + HDIST) ERROR_BREAK(13); /*error: i is larger than the amount of codes*/ + if(i < HLIT) bitlen_ll[i] = value; + else bitlen_d[i - HLIT] = value; + i++; + } + } + else if(code == 17) /*repeat "0" 3-10 times*/ + { + unsigned replength = 3; /*read in the bits that indicate repeat length*/ + if(*bp >= inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ + + replength += readBitsFromStream(bp, in, 3); + + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; n++) + { + if(i >= HLIT + HDIST) ERROR_BREAK(14); /*error: i is larger than the amount of codes*/ + + if(i < HLIT) bitlen_ll[i] = 0; + else bitlen_d[i - HLIT] = 0; + i++; + } + } + else if(code == 18) /*repeat "0" 11-138 times*/ + { + unsigned replength = 11; /*read in the bits that indicate repeat length*/ + if(*bp >= inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ + + replength += readBitsFromStream(bp, in, 7); + + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; n++) + { + if(i >= HLIT + HDIST) ERROR_BREAK(15); /*error: i is larger than the amount of codes*/ + + if(i < HLIT) bitlen_ll[i] = 0; + else bitlen_d[i - HLIT] = 0; + i++; + } + } + else /*if(code == (unsigned)(-1))*/ /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ + { + if(code == (unsigned)(-1)) + { + /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol + (10=no endcode, 11=wrong jump outside of tree)*/ + error = (*bp) > inbitlength ? 10 : 11; + } + else error = 16; /*unexisting code, this can never happen*/ + break; + } + } + if(error) break; + + if(bitlen_ll[256] == 0) ERROR_BREAK(64); /*the length of the end code 256 must be larger than 0*/ + + /*now we've finally got HLIT and HDIST, so generate the code trees, and the function is done*/ + error = HuffmanTree_makeFromLengths(tree_ll, bitlen_ll, NUM_DEFLATE_CODE_SYMBOLS, 15); + if(error) break; + error = HuffmanTree_makeFromLengths(tree_d, bitlen_d, NUM_DISTANCE_SYMBOLS, 15); + + break; /*end of error-while*/ + } + + lodepng_free(bitlen_cl); + lodepng_free(bitlen_ll); + lodepng_free(bitlen_d); + HuffmanTree_cleanup(&tree_cl); + + return error; +} + +/*inflate a block with dynamic of fixed Huffman tree*/ +static unsigned inflateHuffmanBlock(ucvector* out, const unsigned char* in, size_t* bp, + size_t* pos, size_t inlength, unsigned btype) +{ + unsigned error = 0; + HuffmanTree tree_ll; /*the huffman tree for literal and length codes*/ + HuffmanTree tree_d; /*the huffman tree for distance codes*/ + size_t inbitlength = inlength * 8; + + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + + if(btype == 1) getTreeInflateFixed(&tree_ll, &tree_d); + else if(btype == 2) error = getTreeInflateDynamic(&tree_ll, &tree_d, in, bp, inlength); + + while(!error) /*decode all symbols until end reached, breaks at end code*/ + { + /*code_ll is literal, length or end code*/ + unsigned code_ll = huffmanDecodeSymbol(in, bp, &tree_ll, inbitlength); + if(code_ll <= 255) /*literal symbol*/ + { + if((*pos) >= out->size) + { + /*reserve more room at once*/ + if(!ucvector_resize(out, ((*pos) + 1) * 2)) ERROR_BREAK(83 /*alloc fail*/); + } + out->data[(*pos)] = (unsigned char)(code_ll); + (*pos)++; + } + else if(code_ll >= FIRST_LENGTH_CODE_INDEX && code_ll <= LAST_LENGTH_CODE_INDEX) /*length code*/ + { + unsigned code_d, distance; + unsigned numextrabits_l, numextrabits_d; /*extra bits for length and distance*/ + size_t start, forward, backward, length; + + /*part 1: get length base*/ + length = LENGTHBASE[code_ll - FIRST_LENGTH_CODE_INDEX]; + + /*part 2: get extra bits and add the value of that to length*/ + numextrabits_l = LENGTHEXTRA[code_ll - FIRST_LENGTH_CODE_INDEX]; + if(*bp >= inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/ + length += readBitsFromStream(bp, in, numextrabits_l); + + /*part 3: get distance code*/ + code_d = huffmanDecodeSymbol(in, bp, &tree_d, inbitlength); + if(code_d > 29) + { + if(code_ll == (unsigned)(-1)) /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ + { + /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol + (10=no endcode, 11=wrong jump outside of tree)*/ + error = (*bp) > inlength * 8 ? 10 : 11; + } + else error = 18; /*error: invalid distance code (30-31 are never used)*/ + break; + } + distance = DISTANCEBASE[code_d]; + + /*part 4: get extra bits from distance*/ + numextrabits_d = DISTANCEEXTRA[code_d]; + if(*bp >= inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/ + + distance += readBitsFromStream(bp, in, numextrabits_d); + + /*part 5: fill in all the out[n] values based on the length and dist*/ + start = (*pos); + if(distance > start) ERROR_BREAK(52); /*too long backward distance*/ + backward = start - distance; + if((*pos) + length >= out->size) + { + /*reserve more room at once*/ + if(!ucvector_resize(out, ((*pos) + length) * 2)) ERROR_BREAK(83 /*alloc fail*/); + } + + for(forward = 0; forward < length; forward++) + { + out->data[(*pos)] = out->data[backward]; + (*pos)++; + backward++; + if(backward >= start) backward = start - distance; + } + } + else if(code_ll == 256) + { + break; /*end code, break the loop*/ + } + else /*if(code == (unsigned)(-1))*/ /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ + { + /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol + (10=no endcode, 11=wrong jump outside of tree)*/ + error = (*bp) > inlength * 8 ? 10 : 11; + break; + } + } + + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + + return error; +} + +static unsigned inflateNoCompression(ucvector* out, const unsigned char* in, size_t* bp, size_t* pos, size_t inlength) +{ + /*go to first boundary of byte*/ + size_t p; + unsigned LEN, NLEN, n, error = 0; + while(((*bp) & 0x7) != 0) (*bp)++; + p = (*bp) / 8; /*byte position*/ + + /*read LEN (2 bytes) and NLEN (2 bytes)*/ + if(p >= inlength - 4) return 52; /*error, bit pointer will jump past memory*/ + LEN = in[p] + 256 * in[p + 1]; p += 2; + NLEN = in[p] + 256 * in[p + 1]; p += 2; + + /*check if 16-bit NLEN is really the one's complement of LEN*/ + if(LEN + NLEN != 65535) return 21; /*error: NLEN is not one's complement of LEN*/ + + if((*pos) + LEN >= out->size) + { + if(!ucvector_resize(out, (*pos) + LEN)) return 83; /*alloc fail*/ + } + + /*read the literal data: LEN bytes are now stored in the out buffer*/ + if(p + LEN > inlength) return 23; /*error: reading outside of in buffer*/ + for(n = 0; n < LEN; n++) out->data[(*pos)++] = in[p++]; + + (*bp) = p * 8; + + return error; +} + +static unsigned lodepng_inflatev(ucvector* out, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings) +{ + /*bit pointer in the "in" data, current byte is bp >> 3, current bit is bp & 0x7 (from lsb to msb of the byte)*/ + size_t bp = 0; + unsigned BFINAL = 0; + size_t pos = 0; /*byte position in the out buffer*/ + + unsigned error = 0; + + (void)settings; + + while(!BFINAL) + { + unsigned BTYPE; + if(bp + 2 >= insize * 8) return 52; /*error, bit pointer will jump past memory*/ + BFINAL = readBitFromStream(&bp, in); + BTYPE = 1 * readBitFromStream(&bp, in); + BTYPE += 2 * readBitFromStream(&bp, in); + + if(BTYPE == 3) return 20; /*error: invalid BTYPE*/ + else if(BTYPE == 0) error = inflateNoCompression(out, in, &bp, &pos, insize); /*no compression*/ + else error = inflateHuffmanBlock(out, in, &bp, &pos, insize, BTYPE); /*compression, BTYPE 01 or 10*/ + + if(error) return error; + } + + /*Only now we know the true size of out, resize it to that*/ + if(!ucvector_resize(out, pos)) error = 83; /*alloc fail*/ + + return error; +} + +unsigned lodepng_inflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings) +{ + unsigned error; + ucvector v; + ucvector_init_buffer(&v, *out, *outsize); + error = lodepng_inflatev(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + return error; +} + +static unsigned inflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings) +{ + if(settings->custom_inflate) + { + return settings->custom_inflate(out, outsize, in, insize, settings); + } + else + { + return lodepng_inflate(out, outsize, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Deflator (Compressor) / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static const size_t MAX_SUPPORTED_DEFLATE_LENGTH = 258; + +/*bitlen is the size in bits of the code*/ +static void addHuffmanSymbol(size_t* bp, ucvector* compressed, unsigned code, unsigned bitlen) +{ + addBitsToStreamReversed(bp, compressed, code, bitlen); +} + +/*search the index in the array, that has the largest value smaller than or equal to the given value, +given array must be sorted (if no value is smaller, it returns the size of the given array)*/ +static size_t searchCodeIndex(const unsigned* array, size_t array_size, size_t value) +{ + /*linear search implementation*/ + /*for(size_t i = 1; i < array_size; i++) if(array[i] > value) return i - 1; + return array_size - 1;*/ + + /*binary search implementation (not that much faster) (precondition: array_size > 0)*/ + size_t left = 1; + size_t right = array_size - 1; + while(left <= right) + { + size_t mid = (left + right) / 2; + if(array[mid] <= value) left = mid + 1; /*the value to find is more to the right*/ + else if(array[mid - 1] > value) right = mid - 1; /*the value to find is more to the left*/ + else return mid - 1; + } + return array_size - 1; +} + +static void addLengthDistance(uivector* values, size_t length, size_t distance) +{ + /*values in encoded vector are those used by deflate: + 0-255: literal bytes + 256: end + 257-285: length/distance pair (length code, followed by extra length bits, distance code, extra distance bits) + 286-287: invalid*/ + + unsigned length_code = (unsigned)searchCodeIndex(LENGTHBASE, 29, length); + unsigned extra_length = (unsigned)(length - LENGTHBASE[length_code]); + unsigned dist_code = (unsigned)searchCodeIndex(DISTANCEBASE, 30, distance); + unsigned extra_distance = (unsigned)(distance - DISTANCEBASE[dist_code]); + + uivector_push_back(values, length_code + FIRST_LENGTH_CODE_INDEX); + uivector_push_back(values, extra_length); + uivector_push_back(values, dist_code); + uivector_push_back(values, extra_distance); +} + +static const unsigned HASH_BIT_MASK = 65535; +static const unsigned HASH_NUM_VALUES = 65536; +static const unsigned HASH_NUM_CHARACTERS = 3; +static const unsigned HASH_SHIFT = 2; +/* +The HASH_NUM_CHARACTERS value is used to make encoding faster by using longer +sequences to generate a hash value from the stream bytes. Setting it to 3 +gives exactly the same compression as the brute force method, since deflate's +run length encoding starts with lengths of 3. Setting it to higher values, +like 6, can make the encoding faster (not always though!), but will cause the +encoding to miss any length between 3 and this value, so that the compression +may be worse (but this can vary too depending on the image, sometimes it is +even a bit better instead). +The HASH_NUM_VALUES is the amount of unique possible hash values that +combinations of bytes can give, the higher it is the more memory is needed, but +if it's too low the advantage of hashing is gone. +*/ + +typedef struct Hash +{ + int* head; /*hash value to head circular pos*/ + int* val; /*circular pos to hash value*/ + /*circular pos to prev circular pos*/ + unsigned short* chain; + unsigned short* zeros; +} Hash; + +static unsigned hash_init(Hash* hash, unsigned windowsize) +{ + unsigned i; + hash->head = (int*)lodepng_malloc(sizeof(int) * HASH_NUM_VALUES); + hash->val = (int*)lodepng_malloc(sizeof(int) * windowsize); + hash->chain = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); + hash->zeros = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); + + if(!hash->head || !hash->val || !hash->chain || !hash->zeros) return 83; /*alloc fail*/ + + /*initialize hash table*/ + for(i = 0; i < HASH_NUM_VALUES; i++) hash->head[i] = -1; + for(i = 0; i < windowsize; i++) hash->val[i] = -1; + for(i = 0; i < windowsize; i++) hash->chain[i] = i; /*same value as index indicates uninitialized*/ + + return 0; +} + +static void hash_cleanup(Hash* hash) +{ + lodepng_free(hash->head); + lodepng_free(hash->val); + lodepng_free(hash->chain); + lodepng_free(hash->zeros); +} + +static unsigned getHash(const unsigned char* data, size_t size, size_t pos) +{ + unsigned result = 0; + if (HASH_NUM_CHARACTERS == 3 && pos + 2 < size) { + result ^= (data[pos + 0] << (0 * HASH_SHIFT)); + result ^= (data[pos + 1] << (1 * HASH_SHIFT)); + result ^= (data[pos + 2] << (2 * HASH_SHIFT)); + } else { + size_t amount, i; + if(pos >= size) return 0; + amount = HASH_NUM_CHARACTERS; + if(pos + amount >= size) amount = size - pos; + for(i = 0; i < amount; i++) result ^= (data[pos + i] << (i * HASH_SHIFT)); + } + return result & HASH_BIT_MASK; +} + +static unsigned countZeros(const unsigned char* data, size_t size, size_t pos) +{ + const unsigned char* start = data + pos; + const unsigned char* end = start + MAX_SUPPORTED_DEFLATE_LENGTH; + if(end > data + size) end = data + size; + data = start; + while (data != end && *data == 0) data++; + /*subtracting two addresses returned as 32-bit number (max value is MAX_SUPPORTED_DEFLATE_LENGTH)*/ + return (unsigned)(data - start); +} + +/*wpos = pos & (windowsize - 1)*/ +static void updateHashChain(Hash* hash, size_t wpos, int hashval) +{ + hash->val[wpos] = hashval; + if(hash->head[hashval] != -1) hash->chain[wpos] = hash->head[hashval]; + hash->head[hashval] = wpos; +} + +/* +LZ77-encode the data. Return value is error code. The input are raw bytes, the output +is in the form of unsigned integers with codes representing for example literal bytes, or +length/distance pairs. +It uses a hash table technique to let it encode faster. When doing LZ77 encoding, a +sliding window (of windowsize) is used, and all past bytes in that window can be used as +the "dictionary". A brute force search through all possible distances would be slow, and +this hash technique is one out of several ways to speed this up. +*/ +static unsigned encodeLZ77(uivector* out, Hash* hash, + const unsigned char* in, size_t inpos, size_t insize, unsigned windowsize, + unsigned minmatch, unsigned nicematch, unsigned lazymatching) +{ + unsigned pos, i, error = 0; + /*for large window lengths, assume the user wants no compression loss. Otherwise, max hash chain length speedup.*/ + unsigned maxchainlength = windowsize >= 8192 ? windowsize : windowsize / 8; + unsigned maxlazymatch = windowsize >= 8192 ? MAX_SUPPORTED_DEFLATE_LENGTH : 64; + + unsigned usezeros = 1; /*not sure if setting it to false for windowsize < 8192 is better or worse*/ + unsigned numzeros = 0; + + unsigned offset; /*the offset represents the distance in LZ77 terminology*/ + unsigned length; + unsigned lazy = 0; + unsigned lazylength = 0, lazyoffset = 0; + unsigned hashval; + unsigned current_offset, current_length; + const unsigned char *lastptr, *foreptr, *backptr; + unsigned hashpos, prevpos; + + if(windowsize <= 0 || windowsize > 32768) return 60; /*error: windowsize smaller/larger than allowed*/ + if((windowsize & (windowsize - 1)) != 0) return 90; /*error: must be power of two*/ + + if(nicematch > MAX_SUPPORTED_DEFLATE_LENGTH) nicematch = MAX_SUPPORTED_DEFLATE_LENGTH; + + for(pos = inpos; pos < insize; pos++) + { + size_t wpos = pos & (windowsize - 1); /*position for in 'circular' hash buffers*/ + unsigned chainlength = 0; + + hashval = getHash(in, insize, pos); + updateHashChain(hash, wpos, hashval); + + if(usezeros && hashval == 0) + { + if (numzeros == 0) numzeros = countZeros(in, insize, pos); + else if (pos + numzeros >= insize || in[pos + numzeros - 1] != 0) numzeros--; + hash->zeros[wpos] = numzeros; + } + else + { + numzeros = 0; + } + + /*the length and offset found for the current position*/ + length = 0; + offset = 0; + + prevpos = hash->head[hashval]; + hashpos = hash->chain[prevpos]; + + lastptr = &in[insize < pos + MAX_SUPPORTED_DEFLATE_LENGTH ? insize : pos + MAX_SUPPORTED_DEFLATE_LENGTH]; + + /*search for the longest string*/ + for(;;) + { + /*stop when went completely around the circular buffer*/ + if(prevpos < wpos && hashpos > prevpos && hashpos <= wpos) break; + if(prevpos > wpos && (hashpos <= wpos || hashpos > prevpos)) break; + if(chainlength++ >= maxchainlength) break; + + current_offset = hashpos <= wpos ? wpos - hashpos : wpos - hashpos + windowsize; + if(current_offset > 0) + { + /*test the next characters*/ + foreptr = &in[pos]; + backptr = &in[pos - current_offset]; + + /*common case in PNGs is lots of zeros. Quickly skip over them as a speedup*/ + if(usezeros && hashval == 0 && hash->val[hashpos] == 0 /*hashval[hashpos] may be out of date*/) + { + unsigned skip = hash->zeros[hashpos]; + if(skip > numzeros) skip = numzeros; + backptr += skip; + foreptr += skip; + } + + while(foreptr != lastptr && *backptr == *foreptr) /*maximum supported length by deflate is max length*/ + { + ++backptr; + ++foreptr; + } + current_length = (unsigned)(foreptr - &in[pos]); + + if(current_length > length) + { + length = current_length; /*the longest length*/ + offset = current_offset; /*the offset that is related to this longest length*/ + /*jump out once a length of max length is found (speed gain). This also jumps + out if length is MAX_SUPPORTED_DEFLATE_LENGTH*/ + if(current_length >= nicematch) break; + } + } + + if(hashpos == hash->chain[hashpos]) break; + + prevpos = hashpos; + hashpos = hash->chain[hashpos]; + } + + if(lazymatching) + { + if(!lazy && length >= 3 && length <= maxlazymatch && length < MAX_SUPPORTED_DEFLATE_LENGTH) + { + lazy = 1; + lazylength = length; + lazyoffset = offset; + continue; /*try the next byte*/ + } + if(lazy) + { + lazy = 0; + if(pos == 0) ERROR_BREAK(81); + if(length > lazylength + 1) + { + /*push the previous character as literal*/ + if(!uivector_push_back(out, in[pos - 1])) ERROR_BREAK(83 /*alloc fail*/); + } + else + { + length = lazylength; + offset = lazyoffset; + hash->head[hashval] = -1; /*the same hashchain update will be done, this ensures no wrong alteration*/ + pos--; + } + } + } + if(length >= 3 && offset > windowsize) ERROR_BREAK(86 /*too big (or overflown negative) offset*/); + + /*encode it as length/distance pair or literal value*/ + if(length < 3) /*only lengths of 3 or higher are supported as length/distance pair*/ + { + if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); + } + else if(length < minmatch || (length == 3 && offset > 4096)) + { + /*compensate for the fact that longer offsets have more extra bits, a + length of only 3 may be not worth it then*/ + if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); + } + else + { + addLengthDistance(out, length, offset); + for(i = 1; i < length; i++) + { + pos++; + wpos = pos & (windowsize - 1); + hashval = getHash(in, insize, pos); + updateHashChain(hash, wpos, hashval); + if(usezeros && hashval == 0) + { + if (numzeros == 0) numzeros = countZeros(in, insize, pos); + else if (pos + numzeros >= insize || in[pos + numzeros - 1] != 0) numzeros--; + hash->zeros[wpos] = numzeros; + } + else + { + numzeros = 0; + } + } + } + } /*end of the loop through each character of input*/ + + return error; +} + +/* /////////////////////////////////////////////////////////////////////////// */ + +static unsigned deflateNoCompression(ucvector* out, const unsigned char* data, size_t datasize) +{ + /*non compressed deflate block data: 1 bit BFINAL,2 bits BTYPE,(5 bits): it jumps to start of next byte, + 2 bytes LEN, 2 bytes NLEN, LEN bytes literal DATA*/ + + size_t i, j, numdeflateblocks = (datasize + 65534) / 65535; + unsigned datapos = 0; + for(i = 0; i < numdeflateblocks; i++) + { + unsigned BFINAL, BTYPE, LEN, NLEN; + unsigned char firstbyte; + + BFINAL = (i == numdeflateblocks - 1); + BTYPE = 0; + + firstbyte = (unsigned char)(BFINAL + ((BTYPE & 1) << 1) + ((BTYPE & 2) << 1)); + ucvector_push_back(out, firstbyte); + + LEN = 65535; + if(datasize - datapos < 65535) LEN = (unsigned)datasize - datapos; + NLEN = 65535 - LEN; + + ucvector_push_back(out, (unsigned char)(LEN % 256)); + ucvector_push_back(out, (unsigned char)(LEN / 256)); + ucvector_push_back(out, (unsigned char)(NLEN % 256)); + ucvector_push_back(out, (unsigned char)(NLEN / 256)); + + /*Decompressed data*/ + for(j = 0; j < 65535 && datapos < datasize; j++) + { + ucvector_push_back(out, data[datapos++]); + } + } + + return 0; +} + +/* +write the lz77-encoded data, which has lit, len and dist codes, to compressed stream using huffman trees. +tree_ll: the tree for lit and len codes. +tree_d: the tree for distance codes. +*/ +static void writeLZ77data(size_t* bp, ucvector* out, const uivector* lz77_encoded, + const HuffmanTree* tree_ll, const HuffmanTree* tree_d) +{ + size_t i = 0; + for(i = 0; i < lz77_encoded->size; i++) + { + unsigned val = lz77_encoded->data[i]; + addHuffmanSymbol(bp, out, HuffmanTree_getCode(tree_ll, val), HuffmanTree_getLength(tree_ll, val)); + if(val > 256) /*for a length code, 3 more things have to be added*/ + { + unsigned length_index = val - FIRST_LENGTH_CODE_INDEX; + unsigned n_length_extra_bits = LENGTHEXTRA[length_index]; + unsigned length_extra_bits = lz77_encoded->data[++i]; + + unsigned distance_code = lz77_encoded->data[++i]; + + unsigned distance_index = distance_code; + unsigned n_distance_extra_bits = DISTANCEEXTRA[distance_index]; + unsigned distance_extra_bits = lz77_encoded->data[++i]; + + addBitsToStream(bp, out, length_extra_bits, n_length_extra_bits); + addHuffmanSymbol(bp, out, HuffmanTree_getCode(tree_d, distance_code), + HuffmanTree_getLength(tree_d, distance_code)); + addBitsToStream(bp, out, distance_extra_bits, n_distance_extra_bits); + } + } +} + +/*Deflate for a block of type "dynamic", that is, with freely, optimally, created huffman trees*/ +static unsigned deflateDynamic(ucvector* out, size_t* bp, Hash* hash, + const unsigned char* data, size_t datapos, size_t dataend, + const LodePNGCompressSettings* settings, int final) +{ + unsigned error = 0; + + /* + A block is compressed as follows: The PNG data is lz77 encoded, resulting in + literal bytes and length/distance pairs. This is then huffman compressed with + two huffman trees. One huffman tree is used for the lit and len values ("ll"), + another huffman tree is used for the dist values ("d"). These two trees are + stored using their code lengths, and to compress even more these code lengths + are also run-length encoded and huffman compressed. This gives a huffman tree + of code lengths "cl". The code lenghts used to describe this third tree are + the code length code lengths ("clcl"). + */ + + /*The lz77 encoded data, represented with integers since there will also be length and distance codes in it*/ + uivector lz77_encoded; + HuffmanTree tree_ll; /*tree for lit,len values*/ + HuffmanTree tree_d; /*tree for distance codes*/ + HuffmanTree tree_cl; /*tree for encoding the code lengths representing tree_ll and tree_d*/ + uivector frequencies_ll; /*frequency of lit,len codes*/ + uivector frequencies_d; /*frequency of dist codes*/ + uivector frequencies_cl; /*frequency of code length codes*/ + uivector bitlen_lld; /*lit,len,dist code lenghts (int bits), literally (without repeat codes).*/ + uivector bitlen_lld_e; /*bitlen_lld encoded with repeat codes (this is a rudemtary run length compression)*/ + /*bitlen_cl is the code length code lengths ("clcl"). The bit lengths of codes to represent tree_cl + (these are written as is in the file, it would be crazy to compress these using yet another huffman + tree that needs to be represented by yet another set of code lengths)*/ + uivector bitlen_cl; + size_t datasize = dataend - datapos; + + /* + Due to the huffman compression of huffman tree representations ("two levels"), there are some anologies: + bitlen_lld is to tree_cl what data is to tree_ll and tree_d. + bitlen_lld_e is to bitlen_lld what lz77_encoded is to data. + bitlen_cl is to bitlen_lld_e what bitlen_lld is to lz77_encoded. + */ + + unsigned BFINAL = final; + size_t numcodes_ll, numcodes_d, i; + unsigned HLIT, HDIST, HCLEN; + + uivector_init(&lz77_encoded); + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + HuffmanTree_init(&tree_cl); + uivector_init(&frequencies_ll); + uivector_init(&frequencies_d); + uivector_init(&frequencies_cl); + uivector_init(&bitlen_lld); + uivector_init(&bitlen_lld_e); + uivector_init(&bitlen_cl); + + /*This while loop never loops due to a break at the end, it is here to + allow breaking out of it to the cleanup phase on error conditions.*/ + while(!error) + { + if(settings->use_lz77) + { + error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, + settings->minmatch, settings->nicematch, settings->lazymatching); + if(error) break; + } + else + { + if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83 /*alloc fail*/); + for(i = datapos; i < dataend; i++) lz77_encoded.data[i] = data[i]; /*no LZ77, but still will be Huffman compressed*/ + } + + if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83 /*alloc fail*/); + if(!uivector_resizev(&frequencies_d, 30, 0)) ERROR_BREAK(83 /*alloc fail*/); + + /*Count the frequencies of lit, len and dist codes*/ + for(i = 0; i < lz77_encoded.size; i++) + { + unsigned symbol = lz77_encoded.data[i]; + frequencies_ll.data[symbol]++; + if(symbol > 256) + { + unsigned dist = lz77_encoded.data[i + 2]; + frequencies_d.data[dist]++; + i += 3; + } + } + frequencies_ll.data[256] = 1; /*there will be exactly 1 end code, at the end of the block*/ + + /*Make both huffman trees, one for the lit and len codes, one for the dist codes*/ + error = HuffmanTree_makeFromFrequencies(&tree_ll, frequencies_ll.data, 257, frequencies_ll.size, 15); + if(error) break; + /*2, not 1, is chosen for mincodes: some buggy PNG decoders require at least 2 symbols in the dist tree*/ + error = HuffmanTree_makeFromFrequencies(&tree_d, frequencies_d.data, 2, frequencies_d.size, 15); + if(error) break; + + numcodes_ll = tree_ll.numcodes; if(numcodes_ll > 286) numcodes_ll = 286; + numcodes_d = tree_d.numcodes; if(numcodes_d > 30) numcodes_d = 30; + /*store the code lengths of both generated trees in bitlen_lld*/ + for(i = 0; i < numcodes_ll; i++) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_ll, (unsigned)i)); + for(i = 0; i < numcodes_d; i++) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_d, (unsigned)i)); + + /*run-length compress bitlen_ldd into bitlen_lld_e by using repeat codes 16 (copy length 3-6 times), + 17 (3-10 zeroes), 18 (11-138 zeroes)*/ + for(i = 0; i < (unsigned)bitlen_lld.size; i++) + { + unsigned j = 0; /*amount of repititions*/ + while(i + j + 1 < (unsigned)bitlen_lld.size && bitlen_lld.data[i + j + 1] == bitlen_lld.data[i]) j++; + + if(bitlen_lld.data[i] == 0 && j >= 2) /*repeat code for zeroes*/ + { + j++; /*include the first zero*/ + if(j <= 10) /*repeat code 17 supports max 10 zeroes*/ + { + uivector_push_back(&bitlen_lld_e, 17); + uivector_push_back(&bitlen_lld_e, j - 3); + } + else /*repeat code 18 supports max 138 zeroes*/ + { + if(j > 138) j = 138; + uivector_push_back(&bitlen_lld_e, 18); + uivector_push_back(&bitlen_lld_e, j - 11); + } + i += (j - 1); + } + else if(j >= 3) /*repeat code for value other than zero*/ + { + size_t k; + unsigned num = j / 6, rest = j % 6; + uivector_push_back(&bitlen_lld_e, bitlen_lld.data[i]); + for(k = 0; k < num; k++) + { + uivector_push_back(&bitlen_lld_e, 16); + uivector_push_back(&bitlen_lld_e, 6 - 3); + } + if(rest >= 3) + { + uivector_push_back(&bitlen_lld_e, 16); + uivector_push_back(&bitlen_lld_e, rest - 3); + } + else j -= rest; + i += j; + } + else /*too short to benefit from repeat code*/ + { + uivector_push_back(&bitlen_lld_e, bitlen_lld.data[i]); + } + } + + /*generate tree_cl, the huffmantree of huffmantrees*/ + + if(!uivector_resizev(&frequencies_cl, NUM_CODE_LENGTH_CODES, 0)) ERROR_BREAK(83 /*alloc fail*/); + for(i = 0; i < bitlen_lld_e.size; i++) + { + frequencies_cl.data[bitlen_lld_e.data[i]]++; + /*after a repeat code come the bits that specify the number of repetitions, + those don't need to be in the frequencies_cl calculation*/ + if(bitlen_lld_e.data[i] >= 16) i++; + } + + error = HuffmanTree_makeFromFrequencies(&tree_cl, frequencies_cl.data, + frequencies_cl.size, frequencies_cl.size, 7); + if(error) break; + + if(!uivector_resize(&bitlen_cl, tree_cl.numcodes)) ERROR_BREAK(83 /*alloc fail*/); + for(i = 0; i < tree_cl.numcodes; i++) + { + /*lenghts of code length tree is in the order as specified by deflate*/ + bitlen_cl.data[i] = HuffmanTree_getLength(&tree_cl, CLCL_ORDER[i]); + } + while(bitlen_cl.data[bitlen_cl.size - 1] == 0 && bitlen_cl.size > 4) + { + /*remove zeros at the end, but minimum size must be 4*/ + if(!uivector_resize(&bitlen_cl, bitlen_cl.size - 1)) ERROR_BREAK(83 /*alloc fail*/); + } + if(error) break; + + /* + Write everything into the output + + After the BFINAL and BTYPE, the dynamic block consists out of the following: + - 5 bits HLIT, 5 bits HDIST, 4 bits HCLEN + - (HCLEN+4)*3 bits code lengths of code length alphabet + - HLIT + 257 code lenghts of lit/length alphabet (encoded using the code length + alphabet, + possible repetition codes 16, 17, 18) + - HDIST + 1 code lengths of distance alphabet (encoded using the code length + alphabet, + possible repetition codes 16, 17, 18) + - compressed data + - 256 (end code) + */ + + /*Write block type*/ + addBitToStream(bp, out, BFINAL); + addBitToStream(bp, out, 0); /*first bit of BTYPE "dynamic"*/ + addBitToStream(bp, out, 1); /*second bit of BTYPE "dynamic"*/ + + /*write the HLIT, HDIST and HCLEN values*/ + HLIT = (unsigned)(numcodes_ll - 257); + HDIST = (unsigned)(numcodes_d - 1); + HCLEN = (unsigned)bitlen_cl.size - 4; + /*trim zeroes for HCLEN. HLIT and HDIST were already trimmed at tree creation*/ + while(!bitlen_cl.data[HCLEN + 4 - 1] && HCLEN > 0) HCLEN--; + addBitsToStream(bp, out, HLIT, 5); + addBitsToStream(bp, out, HDIST, 5); + addBitsToStream(bp, out, HCLEN, 4); + + /*write the code lenghts of the code length alphabet*/ + for(i = 0; i < HCLEN + 4; i++) addBitsToStream(bp, out, bitlen_cl.data[i], 3); + + /*write the lenghts of the lit/len AND the dist alphabet*/ + for(i = 0; i < bitlen_lld_e.size; i++) + { + addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_cl, bitlen_lld_e.data[i]), + HuffmanTree_getLength(&tree_cl, bitlen_lld_e.data[i])); + /*extra bits of repeat codes*/ + if(bitlen_lld_e.data[i] == 16) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 2); + else if(bitlen_lld_e.data[i] == 17) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 3); + else if(bitlen_lld_e.data[i] == 18) addBitsToStream(bp, out, bitlen_lld_e.data[++i], 7); + } + + /*write the compressed data symbols*/ + writeLZ77data(bp, out, &lz77_encoded, &tree_ll, &tree_d); + /*error: the length of the end code 256 must be larger than 0*/ + if(HuffmanTree_getLength(&tree_ll, 256) == 0) ERROR_BREAK(64); + + /*write the end code*/ + addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, 256), HuffmanTree_getLength(&tree_ll, 256)); + + break; /*end of error-while*/ + } + + /*cleanup*/ + uivector_cleanup(&lz77_encoded); + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + HuffmanTree_cleanup(&tree_cl); + uivector_cleanup(&frequencies_ll); + uivector_cleanup(&frequencies_d); + uivector_cleanup(&frequencies_cl); + uivector_cleanup(&bitlen_lld_e); + uivector_cleanup(&bitlen_lld); + uivector_cleanup(&bitlen_cl); + + return error; +} + +static unsigned deflateFixed(ucvector* out, size_t* bp, Hash* hash, + const unsigned char* data, + size_t datapos, size_t dataend, + const LodePNGCompressSettings* settings, int final) +{ + HuffmanTree tree_ll; /*tree for literal values and length codes*/ + HuffmanTree tree_d; /*tree for distance codes*/ + + unsigned BFINAL = final; + unsigned error = 0; + size_t i; + + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + + generateFixedLitLenTree(&tree_ll); + generateFixedDistanceTree(&tree_d); + + addBitToStream(bp, out, BFINAL); + addBitToStream(bp, out, 1); /*first bit of BTYPE*/ + addBitToStream(bp, out, 0); /*second bit of BTYPE*/ + + if(settings->use_lz77) /*LZ77 encoded*/ + { + uivector lz77_encoded; + uivector_init(&lz77_encoded); + error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, + settings->minmatch, settings->nicematch, settings->lazymatching); + if(!error) writeLZ77data(bp, out, &lz77_encoded, &tree_ll, &tree_d); + uivector_cleanup(&lz77_encoded); + } + else /*no LZ77, but still will be Huffman compressed*/ + { + for(i = datapos; i < dataend; i++) + { + addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, data[i]), HuffmanTree_getLength(&tree_ll, data[i])); + } + } + /*add END code*/ + if(!error) addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, 256), HuffmanTree_getLength(&tree_ll, 256)); + + /*cleanup*/ + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + + return error; +} + +static unsigned lodepng_deflatev(ucvector* out, const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings) +{ + unsigned error = 0; + size_t i, blocksize, numdeflateblocks; + size_t bp = 0; /*the bit pointer*/ + Hash hash; + + if(settings->btype > 2) return 61; + else if(settings->btype == 0) return deflateNoCompression(out, in, insize); + else if(settings->btype == 1) blocksize = insize; + else /*if(settings->btype == 2)*/ + { + blocksize = insize / 8 + 8; + if(blocksize < 65535) blocksize = 65535; + } + + numdeflateblocks = (insize + blocksize - 1) / blocksize; + if(numdeflateblocks == 0) numdeflateblocks = 1; + + error = hash_init(&hash, settings->windowsize); + if(error) return error; + + for(i = 0; i < numdeflateblocks && !error; i++) + { + int final = i == numdeflateblocks - 1; + size_t start = i * blocksize; + size_t end = start + blocksize; + if(end > insize) end = insize; + + if(settings->btype == 1) error = deflateFixed(out, &bp, &hash, in, start, end, settings, final); + else if(settings->btype == 2) error = deflateDynamic(out, &bp, &hash, in, start, end, settings, final); + } + + hash_cleanup(&hash); + + return error; +} + +unsigned lodepng_deflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings) +{ + unsigned error; + ucvector v; + ucvector_init_buffer(&v, *out, *outsize); + error = lodepng_deflatev(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + return error; +} + +static unsigned deflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings) +{ + if(settings->custom_deflate) + { + return settings->custom_deflate(out, outsize, in, insize, settings); + } + else + { + return lodepng_deflate(out, outsize, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Adler32 */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static unsigned update_adler32(unsigned adler, const unsigned char* data, unsigned len) +{ + unsigned s1 = adler & 0xffff; + unsigned s2 = (adler >> 16) & 0xffff; + + while(len > 0) + { + /*at least 5550 sums can be done before the sums overflow, saving a lot of module divisions*/ + unsigned amount = len > 5550 ? 5550 : len; + len -= amount; + while(amount > 0) + { + s1 += (*data++); + s2 += s1; + amount--; + } + s1 %= 65521; + s2 %= 65521; + } + + return (s2 << 16) | s1; +} + +/*Return the adler32 of the bytes data[0..len-1]*/ +static unsigned adler32(const unsigned char* data, unsigned len) +{ + return update_adler32(1L, data, len); +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Zlib / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_DECODER + +unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGDecompressSettings* settings) +{ + unsigned error = 0; + unsigned CM, CINFO, FDICT; + + if(insize < 2) return 53; /*error, size of zlib data too small*/ + /*read information from zlib header*/ + if((in[0] * 256 + in[1]) % 31 != 0) + { + /*error: 256 * in[0] + in[1] must be a multiple of 31, the FCHECK value is supposed to be made that way*/ + return 24; + } + + CM = in[0] & 15; + CINFO = (in[0] >> 4) & 15; + /*FCHECK = in[1] & 31;*/ /*FCHECK is already tested above*/ + FDICT = (in[1] >> 5) & 1; + /*FLEVEL = (in[1] >> 6) & 3;*/ /*FLEVEL is not used here*/ + + if(CM != 8 || CINFO > 7) + { + /*error: only compression method 8: inflate with sliding window of 32k is supported by the PNG spec*/ + return 25; + } + if(FDICT != 0) + { + /*error: the specification of PNG says about the zlib stream: + "The additional flags shall not specify a preset dictionary."*/ + return 26; + } + + error = inflate(out, outsize, in + 2, insize - 2, settings); + if(error) return error; + + if(!settings->ignore_adler32) + { + unsigned ADLER32 = lodepng_read32bitInt(&in[insize - 4]); + unsigned checksum = adler32(*out, (unsigned)(*outsize)); + if(checksum != ADLER32) return 58; /*error, adler checksum not correct, data must be corrupted*/ + } + + return 0; /*no error*/ +} + +static unsigned zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGDecompressSettings* settings) +{ + if(settings->custom_zlib) + { + return settings->custom_zlib(out, outsize, in, insize, settings); + } + else + { + return lodepng_zlib_decompress(out, outsize, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER + +unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGCompressSettings* settings) +{ + /*initially, *out must be NULL and outsize 0, if you just give some random *out + that's pointing to a non allocated buffer, this'll crash*/ + ucvector outv; + size_t i; + unsigned error; + unsigned char* deflatedata = 0; + size_t deflatesize = 0; + + unsigned ADLER32; + /*zlib data: 1 byte CMF (CM+CINFO), 1 byte FLG, deflate data, 4 byte ADLER32 checksum of the Decompressed data*/ + unsigned CMF = 120; /*0b01111000: CM 8, CINFO 7. With CINFO 7, any window size up to 32768 can be used.*/ + unsigned FLEVEL = 0; + unsigned FDICT = 0; + unsigned CMFFLG = 256 * CMF + FDICT * 32 + FLEVEL * 64; + unsigned FCHECK = 31 - CMFFLG % 31; + CMFFLG += FCHECK; + + /*ucvector-controlled version of the output buffer, for dynamic array*/ + ucvector_init_buffer(&outv, *out, *outsize); + + ucvector_push_back(&outv, (unsigned char)(CMFFLG / 256)); + ucvector_push_back(&outv, (unsigned char)(CMFFLG % 256)); + + error = deflate(&deflatedata, &deflatesize, in, insize, settings); + + if(!error) + { + ADLER32 = adler32(in, (unsigned)insize); + for(i = 0; i < deflatesize; i++) ucvector_push_back(&outv, deflatedata[i]); + lodepng_free(deflatedata); + lodepng_add32bitInt(&outv, ADLER32); + } + + *out = outv.data; + *outsize = outv.size; + + return error; +} + +/* compress using the default or custom zlib function */ +static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGCompressSettings* settings) +{ + if(settings->custom_zlib) + { + return settings->custom_zlib(out, outsize, in, insize, settings); + } + else + { + return lodepng_zlib_compress(out, outsize, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#else /*no LODEPNG_COMPILE_ZLIB*/ + +#ifdef LODEPNG_COMPILE_DECODER +static unsigned zlib_decompress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGDecompressSettings* settings) +{ + if (!settings->custom_zlib) return 87; /*no custom zlib function provided */ + return settings->custom_zlib(out, outsize, in, insize, settings); +} +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER +static unsigned zlib_compress(unsigned char** out, size_t* outsize, const unsigned char* in, + size_t insize, const LodePNGCompressSettings* settings) +{ + if (!settings->custom_zlib) return 87; /*no custom zlib function provided */ + return settings->custom_zlib(out, outsize, in, insize, settings); +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#endif /*LODEPNG_COMPILE_ZLIB*/ + +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_ENCODER + +/*this is a good tradeoff between speed and compression ratio*/ +#define DEFAULT_WINDOWSIZE 2048 + +void lodepng_compress_settings_init(LodePNGCompressSettings* settings) +{ + /*compress with dynamic huffman tree (not in the mathematical sense, just not the predefined one)*/ + settings->btype = 2; + settings->use_lz77 = 1; + settings->windowsize = DEFAULT_WINDOWSIZE; + settings->minmatch = 3; + settings->nicematch = 128; + settings->lazymatching = 1; + + settings->custom_zlib = 0; + settings->custom_deflate = 0; + settings->custom_context = 0; +} + +const LodePNGCompressSettings lodepng_default_compress_settings = {2, 1, DEFAULT_WINDOWSIZE, 3, 128, 1, 0, 0, 0}; + + +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings) +{ + settings->ignore_adler32 = 0; + + settings->custom_zlib = 0; + settings->custom_inflate = 0; + settings->custom_context = 0; +} + +const LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 0, 0, 0}; + +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // End of Zlib related code. Begin of PNG related code. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_PNG + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / CRC32 / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/* CRC polynomial: 0xedb88320 */ +static unsigned lodepng_crc32_table[256] = { + 0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u, + 249268274u, 2044508324u, 3772115230u, 2547177864u, 162941995u, 2125561021u, 3887607047u, 2428444049u, + 498536548u, 1789927666u, 4089016648u, 2227061214u, 450548861u, 1843258603u, 4107580753u, 2211677639u, + 325883990u, 1684777152u, 4251122042u, 2321926636u, 335633487u, 1661365465u, 4195302755u, 2366115317u, + 997073096u, 1281953886u, 3579855332u, 2724688242u, 1006888145u, 1258607687u, 3524101629u, 2768942443u, + 901097722u, 1119000684u, 3686517206u, 2898065728u, 853044451u, 1172266101u, 3705015759u, 2882616665u, + 651767980u, 1373503546u, 3369554304u, 3218104598u, 565507253u, 1454621731u, 3485111705u, 3099436303u, + 671266974u, 1594198024u, 3322730930u, 2970347812u, 795835527u, 1483230225u, 3244367275u, 3060149565u, + 1994146192u, 31158534u, 2563907772u, 4023717930u, 1907459465u, 112637215u, 2680153253u, 3904427059u, + 2013776290u, 251722036u, 2517215374u, 3775830040u, 2137656763u, 141376813u, 2439277719u, 3865271297u, + 1802195444u, 476864866u, 2238001368u, 4066508878u, 1812370925u, 453092731u, 2181625025u, 4111451223u, + 1706088902u, 314042704u, 2344532202u, 4240017532u, 1658658271u, 366619977u, 2362670323u, 4224994405u, + 1303535960u, 984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u, 2765210733u, 3554079995u, + 1131014506u, 879679996u, 2909243462u, 3663771856u, 1141124467u, 855842277u, 2852801631u, 3708648649u, + 1342533948u, 654459306u, 3188396048u, 3373015174u, 1466479909u, 544179635u, 3110523913u, 3462522015u, + 1591671054u, 702138776u, 2966460450u, 3352799412u, 1504918807u, 783551873u, 3082640443u, 3233442989u, + 3988292384u, 2596254646u, 62317068u, 1957810842u, 3939845945u, 2647816111u, 81470997u, 1943803523u, + 3814918930u, 2489596804u, 225274430u, 2053790376u, 3826175755u, 2466906013u, 167816743u, 2097651377u, + 4027552580u, 2265490386u, 503444072u, 1762050814u, 4150417245u, 2154129355u, 426522225u, 1852507879u, + 4275313526u, 2312317920u, 282753626u, 1742555852u, 4189708143u, 2394877945u, 397917763u, 1622183637u, + 3604390888u, 2714866558u, 953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u, + 3624741850u, 2936675148u, 906185462u, 1090812512u, 3747672003u, 2825379669u, 829329135u, 1181335161u, + 3412177804u, 3160834842u, 628085408u, 1382605366u, 3423369109u, 3138078467u, 570562233u, 1426400815u, + 3317316542u, 2998733608u, 733239954u, 1555261956u, 3268935591u, 3050360625u, 752459403u, 1541320221u, + 2607071920u, 3965973030u, 1969922972u, 40735498u, 2617837225u, 3943577151u, 1913087877u, 83908371u, + 2512341634u, 3803740692u, 2075208622u, 213261112u, 2463272603u, 3855990285u, 2094854071u, 198958881u, + 2262029012u, 4057260610u, 1759359992u, 534414190u, 2176718541u, 4139329115u, 1873836001u, 414664567u, + 2282248934u, 4279200368u, 1711684554u, 285281116u, 2405801727u, 4167216745u, 1634467795u, 376229701u, + 2685067896u, 3608007406u, 1308918612u, 956543938u, 2808555105u, 3495958263u, 1231636301u, 1047427035u, + 2932959818u, 3654703836u, 1088359270u, 936918000u, 2847714899u, 3736837829u, 1202900863u, 817233897u, + 3183342108u, 3401237130u, 1404277552u, 615818150u, 3134207493u, 3453421203u, 1423857449u, 601450431u, + 3009837614u, 3294710456u, 1567103746u, 711928724u, 3020668471u, 3272380065u, 1510334235u, 755167117u +}; + +/*Return the CRC of the bytes buf[0..len-1].*/ +unsigned lodepng_crc32(const unsigned char* buf, size_t len) +{ + unsigned c = 0xffffffffL; + size_t n; + + for(n = 0; n < len; n++) + { + c = lodepng_crc32_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); + } + return c ^ 0xffffffffL; +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Reading and writing single bits and bytes from/to stream for LodePNG / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static unsigned char readBitFromReversedStream(size_t* bitpointer, const unsigned char* bitstream) +{ + unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1); + (*bitpointer)++; + return result; +} + +static unsigned readBitsFromReversedStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) +{ + unsigned result = 0; + size_t i; + for(i = nbits - 1; i < nbits; i--) + { + result += (unsigned)readBitFromReversedStream(bitpointer, bitstream) << i; + } + return result; +} + +#ifdef LODEPNG_COMPILE_DECODER +static void setBitOfReversedStream0(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) +{ + /*the current bit in bitstream must be 0 for this to work*/ + if(bit) + { + /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/ + bitstream[(*bitpointer) >> 3] |= (bit << (7 - ((*bitpointer) & 0x7))); + } + (*bitpointer)++; +} +#endif /*LODEPNG_COMPILE_DECODER*/ + +static void setBitOfReversedStream(size_t* bitpointer, unsigned char* bitstream, unsigned char bit) +{ + /*the current bit in bitstream may be 0 or 1 for this to work*/ + if(bit == 0) bitstream[(*bitpointer) >> 3] &= (unsigned char)(~(1 << (7 - ((*bitpointer) & 0x7)))); + else bitstream[(*bitpointer) >> 3] |= (1 << (7 - ((*bitpointer) & 0x7))); + (*bitpointer)++; +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG chunks / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +unsigned lodepng_chunk_length(const unsigned char* chunk) +{ + return lodepng_read32bitInt(&chunk[0]); +} + +void lodepng_chunk_type(char type[5], const unsigned char* chunk) +{ + unsigned i; + for(i = 0; i < 4; i++) type[i] = chunk[4 + i]; + type[4] = 0; /*null termination char*/ +} + +unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type) +{ + if(strlen(type) != 4) return 0; + return (chunk[4] == type[0] && chunk[5] == type[1] && chunk[6] == type[2] && chunk[7] == type[3]); +} + +unsigned char lodepng_chunk_ancillary(const unsigned char* chunk) +{ + return((chunk[4] & 32) != 0); +} + +unsigned char lodepng_chunk_private(const unsigned char* chunk) +{ + return((chunk[6] & 32) != 0); +} + +unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk) +{ + return((chunk[7] & 32) != 0); +} + +unsigned char* lodepng_chunk_data(unsigned char* chunk) +{ + return &chunk[8]; +} + +const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk) +{ + return &chunk[8]; +} + +unsigned lodepng_chunk_check_crc(const unsigned char* chunk) +{ + unsigned length = lodepng_chunk_length(chunk); + unsigned CRC = lodepng_read32bitInt(&chunk[length + 8]); + /*the CRC is taken of the data and the 4 chunk type letters, not the length*/ + unsigned checksum = lodepng_crc32(&chunk[4], length + 4); + if(CRC != checksum) return 1; + else return 0; +} + +void lodepng_chunk_generate_crc(unsigned char* chunk) +{ + unsigned length = lodepng_chunk_length(chunk); + unsigned CRC = lodepng_crc32(&chunk[4], length + 4); + lodepng_set32bitInt(chunk + 8 + length, CRC); +} + +unsigned char* lodepng_chunk_next(unsigned char* chunk) +{ + unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; + return &chunk[total_chunk_length]; +} + +const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk) +{ + unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; + return &chunk[total_chunk_length]; +} + +unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk) +{ + unsigned i; + unsigned total_chunk_length = lodepng_chunk_length(chunk) + 12; + unsigned char *chunk_start, *new_buffer; + size_t new_length = (*outlength) + total_chunk_length; + if(new_length < total_chunk_length || new_length < (*outlength)) return 77; /*integer overflow happened*/ + + new_buffer = (unsigned char*)lodepng_realloc(*out, new_length); + if(!new_buffer) return 83; /*alloc fail*/ + (*out) = new_buffer; + (*outlength) = new_length; + chunk_start = &(*out)[new_length - total_chunk_length]; + + for(i = 0; i < total_chunk_length; i++) chunk_start[i] = chunk[i]; + + return 0; +} + +unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, + const char* type, const unsigned char* data) +{ + unsigned i; + unsigned char *chunk, *new_buffer; + size_t new_length = (*outlength) + length + 12; + if(new_length < length + 12 || new_length < (*outlength)) return 77; /*integer overflow happened*/ + new_buffer = (unsigned char*)lodepng_realloc(*out, new_length); + if(!new_buffer) return 83; /*alloc fail*/ + (*out) = new_buffer; + (*outlength) = new_length; + chunk = &(*out)[(*outlength) - length - 12]; + + /*1: length*/ + lodepng_set32bitInt(chunk, (unsigned)length); + + /*2: chunk name (4 letters)*/ + chunk[4] = type[0]; + chunk[5] = type[1]; + chunk[6] = type[2]; + chunk[7] = type[3]; + + /*3: the data*/ + for(i = 0; i < length; i++) chunk[8 + i] = data[i]; + + /*4: CRC (of the chunkname characters and the data)*/ + lodepng_chunk_generate_crc(chunk); + + return 0; +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Color types and such / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*return type is a LodePNG error code*/ +static unsigned checkColorValidity(LodePNGColorType colortype, unsigned bd) /*bd = bitdepth*/ +{ + switch(colortype) + { + case 0: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 || bd == 16)) return 37; break; /*grey*/ + case 2: if(!( bd == 8 || bd == 16)) return 37; break; /*RGB*/ + case 3: if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 )) return 37; break; /*palette*/ + case 4: if(!( bd == 8 || bd == 16)) return 37; break; /*grey + alpha*/ + case 6: if(!( bd == 8 || bd == 16)) return 37; break; /*RGBA*/ + default: return 31; + } + return 0; /*allowed color type / bits combination*/ +} + +static unsigned getNumColorChannels(LodePNGColorType colortype) +{ + switch(colortype) + { + case 0: return 1; /*grey*/ + case 2: return 3; /*RGB*/ + case 3: return 1; /*palette*/ + case 4: return 2; /*grey + alpha*/ + case 6: return 4; /*RGBA*/ + } + return 0; /*unexisting color type*/ +} + +static unsigned lodepng_get_bpp_lct(LodePNGColorType colortype, unsigned bitdepth) +{ + /*bits per pixel is amount of channels * bits per channel*/ + return getNumColorChannels(colortype) * bitdepth; +} + +/* ////////////////////////////////////////////////////////////////////////// */ + +void lodepng_color_mode_init(LodePNGColorMode* info) +{ + info->key_defined = 0; + info->key_r = info->key_g = info->key_b = 0; + info->colortype = LCT_RGBA; + info->bitdepth = 8; + info->palette = 0; + info->palettesize = 0; +} + +void lodepng_color_mode_cleanup(LodePNGColorMode* info) +{ + lodepng_palette_clear(info); +} + +unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source) +{ + size_t i; + lodepng_color_mode_cleanup(dest); + *dest = *source; + if(source->palette) + { + dest->palette = (unsigned char*)lodepng_malloc(1024); + if(!dest->palette && source->palettesize) return 83; /*alloc fail*/ + for(i = 0; i < source->palettesize * 4; i++) dest->palette[i] = source->palette[i]; + } + return 0; +} + +static int lodepng_color_mode_equal(const LodePNGColorMode* a, const LodePNGColorMode* b) +{ + size_t i; + if(a->colortype != b->colortype) return 0; + if(a->bitdepth != b->bitdepth) return 0; + if(a->key_defined != b->key_defined) return 0; + if(a->key_defined) + { + if(a->key_r != b->key_r) return 0; + if(a->key_g != b->key_g) return 0; + if(a->key_b != b->key_b) return 0; + } + if(a->palettesize != b->palettesize) return 0; + for(i = 0; i < a->palettesize * 4; i++) + { + if(a->palette[i] != b->palette[i]) return 0; + } + return 1; +} + +void lodepng_palette_clear(LodePNGColorMode* info) +{ + if(info->palette) lodepng_free(info->palette); + info->palette = 0; + info->palettesize = 0; +} + +unsigned lodepng_palette_add(LodePNGColorMode* info, + unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + unsigned char* data; + /*the same resize technique as C++ std::vectors is used, and here it's made so that for a palette with + the max of 256 colors, it'll have the exact alloc size*/ + if(!info->palette) /*allocate palette if empty*/ + { + /*room for 256 colors with 4 bytes each*/ + data = (unsigned char*)lodepng_realloc(info->palette, 1024); + if(!data) return 83; /*alloc fail*/ + else info->palette = data; + } + info->palette[4 * info->palettesize + 0] = r; + info->palette[4 * info->palettesize + 1] = g; + info->palette[4 * info->palettesize + 2] = b; + info->palette[4 * info->palettesize + 3] = a; + info->palettesize++; + return 0; +} + +unsigned lodepng_get_bpp(const LodePNGColorMode* info) +{ + /*calculate bits per pixel out of colortype and bitdepth*/ + return lodepng_get_bpp_lct(info->colortype, info->bitdepth); +} + +unsigned lodepng_get_channels(const LodePNGColorMode* info) +{ + return getNumColorChannels(info->colortype); +} + +unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info) +{ + return info->colortype == LCT_GREY || info->colortype == LCT_GREY_ALPHA; +} + +unsigned lodepng_is_alpha_type(const LodePNGColorMode* info) +{ + return (info->colortype & 4) != 0; /*4 or 6*/ +} + +unsigned lodepng_is_palette_type(const LodePNGColorMode* info) +{ + return info->colortype == LCT_PALETTE; +} + +unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info) +{ + size_t i; + for(i = 0; i < info->palettesize; i++) + { + if(info->palette[i * 4 + 3] < 255) return 1; + } + return 0; +} + +unsigned lodepng_can_have_alpha(const LodePNGColorMode* info) +{ + return info->key_defined + || lodepng_is_alpha_type(info) + || lodepng_has_palette_alpha(info); +} + +size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color) +{ + return (w * h * lodepng_get_bpp(color) + 7) / 8; +} + +size_t lodepng_get_raw_size_lct(unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) +{ + return (w * h * lodepng_get_bpp_lct(colortype, bitdepth) + 7) / 8; +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + +static void LodePNGUnknownChunks_init(LodePNGInfo* info) +{ + unsigned i; + for(i = 0; i < 3; i++) info->unknown_chunks_data[i] = 0; + for(i = 0; i < 3; i++) info->unknown_chunks_size[i] = 0; +} + +static void LodePNGUnknownChunks_cleanup(LodePNGInfo* info) +{ + unsigned i; + for(i = 0; i < 3; i++) lodepng_free(info->unknown_chunks_data[i]); +} + +static unsigned LodePNGUnknownChunks_copy(LodePNGInfo* dest, const LodePNGInfo* src) +{ + unsigned i; + + LodePNGUnknownChunks_cleanup(dest); + + for(i = 0; i < 3; i++) + { + size_t j; + dest->unknown_chunks_size[i] = src->unknown_chunks_size[i]; + dest->unknown_chunks_data[i] = (unsigned char*)lodepng_malloc(src->unknown_chunks_size[i]); + if(!dest->unknown_chunks_data[i] && dest->unknown_chunks_size[i]) return 83; /*alloc fail*/ + for(j = 0; j < src->unknown_chunks_size[i]; j++) + { + dest->unknown_chunks_data[i][j] = src->unknown_chunks_data[i][j]; + } + } + + return 0; +} + +/******************************************************************************/ + +static void LodePNGText_init(LodePNGInfo* info) +{ + info->text_num = 0; + info->text_keys = NULL; + info->text_strings = NULL; +} + +static void LodePNGText_cleanup(LodePNGInfo* info) +{ + size_t i; + for(i = 0; i < info->text_num; i++) + { + string_cleanup(&info->text_keys[i]); + string_cleanup(&info->text_strings[i]); + } + lodepng_free(info->text_keys); + lodepng_free(info->text_strings); +} + +static unsigned LodePNGText_copy(LodePNGInfo* dest, const LodePNGInfo* source) +{ + size_t i = 0; + dest->text_keys = 0; + dest->text_strings = 0; + dest->text_num = 0; + for(i = 0; i < source->text_num; i++) + { + CERROR_TRY_RETURN(lodepng_add_text(dest, source->text_keys[i], source->text_strings[i])); + } + return 0; +} + +void lodepng_clear_text(LodePNGInfo* info) +{ + LodePNGText_cleanup(info); +} + +unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str) +{ + char** new_keys = (char**)(lodepng_realloc(info->text_keys, sizeof(char*) * (info->text_num + 1))); + char** new_strings = (char**)(lodepng_realloc(info->text_strings, sizeof(char*) * (info->text_num + 1))); + if(!new_keys || !new_strings) + { + lodepng_free(new_keys); + lodepng_free(new_strings); + return 83; /*alloc fail*/ + } + + info->text_num++; + info->text_keys = new_keys; + info->text_strings = new_strings; + + string_init(&info->text_keys[info->text_num - 1]); + string_set(&info->text_keys[info->text_num - 1], key); + + string_init(&info->text_strings[info->text_num - 1]); + string_set(&info->text_strings[info->text_num - 1], str); + + return 0; +} + +/******************************************************************************/ + +static void LodePNGIText_init(LodePNGInfo* info) +{ + info->itext_num = 0; + info->itext_keys = NULL; + info->itext_langtags = NULL; + info->itext_transkeys = NULL; + info->itext_strings = NULL; +} + +static void LodePNGIText_cleanup(LodePNGInfo* info) +{ + size_t i; + for(i = 0; i < info->itext_num; i++) + { + string_cleanup(&info->itext_keys[i]); + string_cleanup(&info->itext_langtags[i]); + string_cleanup(&info->itext_transkeys[i]); + string_cleanup(&info->itext_strings[i]); + } + lodepng_free(info->itext_keys); + lodepng_free(info->itext_langtags); + lodepng_free(info->itext_transkeys); + lodepng_free(info->itext_strings); +} + +static unsigned LodePNGIText_copy(LodePNGInfo* dest, const LodePNGInfo* source) +{ + size_t i = 0; + dest->itext_keys = 0; + dest->itext_langtags = 0; + dest->itext_transkeys = 0; + dest->itext_strings = 0; + dest->itext_num = 0; + for(i = 0; i < source->itext_num; i++) + { + CERROR_TRY_RETURN(lodepng_add_itext(dest, source->itext_keys[i], source->itext_langtags[i], + source->itext_transkeys[i], source->itext_strings[i])); + } + return 0; +} + +void lodepng_clear_itext(LodePNGInfo* info) +{ + LodePNGIText_cleanup(info); +} + +unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, + const char* transkey, const char* str) +{ + char** new_keys = (char**)(lodepng_realloc(info->itext_keys, sizeof(char*) * (info->itext_num + 1))); + char** new_langtags = (char**)(lodepng_realloc(info->itext_langtags, sizeof(char*) * (info->itext_num + 1))); + char** new_transkeys = (char**)(lodepng_realloc(info->itext_transkeys, sizeof(char*) * (info->itext_num + 1))); + char** new_strings = (char**)(lodepng_realloc(info->itext_strings, sizeof(char*) * (info->itext_num + 1))); + if(!new_keys || !new_langtags || !new_transkeys || !new_strings) + { + lodepng_free(new_keys); + lodepng_free(new_langtags); + lodepng_free(new_transkeys); + lodepng_free(new_strings); + return 83; /*alloc fail*/ + } + + info->itext_num++; + info->itext_keys = new_keys; + info->itext_langtags = new_langtags; + info->itext_transkeys = new_transkeys; + info->itext_strings = new_strings; + + string_init(&info->itext_keys[info->itext_num - 1]); + string_set(&info->itext_keys[info->itext_num - 1], key); + + string_init(&info->itext_langtags[info->itext_num - 1]); + string_set(&info->itext_langtags[info->itext_num - 1], langtag); + + string_init(&info->itext_transkeys[info->itext_num - 1]); + string_set(&info->itext_transkeys[info->itext_num - 1], transkey); + + string_init(&info->itext_strings[info->itext_num - 1]); + string_set(&info->itext_strings[info->itext_num - 1], str); + + return 0; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +void lodepng_info_init(LodePNGInfo* info) +{ + lodepng_color_mode_init(&info->color); + info->interlace_method = 0; + info->compression_method = 0; + info->filter_method = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + info->background_defined = 0; + info->background_r = info->background_g = info->background_b = 0; + + LodePNGText_init(info); + LodePNGIText_init(info); + + info->time_defined = 0; + info->phys_defined = 0; + + LodePNGUnknownChunks_init(info); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +void lodepng_info_cleanup(LodePNGInfo* info) +{ + lodepng_color_mode_cleanup(&info->color); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + LodePNGText_cleanup(info); + LodePNGIText_cleanup(info); + + LodePNGUnknownChunks_cleanup(info); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source) +{ + lodepng_info_cleanup(dest); + *dest = *source; + lodepng_color_mode_init(&dest->color); + CERROR_TRY_RETURN(lodepng_color_mode_copy(&dest->color, &source->color)); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + CERROR_TRY_RETURN(LodePNGText_copy(dest, source)); + CERROR_TRY_RETURN(LodePNGIText_copy(dest, source)); + + LodePNGUnknownChunks_init(dest); + CERROR_TRY_RETURN(LodePNGUnknownChunks_copy(dest, source)); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + return 0; +} + +void lodepng_info_swap(LodePNGInfo* a, LodePNGInfo* b) +{ + LodePNGInfo temp = *a; + *a = *b; + *b = temp; +} + +/* ////////////////////////////////////////////////////////////////////////// */ + +/*index: bitgroup index, bits: bitgroup size(1, 2 or 4), in: bitgroup value, out: octet array to add bits to*/ +static void addColorBits(unsigned char* out, size_t index, unsigned bits, unsigned in) +{ + unsigned m = bits == 1 ? 7 : bits == 2 ? 3 : 1; /*8 / bits - 1*/ + /*p = the partial index in the byte, e.g. with 4 palettebits it is 0 for first half or 1 for second half*/ + unsigned p = index & m; + in &= (1 << bits) - 1; /*filter out any other bits of the input value*/ + in = in << (bits * (m - p)); + if(p == 0) out[index * bits / 8] = in; + else out[index * bits / 8] |= in; +} + +typedef struct ColorTree ColorTree; + +/* +One node of a color tree +This is the data structure used to count the number of unique colors and to get a palette +index for a color. It's like an octree, but because the alpha channel is used too, each +node has 16 instead of 8 children. +*/ +struct ColorTree +{ + ColorTree* children[16]; /*up to 16 pointers to ColorTree of next level*/ + int index; /*the payload. Only has a meaningful value if this is in the last level*/ +}; + +static void color_tree_init(ColorTree* tree) +{ + int i; + for(i = 0; i < 16; i++) tree->children[i] = 0; + tree->index = -1; +} + +static void color_tree_cleanup(ColorTree* tree) +{ + int i; + for(i = 0; i < 16; i++) + { + if(tree->children[i]) + { + color_tree_cleanup(tree->children[i]); + lodepng_free(tree->children[i]); + } + } +} + +/*returns -1 if color not present, its index otherwise*/ +static int color_tree_get(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + int bit = 0; + for(bit = 0; bit < 8; bit++) + { + int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); + if(!tree->children[i]) return -1; + else tree = tree->children[i]; + } + return tree ? tree->index : -1; +} + +#ifdef LODEPNG_COMPILE_ENCODER +static int color_tree_has(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + return color_tree_get(tree, r, g, b, a) >= 0; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/*color is not allowed to already exist. +Index should be >= 0 (it's signed to be compatible with using -1 for "doesn't exist")*/ +static void color_tree_add(ColorTree* tree, + unsigned char r, unsigned char g, unsigned char b, unsigned char a, int index) +{ + int bit; + for(bit = 0; bit < 8; bit++) + { + int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); + if(!tree->children[i]) + { + tree->children[i] = (ColorTree*)lodepng_malloc(sizeof(ColorTree)); + color_tree_init(tree->children[i]); + } + tree = tree->children[i]; + } + tree->index = index; +} + +/*put a pixel, given its RGBA color, into image of any color type*/ +static unsigned rgba8ToPixel(unsigned char* out, size_t i, + const LodePNGColorMode* mode, ColorTree* tree /*for palette*/, + unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + if(mode->colortype == LCT_GREY) + { + unsigned char grey = r; /*((unsigned short)r + g + b) / 3*/; + if(mode->bitdepth == 8) out[i] = grey; + else if(mode->bitdepth == 16) out[i * 2 + 0] = out[i * 2 + 1] = grey; + else + { + /*take the most significant bits of grey*/ + grey = (grey >> (8 - mode->bitdepth)) & ((1 << mode->bitdepth) - 1); + addColorBits(out, i, mode->bitdepth, grey); + } + } + else if(mode->colortype == LCT_RGB) + { + if(mode->bitdepth == 8) + { + out[i * 3 + 0] = r; + out[i * 3 + 1] = g; + out[i * 3 + 2] = b; + } + else + { + out[i * 6 + 0] = out[i * 6 + 1] = r; + out[i * 6 + 2] = out[i * 6 + 3] = g; + out[i * 6 + 4] = out[i * 6 + 5] = b; + } + } + else if(mode->colortype == LCT_PALETTE) + { + int index = color_tree_get(tree, r, g, b, a); + if(index < 0) return 82; /*color not in palette*/ + if(mode->bitdepth == 8) out[i] = index; + else addColorBits(out, i, mode->bitdepth, index); + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + unsigned char grey = r; /*((unsigned short)r + g + b) / 3*/; + if(mode->bitdepth == 8) + { + out[i * 2 + 0] = grey; + out[i * 2 + 1] = a; + } + else if(mode->bitdepth == 16) + { + out[i * 4 + 0] = out[i * 4 + 1] = grey; + out[i * 4 + 2] = out[i * 4 + 3] = a; + } + } + else if(mode->colortype == LCT_RGBA) + { + if(mode->bitdepth == 8) + { + out[i * 4 + 0] = r; + out[i * 4 + 1] = g; + out[i * 4 + 2] = b; + out[i * 4 + 3] = a; + } + else + { + out[i * 8 + 0] = out[i * 8 + 1] = r; + out[i * 8 + 2] = out[i * 8 + 3] = g; + out[i * 8 + 4] = out[i * 8 + 5] = b; + out[i * 8 + 6] = out[i * 8 + 7] = a; + } + } + + return 0; /*no error*/ +} + +/*put a pixel, given its RGBA16 color, into image of any color 16-bitdepth type*/ +static unsigned rgba16ToPixel(unsigned char* out, size_t i, + const LodePNGColorMode* mode, + unsigned short r, unsigned short g, unsigned short b, unsigned short a) +{ + if(mode->bitdepth != 16) return 85; /*must be 16 for this function*/ + if(mode->colortype == LCT_GREY) + { + unsigned short grey = r; /*((unsigned)r + g + b) / 3*/; + out[i * 2 + 0] = (grey >> 8) & 255; + out[i * 2 + 1] = grey & 255; + } + else if(mode->colortype == LCT_RGB) + { + out[i * 6 + 0] = (r >> 8) & 255; + out[i * 6 + 1] = r & 255; + out[i * 6 + 2] = (g >> 8) & 255; + out[i * 6 + 3] = g & 255; + out[i * 6 + 4] = (b >> 8) & 255; + out[i * 6 + 5] = b & 255; + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + unsigned short grey = r; /*((unsigned)r + g + b) / 3*/; + out[i * 4 + 0] = (grey >> 8) & 255; + out[i * 4 + 1] = grey & 255; + out[i * 4 + 2] = (a >> 8) & 255; + out[i * 4 + 3] = a & 255; + } + else if(mode->colortype == LCT_RGBA) + { + out[i * 8 + 0] = (r >> 8) & 255; + out[i * 8 + 1] = r & 255; + out[i * 8 + 2] = (g >> 8) & 255; + out[i * 8 + 3] = g & 255; + out[i * 8 + 4] = (b >> 8) & 255; + out[i * 8 + 5] = b & 255; + out[i * 8 + 6] = (a >> 8) & 255; + out[i * 8 + 7] = a & 255; + } + + return 0; /*no error*/ +} + +/*Get RGBA8 color of pixel with index i (y * width + x) from the raw image with given color type.*/ +static unsigned getPixelColorRGBA8(unsigned char* r, unsigned char* g, + unsigned char* b, unsigned char* a, + const unsigned char* in, size_t i, + const LodePNGColorMode* mode, + unsigned fix_png) +{ + if(mode->colortype == LCT_GREY) + { + if(mode->bitdepth == 8) + { + *r = *g = *b = in[i]; + if(mode->key_defined && *r == mode->key_r) *a = 0; + else *a = 255; + } + else if(mode->bitdepth == 16) + { + *r = *g = *b = in[i * 2 + 0]; + if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; + else *a = 255; + } + else + { + unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ + size_t j = i * mode->bitdepth; + unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); + *r = *g = *b = (value * 255) / highest; + if(mode->key_defined && value == mode->key_r) *a = 0; + else *a = 255; + } + } + else if(mode->colortype == LCT_RGB) + { + if(mode->bitdepth == 8) + { + *r = in[i * 3 + 0]; *g = in[i * 3 + 1]; *b = in[i * 3 + 2]; + if(mode->key_defined && *r == mode->key_r && *g == mode->key_g && *b == mode->key_b) *a = 0; + else *a = 255; + } + else + { + *r = in[i * 6 + 0]; + *g = in[i * 6 + 2]; + *b = in[i * 6 + 4]; + if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; + else *a = 255; + } + } + else if(mode->colortype == LCT_PALETTE) + { + unsigned index; + if(mode->bitdepth == 8) index = in[i]; + else + { + size_t j = i * mode->bitdepth; + index = readBitsFromReversedStream(&j, in, mode->bitdepth); + } + + if(index >= mode->palettesize) + { + /*This is an error according to the PNG spec, but fix_png can ignore it*/ + if(!fix_png) return (mode->bitdepth == 8 ? 46 : 47); /*index out of palette*/ + *r = *g = *b = 0; + *a = 255; + } + else + { + *r = mode->palette[index * 4 + 0]; + *g = mode->palette[index * 4 + 1]; + *b = mode->palette[index * 4 + 2]; + *a = mode->palette[index * 4 + 3]; + } + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + if(mode->bitdepth == 8) + { + *r = *g = *b = in[i * 2 + 0]; + *a = in[i * 2 + 1]; + } + else + { + *r = *g = *b = in[i * 4 + 0]; + *a = in[i * 4 + 2]; + } + } + else if(mode->colortype == LCT_RGBA) + { + if(mode->bitdepth == 8) + { + *r = in[i * 4 + 0]; + *g = in[i * 4 + 1]; + *b = in[i * 4 + 2]; + *a = in[i * 4 + 3]; + } + else + { + *r = in[i * 8 + 0]; + *g = in[i * 8 + 2]; + *b = in[i * 8 + 4]; + *a = in[i * 8 + 6]; + } + } + + return 0; /*no error*/ +} + +/*Similar to getPixelColorRGBA8, but with all the for loops inside of the color +mode test cases, optimized to convert the colors much faster, when converting +to RGBA or RGB with 8 bit per cannel. buffer must be RGBA or RGB output with +enough memory, if has_alpha is true the output is RGBA. mode has the color mode +of the input buffer.*/ +static unsigned getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, + unsigned has_alpha, const unsigned char* in, + const LodePNGColorMode* mode, + unsigned fix_png) +{ + unsigned num_channels = has_alpha ? 4 : 3; + size_t i; + if(mode->colortype == LCT_GREY) + { + if(mode->bitdepth == 8) + { + for(i = 0; i < numpixels; i++, buffer += num_channels) + { + buffer[0] = buffer[1] = buffer[2] = in[i]; + if(has_alpha) buffer[3] = mode->key_defined && in[i] == mode->key_r ? 0 : 255; + } + } + else if(mode->bitdepth == 16) + { + for(i = 0; i < numpixels; i++, buffer += num_channels) + { + buffer[0] = buffer[1] = buffer[2] = in[i * 2]; + if(has_alpha) buffer[3] = mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r ? 0 : 255; + } + } + else + { + unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ + size_t j = 0; + for(i = 0; i < numpixels; i++, buffer += num_channels) + { + unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); + buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; + if(has_alpha) buffer[3] = mode->key_defined && value == mode->key_r ? 0 : 255; + } + } + } + else if(mode->colortype == LCT_RGB) + { + if(mode->bitdepth == 8) + { + for(i = 0; i < numpixels; i++, buffer += num_channels) + { + buffer[0] = in[i * 3 + 0]; + buffer[1] = in[i * 3 + 1]; + buffer[2] = in[i * 3 + 2]; + if(has_alpha) buffer[3] = mode->key_defined && buffer[0] == mode->key_r + && buffer[1]== mode->key_g && buffer[2] == mode->key_b ? 0 : 255; + } + } + else + { + for(i = 0; i < numpixels; i++, buffer += num_channels) + { + buffer[0] = in[i * 6 + 0]; + buffer[1] = in[i * 6 + 2]; + buffer[2] = in[i * 6 + 4]; + if(has_alpha) buffer[3] = mode->key_defined + && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b ? 0 : 255; + } + } + } + else if(mode->colortype == LCT_PALETTE) + { + unsigned index; + size_t j = 0; + for(i = 0; i < numpixels; i++, buffer += num_channels) + { + if(mode->bitdepth == 8) index = in[i]; + else index = readBitsFromReversedStream(&j, in, mode->bitdepth); + + if(index >= mode->palettesize) + { + /*This is an error according to the PNG spec, but fix_png can ignore it*/ + if(!fix_png) return (mode->bitdepth == 8 ? 46 : 47); /*index out of palette*/ + buffer[0] = buffer[1] = buffer[2] = 0; + if(has_alpha) buffer[3] = 255; + } + else + { + buffer[0] = mode->palette[index * 4 + 0]; + buffer[1] = mode->palette[index * 4 + 1]; + buffer[2] = mode->palette[index * 4 + 2]; + if(has_alpha) buffer[3] = mode->palette[index * 4 + 3]; + } + } + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + if(mode->bitdepth == 8) + { + for(i = 0; i < numpixels; i++, buffer += num_channels) + { + buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; + if(has_alpha) buffer[3] = in[i * 2 + 1]; + } + } + else + { + for(i = 0; i < numpixels; i++, buffer += num_channels) + { + buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; + if(has_alpha) buffer[3] = in[i * 4 + 2]; + } + } + } + else if(mode->colortype == LCT_RGBA) + { + if(mode->bitdepth == 8) + { + for(i = 0; i < numpixels; i++, buffer += num_channels) + { + buffer[0] = in[i * 4 + 0]; + buffer[1] = in[i * 4 + 1]; + buffer[2] = in[i * 4 + 2]; + if(has_alpha) buffer[3] = in[i * 4 + 3]; + } + } + else + { + for(i = 0; i < numpixels; i++, buffer += num_channels) + { + buffer[0] = in[i * 8 + 0]; + buffer[1] = in[i * 8 + 2]; + buffer[2] = in[i * 8 + 4]; + if(has_alpha) buffer[3] = in[i * 8 + 6]; + } + } + } + + return 0; /*no error*/ +} + +/*Get RGBA16 color of pixel with index i (y * width + x) from the raw image with +given color type, but the given color type must be 16-bit itself.*/ +static unsigned getPixelColorRGBA16(unsigned short* r, unsigned short* g, unsigned short* b, unsigned short* a, + const unsigned char* in, size_t i, const LodePNGColorMode* mode) +{ + if(mode->bitdepth != 16) return 85; /*error: this function only supports 16-bit input*/ + + if(mode->colortype == LCT_GREY) + { + *r = *g = *b = 256 * in[i * 2 + 0] + in[i * 2 + 1]; + if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; + else *a = 65535; + } + else if(mode->colortype == LCT_RGB) + { + *r = 256 * in[i * 6 + 0] + in[i * 6 + 1]; + *g = 256 * in[i * 6 + 2] + in[i * 6 + 3]; + *b = 256 * in[i * 6 + 4] + in[i * 6 + 5]; + if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; + else *a = 65535; + } + else if(mode->colortype == LCT_GREY_ALPHA) + { + *r = *g = *b = 256 * in[i * 4 + 0] + in[i * 4 + 1]; + *a = 256 * in[i * 4 + 2] + in[i * 4 + 3]; + } + else if(mode->colortype == LCT_RGBA) + { + *r = 256 * in[i * 8 + 0] + in[i * 8 + 1]; + *g = 256 * in[i * 8 + 2] + in[i * 8 + 3]; + *b = 256 * in[i * 8 + 4] + in[i * 8 + 5]; + *a = 256 * in[i * 8 + 6] + in[i * 8 + 7]; + } + else return 85; /*error: this function only supports 16-bit input, not palettes*/ + + return 0; /*no error*/ +} + +/* +converts from any color type to 24-bit or 32-bit (later maybe more supported). return value = LodePNG error code +the out buffer must have (w * h * bpp + 7) / 8 bytes, where bpp is the bits per pixel of the output color type +(lodepng_get_bpp) for < 8 bpp images, there may _not_ be padding bits at the end of scanlines. +*/ +unsigned lodepng_convert(unsigned char* out, const unsigned char* in, + LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, + unsigned w, unsigned h, unsigned fix_png) +{ + unsigned error = 0; + size_t i; + ColorTree tree; + size_t numpixels = w * h; + + if(lodepng_color_mode_equal(mode_out, mode_in)) + { + size_t numbytes = lodepng_get_raw_size(w, h, mode_in); + for(i = 0; i < numbytes; i++) out[i] = in[i]; + return error; + } + + if(mode_out->colortype == LCT_PALETTE) + { + size_t palsize = 1 << mode_out->bitdepth; + if(mode_out->palettesize < palsize) palsize = mode_out->palettesize; + color_tree_init(&tree); + for(i = 0; i < palsize; i++) + { + unsigned char* p = &mode_out->palette[i * 4]; + color_tree_add(&tree, p[0], p[1], p[2], p[3], i); + } + } + + if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16) + { + for(i = 0; i < numpixels; i++) + { + unsigned short r = 0, g = 0, b = 0, a = 0; + error = getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); + if(error) break; + error = rgba16ToPixel(out, i, mode_out, r, g, b, a); + if(error) break; + } + } + else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGBA) + { + error = getPixelColorsRGBA8(out, numpixels, 1, in, mode_in, fix_png); + } + else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGB) + { + error = getPixelColorsRGBA8(out, numpixels, 0, in, mode_in, fix_png); + } + else + { + unsigned char r = 0, g = 0, b = 0, a = 0; + for(i = 0; i < numpixels; i++) + { + error = getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in, fix_png); + if(error) break; + error = rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a); + if(error) break; + } + } + + if(mode_out->colortype == LCT_PALETTE) + { + color_tree_cleanup(&tree); + } + + return error; +} + +#ifdef LODEPNG_COMPILE_ENCODER + +typedef struct ColorProfile +{ + unsigned char sixteenbit; /*needs more than 8 bits per channel*/ + unsigned char sixteenbit_done; + + + unsigned char colored; /*not greyscale*/ + unsigned char colored_done; + + unsigned char key; /*a color key is required, or more*/ + unsigned short key_r; /*these values are always in 16-bit bitdepth in the profile*/ + unsigned short key_g; + unsigned short key_b; + unsigned char alpha; /*alpha channel, or alpha palette, required*/ + unsigned char alpha_done; + + unsigned numcolors; + ColorTree tree; /*for listing the counted colors, up to 256*/ + unsigned char* palette; /*size 1024. Remember up to the first 256 RGBA colors*/ + unsigned maxnumcolors; /*if more than that amount counted*/ + unsigned char numcolors_done; + + unsigned greybits; /*amount of bits required for greyscale (1, 2, 4, 8). Does not take 16 bit into account.*/ + unsigned char greybits_done; + +} ColorProfile; + +static void color_profile_init(ColorProfile* profile, const LodePNGColorMode* mode) +{ + profile->sixteenbit = 0; + profile->sixteenbit_done = mode->bitdepth == 16 ? 0 : 1; + + profile->colored = 0; + profile->colored_done = lodepng_is_greyscale_type(mode) ? 1 : 0; + + profile->key = 0; + profile->alpha = 0; + profile->alpha_done = lodepng_can_have_alpha(mode) ? 0 : 1; + + profile->numcolors = 0; + color_tree_init(&profile->tree); + profile->palette = (unsigned char*)lodepng_malloc(1024); + profile->maxnumcolors = 257; + if(lodepng_get_bpp(mode) <= 8) + { + int bpp = lodepng_get_bpp(mode); + profile->maxnumcolors = bpp == 1 ? 2 : (bpp == 2 ? 4 : (bpp == 4 ? 16 : 256)); + } + profile->numcolors_done = 0; + + profile->greybits = 1; + profile->greybits_done = lodepng_get_bpp(mode) == 1 ? 1 : 0; +} + +static void color_profile_cleanup(ColorProfile* profile) +{ + color_tree_cleanup(&profile->tree); + lodepng_free(profile->palette); +} + +/*function used for debug purposes with C++*/ +/*void printColorProfile(ColorProfile* p) +{ + std::cout << "sixteenbit: " << (int)p->sixteenbit << std::endl; + std::cout << "sixteenbit_done: " << (int)p->sixteenbit_done << std::endl; + std::cout << "colored: " << (int)p->colored << std::endl; + std::cout << "colored_done: " << (int)p->colored_done << std::endl; + std::cout << "key: " << (int)p->key << std::endl; + std::cout << "key_r: " << (int)p->key_r << std::endl; + std::cout << "key_g: " << (int)p->key_g << std::endl; + std::cout << "key_b: " << (int)p->key_b << std::endl; + std::cout << "alpha: " << (int)p->alpha << std::endl; + std::cout << "alpha_done: " << (int)p->alpha_done << std::endl; + std::cout << "numcolors: " << (int)p->numcolors << std::endl; + std::cout << "maxnumcolors: " << (int)p->maxnumcolors << std::endl; + std::cout << "numcolors_done: " << (int)p->numcolors_done << std::endl; + std::cout << "greybits: " << (int)p->greybits << std::endl; + std::cout << "greybits_done: " << (int)p->greybits_done << std::endl; +}*/ + +/*Returns how many bits needed to represent given value (max 8 bit)*/ +unsigned getValueRequiredBits(unsigned short value) +{ + if(value == 0 || value == 255) return 1; + /*The scaling of 2-bit and 4-bit values uses multiples of 85 and 17*/ + if(value % 17 == 0) return value % 85 == 0 ? 2 : 4; + return 8; +} + +/*profile must already have been inited with mode. +It's ok to set some parameters of profile to done already.*/ +static unsigned get_color_profile(ColorProfile* profile, + const unsigned char* in, + size_t numpixels /*must be full image size, for certain filesize based choices*/, + const LodePNGColorMode* mode, + unsigned fix_png) +{ + unsigned error = 0; + size_t i; + + if(mode->bitdepth == 16) + { + for(i = 0; i < numpixels; i++) + { + unsigned short r, g, b, a; + error = getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode); + if(error) break; + + /*a color is considered good for 8-bit if the first byte and the second byte are equal, + (so if it's divisible through 257), NOT necessarily if the second byte is 0*/ + if(!profile->sixteenbit_done + && (((r & 255) != ((r >> 8) & 255)) + || ((g & 255) != ((g >> 8) & 255)) + || ((b & 255) != ((b >> 8) & 255)))) + { + profile->sixteenbit = 1; + profile->sixteenbit_done = 1; + profile->greybits_done = 1; /*greybits is not applicable anymore at 16-bit*/ + profile->numcolors_done = 1; /*counting colors no longer useful, palette doesn't support 16-bit*/ + } + + if(!profile->colored_done && (r != g || r != b)) + { + profile->colored = 1; + profile->colored_done = 1; + profile->greybits_done = 1; /*greybits is not applicable anymore*/ + } + + if(!profile->alpha_done && a != 65535) + { + /*only use color key if numpixels large enough to justify tRNS chunk size*/ + if(a == 0 && numpixels > 16 && !(profile->key && (r != profile->key_r || g != profile->key_g || b != profile->key_b))) + { + if(!profile->alpha && !profile->key) + { + profile->key = 1; + profile->key_r = r; + profile->key_g = g; + profile->key_b = b; + } + } + else + { + profile->alpha = 1; + profile->alpha_done = 1; + profile->greybits_done = 1; /*greybits is not applicable anymore*/ + } + } + + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + if(!profile->alpha_done && a == 65535 && profile->key + && r == profile->key_r && g == profile->key_g && b == profile->key_b) + { + profile->alpha = 1; + profile->alpha_done = 1; + profile->greybits_done = 1; /*greybits is not applicable anymore*/ + } + + if(!profile->greybits_done) + { + /*assuming 8-bit r, this test does not care about 16-bit*/ + unsigned bits = getValueRequiredBits(r); + if(bits > profile->greybits) profile->greybits = bits; + if(profile->greybits >= 8) profile->greybits_done = 1; + } + + if(!profile->numcolors_done) + { + /*assuming 8-bit rgba, this test does not care about 16-bit*/ + if(!color_tree_has(&profile->tree, (unsigned char)r, (unsigned char)g, (unsigned char)b, (unsigned char)a)) + { + color_tree_add(&profile->tree, (unsigned char)r, (unsigned char)g, (unsigned char)b, (unsigned char)a, + profile->numcolors); + if(profile->numcolors < 256) + { + unsigned char* p = profile->palette; + unsigned i = profile->numcolors; + p[i * 4 + 0] = (unsigned char)r; + p[i * 4 + 1] = (unsigned char)g; + p[i * 4 + 2] = (unsigned char)b; + p[i * 4 + 3] = (unsigned char)a; + } + profile->numcolors++; + if(profile->numcolors >= profile->maxnumcolors) profile->numcolors_done = 1; + } + } + + if(profile->alpha_done && profile->numcolors_done + && profile->colored_done && profile->sixteenbit_done && profile->greybits_done) + { + break; + } + }; + } + else /* < 16-bit */ + { + for(i = 0; i < numpixels; i++) + { + unsigned char r = 0, g = 0, b = 0, a = 0; + error = getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode, fix_png); + if(error) break; + + if(!profile->colored_done && (r != g || r != b)) + { + profile->colored = 1; + profile->colored_done = 1; + profile->greybits_done = 1; /*greybits is not applicable anymore*/ + } + + if(!profile->alpha_done && a != 255) + { + if(a == 0 && !(profile->key && (r != profile->key_r || g != profile->key_g || b != profile->key_b))) + { + if(!profile->key) + { + profile->key = 1; + profile->key_r = r; + profile->key_g = g; + profile->key_b = b; + } + } + else + { + profile->alpha = 1; + profile->alpha_done = 1; + profile->greybits_done = 1; /*greybits is not applicable anymore*/ + } + } + + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + if(!profile->alpha_done && a == 255 && profile->key + && r == profile->key_r && g == profile->key_g && b == profile->key_b) + { + profile->alpha = 1; + profile->alpha_done = 1; + profile->greybits_done = 1; /*greybits is not applicable anymore*/ + } + + if(!profile->greybits_done) + { + unsigned bits = getValueRequiredBits(r); + if(bits > profile->greybits) profile->greybits = bits; + if(profile->greybits >= 8) profile->greybits_done = 1; + } + + if(!profile->numcolors_done) + { + if(!color_tree_has(&profile->tree, r, g, b, a)) + { + + color_tree_add(&profile->tree, r, g, b, a, profile->numcolors); + if(profile->numcolors < 256) + { + unsigned char* p = profile->palette; + unsigned i = profile->numcolors; + p[i * 4 + 0] = r; + p[i * 4 + 1] = g; + p[i * 4 + 2] = b; + p[i * 4 + 3] = a; + } + profile->numcolors++; + if(profile->numcolors >= profile->maxnumcolors) profile->numcolors_done = 1; + } + } + + if(profile->alpha_done && profile->numcolors_done && profile->colored_done && profile->greybits_done) + { + break; + } + }; + } + + /*make the profile's key always 16-bit for consistency*/ + if(mode->bitdepth < 16) + { + /*repeat each byte twice*/ + profile->key_r *= 257; + profile->key_g *= 257; + profile->key_b *= 257; + } + + return error; +} + +static void setColorKeyFrom16bit(LodePNGColorMode* mode_out, unsigned r, unsigned g, unsigned b, unsigned bitdepth) +{ + unsigned mask = (1 << bitdepth) - 1; + mode_out->key_defined = 1; + mode_out->key_r = r & mask; + mode_out->key_g = g & mask; + mode_out->key_b = b & mask; +} + +/*updates values of mode with a potentially smaller color model. mode_out should +contain the user chosen color model, but will be overwritten with the new chosen one.*/ +unsigned lodepng_auto_choose_color(LodePNGColorMode* mode_out, + const unsigned char* image, unsigned w, unsigned h, + const LodePNGColorMode* mode_in, + LodePNGAutoConvert auto_convert) +{ + ColorProfile profile; + unsigned error = 0; + int no_nibbles = auto_convert == LAC_AUTO_NO_NIBBLES || auto_convert == LAC_AUTO_NO_NIBBLES_NO_PALETTE; + int no_palette = auto_convert == LAC_AUTO_NO_PALETTE || auto_convert == LAC_AUTO_NO_NIBBLES_NO_PALETTE; + + if(auto_convert == LAC_ALPHA) + { + if(mode_out->colortype != LCT_RGBA && mode_out->colortype != LCT_GREY_ALPHA) return 0; + } + + color_profile_init(&profile, mode_in); + if(auto_convert == LAC_ALPHA) + { + profile.colored_done = 1; + profile.greybits_done = 1; + profile.numcolors_done = 1; + profile.sixteenbit_done = 1; + } + error = get_color_profile(&profile, image, w * h, mode_in, 0 /*fix_png*/); + if(!error && auto_convert == LAC_ALPHA) + { + if(!profile.alpha) + { + mode_out->colortype = (mode_out->colortype == LCT_RGBA ? LCT_RGB : LCT_GREY); + if(profile.key) setColorKeyFrom16bit(mode_out, profile.key_r, profile.key_g, profile.key_b, mode_out->bitdepth); + } + } + else if(!error && auto_convert != LAC_ALPHA) + { + mode_out->key_defined = 0; + + if(profile.sixteenbit) + { + mode_out->bitdepth = 16; + if(profile.alpha) + { + mode_out->colortype = profile.colored ? LCT_RGBA : LCT_GREY_ALPHA; + } + else + { + mode_out->colortype = profile.colored ? LCT_RGB : LCT_GREY; + if(profile.key) setColorKeyFrom16bit(mode_out, profile.key_r, profile.key_g, profile.key_b, mode_out->bitdepth); + } + } + else /*less than 16 bits per channel*/ + { + /*don't add palette overhead if image hasn't got a lot of pixels*/ + unsigned n = profile.numcolors; + int palette_ok = !no_palette && n <= 256 && (n * 2 < w * h); + unsigned palettebits = n <= 2 ? 1 : (n <= 4 ? 2 : (n <= 16 ? 4 : 8)); + int grey_ok = !profile.colored && !profile.alpha; /*grey without alpha, with potentially low bits*/ + if(palette_ok || grey_ok) + { + if(!palette_ok || (grey_ok && profile.greybits <= palettebits)) + { + unsigned grey = profile.key_r; + mode_out->colortype = LCT_GREY; + mode_out->bitdepth = profile.greybits; + if(profile.key) setColorKeyFrom16bit(mode_out, grey, grey, grey, mode_out->bitdepth); + } + else + { + /*fill in the palette*/ + unsigned i; + unsigned char* p = profile.palette; + /*remove potential earlier palette*/ + lodepng_palette_clear(mode_out); + for(i = 0; i < profile.numcolors; i++) + { + error = lodepng_palette_add(mode_out, p[i * 4 + 0], p[i * 4 + 1], p[i * 4 + 2], p[i * 4 + 3]); + if(error) break; + } + + mode_out->colortype = LCT_PALETTE; + mode_out->bitdepth = palettebits; + } + } + else /*8-bit per channel*/ + { + mode_out->bitdepth = 8; + if(profile.alpha) + { + mode_out->colortype = profile.colored ? LCT_RGBA : LCT_GREY_ALPHA; + } + else + { + mode_out->colortype = profile.colored ? LCT_RGB : LCT_GREY /*LCT_GREY normally won't occur, already done earlier*/; + if(profile.key) setColorKeyFrom16bit(mode_out, profile.key_r, profile.key_g, profile.key_b, mode_out->bitdepth); + } + } + } + } + + color_profile_cleanup(&profile); + + if(mode_out->colortype == LCT_PALETTE && mode_in->palettesize == mode_out->palettesize) + { + /*In this case keep the palette order of the input, so that the user can choose an optimal one*/ + size_t i; + for(i = 0; i < mode_in->palettesize * 4; i++) + { + mode_out->palette[i] = mode_in->palette[i]; + } + } + + if(no_nibbles && mode_out->bitdepth < 8) + { + /*palette can keep its small amount of colors, as long as no indices use it*/ + mode_out->bitdepth = 8; + } + + return error; +} + +#endif /* #ifdef LODEPNG_COMPILE_ENCODER */ + +/* +Paeth predicter, used by PNG filter type 4 +The parameters are of type short, but should come from unsigned chars, the shorts +are only needed to make the paeth calculation correct. +*/ +static unsigned char paethPredictor(short a, short b, short c) +{ + short pa = abs(b - c); + short pb = abs(a - c); + short pc = abs(a + b - c - c); + + if(pc < pa && pc < pb) return (unsigned char)c; + else if(pb < pa) return (unsigned char)b; + else return (unsigned char)a; +} + +/*shared values used by multiple Adam7 related functions*/ + +static const unsigned ADAM7_IX[7] = { 0, 4, 0, 2, 0, 1, 0 }; /*x start values*/ +static const unsigned ADAM7_IY[7] = { 0, 0, 4, 0, 2, 0, 1 }; /*y start values*/ +static const unsigned ADAM7_DX[7] = { 8, 8, 4, 4, 2, 2, 1 }; /*x delta values*/ +static const unsigned ADAM7_DY[7] = { 8, 8, 8, 4, 4, 2, 2 }; /*y delta values*/ + +/* +Outputs various dimensions and positions in the image related to the Adam7 reduced images. +passw: output containing the width of the 7 passes +passh: output containing the height of the 7 passes +filter_passstart: output containing the index of the start and end of each + reduced image with filter bytes +padded_passstart output containing the index of the start and end of each + reduced image when without filter bytes but with padded scanlines +passstart: output containing the index of the start and end of each reduced + image without padding between scanlines, but still padding between the images +w, h: width and height of non-interlaced image +bpp: bits per pixel +"padded" is only relevant if bpp is less than 8 and a scanline or image does not + end at a full byte +*/ +static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t filter_passstart[8], + size_t padded_passstart[8], size_t passstart[8], unsigned w, unsigned h, unsigned bpp) +{ + /*the passstart values have 8 values: the 8th one indicates the byte after the end of the 7th (= last) pass*/ + unsigned i; + + /*calculate width and height in pixels of each pass*/ + for(i = 0; i < 7; i++) + { + passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i]; + passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i]; + if(passw[i] == 0) passh[i] = 0; + if(passh[i] == 0) passw[i] = 0; + } + + filter_passstart[0] = padded_passstart[0] = passstart[0] = 0; + for(i = 0; i < 7; i++) + { + /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/ + filter_passstart[i + 1] = filter_passstart[i] + + ((passw[i] && passh[i]) ? passh[i] * (1 + (passw[i] * bpp + 7) / 8) : 0); + /*bits padded if needed to fill full byte at end of each scanline*/ + padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7) / 8); + /*only padded at end of reduced image*/ + passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7) / 8; + } +} + +#ifdef LODEPNG_COMPILE_DECODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG Decoder / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*read the information from the header and store it in the LodePNGInfo. return value is error*/ +unsigned lodepng_inspect(unsigned* w, unsigned* h, LodePNGState* state, + const unsigned char* in, size_t insize) +{ + LodePNGInfo* info = &state->info_png; + if(insize == 0 || in == 0) + { + CERROR_RETURN_ERROR(state->error, 48); /*error: the given data is empty*/ + } + if(insize < 29) + { + CERROR_RETURN_ERROR(state->error, 27); /*error: the data length is smaller than the length of a PNG header*/ + } + + /*when decoding a new PNG image, make sure all parameters created after previous decoding are reset*/ + lodepng_info_cleanup(info); + lodepng_info_init(info); + + if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71 + || in[4] != 13 || in[5] != 10 || in[6] != 26 || in[7] != 10) + { + CERROR_RETURN_ERROR(state->error, 28); /*error: the first 8 bytes are not the correct PNG signature*/ + } + if(in[12] != 'I' || in[13] != 'H' || in[14] != 'D' || in[15] != 'R') + { + CERROR_RETURN_ERROR(state->error, 29); /*error: it doesn't start with a IHDR chunk!*/ + } + + /*read the values given in the header*/ + *w = lodepng_read32bitInt(&in[16]); + *h = lodepng_read32bitInt(&in[20]); + info->color.bitdepth = in[24]; + info->color.colortype = (LodePNGColorType)in[25]; + info->compression_method = in[26]; + info->filter_method = in[27]; + info->interlace_method = in[28]; + + if(!state->decoder.ignore_crc) + { + unsigned CRC = lodepng_read32bitInt(&in[29]); + unsigned checksum = lodepng_crc32(&in[12], 17); + if(CRC != checksum) + { + CERROR_RETURN_ERROR(state->error, 57); /*invalid CRC*/ + } + } + + /*error: only compression method 0 is allowed in the specification*/ + if(info->compression_method != 0) CERROR_RETURN_ERROR(state->error, 32); + /*error: only filter method 0 is allowed in the specification*/ + if(info->filter_method != 0) CERROR_RETURN_ERROR(state->error, 33); + /*error: only interlace methods 0 and 1 exist in the specification*/ + if(info->interlace_method > 1) CERROR_RETURN_ERROR(state->error, 34); + + state->error = checkColorValidity(info->color.colortype, info->color.bitdepth); + return state->error; +} + +static unsigned unfilterScanline(unsigned char* recon, const unsigned char* scanline, const unsigned char* precon, + size_t bytewidth, unsigned char filterType, size_t length) +{ + /* + For PNG filter method 0 + unfilter a PNG image scanline by scanline. when the pixels are smaller than 1 byte, + the filter works byte per byte (bytewidth = 1) + precon is the previous unfiltered scanline, recon the result, scanline the current one + the incoming scanlines do NOT include the filtertype byte, that one is given in the parameter filterType instead + recon and scanline MAY be the same memory address! precon must be disjoint. + */ + + size_t i; + switch(filterType) + { + case 0: + for(i = 0; i < length; i++) recon[i] = scanline[i]; + break; + case 1: + for(i = 0; i < bytewidth; i++) recon[i] = scanline[i]; + for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + recon[i - bytewidth]; + break; + case 2: + if(precon) + { + for(i = 0; i < length; i++) recon[i] = scanline[i] + precon[i]; + } + else + { + for(i = 0; i < length; i++) recon[i] = scanline[i]; + } + break; + case 3: + if(precon) + { + for(i = 0; i < bytewidth; i++) recon[i] = scanline[i] + precon[i] / 2; + for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + ((recon[i - bytewidth] + precon[i]) / 2); + } + else + { + for(i = 0; i < bytewidth; i++) recon[i] = scanline[i]; + for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + recon[i - bytewidth] / 2; + } + break; + case 4: + if(precon) + { + for(i = 0; i < bytewidth; i++) + { + recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[i]*/ + } + for(i = bytewidth; i < length; i++) + { + recon[i] = (scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[i - bytewidth])); + } + } + else + { + for(i = 0; i < bytewidth; i++) + { + recon[i] = scanline[i]; + } + for(i = bytewidth; i < length; i++) + { + /*paethPredictor(recon[i - bytewidth], 0, 0) is always recon[i - bytewidth]*/ + recon[i] = (scanline[i] + recon[i - bytewidth]); + } + } + break; + default: return 36; /*error: unexisting filter type given*/ + } + return 0; +} + +static unsigned unfilter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) +{ + /* + For PNG filter method 0 + this function unfilters a single image (e.g. without interlacing this is called once, with Adam7 seven times) + out must have enough bytes allocated already, in must have the scanlines + 1 filtertype byte per scanline + w and h are image dimensions or dimensions of reduced image, bpp is bits per pixel + in and out are allowed to be the same memory address (but aren't the same size since in has the extra filter bytes) + */ + + unsigned y; + unsigned char* prevline = 0; + + /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ + size_t bytewidth = (bpp + 7) / 8; + size_t linebytes = (w * bpp + 7) / 8; + + for(y = 0; y < h; y++) + { + size_t outindex = linebytes * y; + size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + unsigned char filterType = in[inindex]; + + CERROR_TRY_RETURN(unfilterScanline(&out[outindex], &in[inindex + 1], prevline, bytewidth, filterType, linebytes)); + + prevline = &out[outindex]; + } + + return 0; +} + +/* +in: Adam7 interlaced image, with no padding bits between scanlines, but between + reduced images so that each reduced image starts at a byte. +out: the same pixels, but re-ordered so that they're now a non-interlaced image with size w*h +bpp: bits per pixel +out has the following size in bits: w * h * bpp. +in is possibly bigger due to padding bits between reduced images. +out must be big enough AND must be 0 everywhere if bpp < 8 in the current implementation +(because that's likely a little bit faster) +NOTE: comments about padding bits are only relevant if bpp < 8 +*/ +static void Adam7_deinterlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) +{ + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + if(bpp >= 8) + { + for(i = 0; i < 7; i++) + { + unsigned x, y, b; + size_t bytewidth = bpp / 8; + for(y = 0; y < passh[i]; y++) + for(x = 0; x < passw[i]; x++) + { + size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth; + size_t pixeloutstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; + for(b = 0; b < bytewidth; b++) + { + out[pixeloutstart + b] = in[pixelinstart + b]; + } + } + } + } + else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ + { + for(i = 0; i < 7; i++) + { + unsigned x, y, b; + unsigned ilinebits = bpp * passw[i]; + unsigned olinebits = bpp * w; + size_t obp, ibp; /*bit pointers (for out and in buffer)*/ + for(y = 0; y < passh[i]; y++) + for(x = 0; x < passw[i]; x++) + { + ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp); + obp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; + for(b = 0; b < bpp; b++) + { + unsigned char bit = readBitFromReversedStream(&ibp, in); + /*note that this function assumes the out buffer is completely 0, use setBitOfReversedStream otherwise*/ + setBitOfReversedStream0(&obp, out, bit); + } + } + } + } +} + +static void removePaddingBits(unsigned char* out, const unsigned char* in, + size_t olinebits, size_t ilinebits, unsigned h) +{ + /* + After filtering there are still padding bits if scanlines have non multiple of 8 bit amounts. They need + to be removed (except at last scanline of (Adam7-reduced) image) before working with pure image buffers + for the Adam7 code, the color convert code and the output to the user. + in and out are allowed to be the same buffer, in may also be higher but still overlapping; in must + have >= ilinebits*h bits, out must have >= olinebits*h bits, olinebits must be <= ilinebits + also used to move bits after earlier such operations happened, e.g. in a sequence of reduced images from Adam7 + only useful if (ilinebits - olinebits) is a value in the range 1..7 + */ + unsigned y; + size_t diff = ilinebits - olinebits; + size_t ibp = 0, obp = 0; /*input and output bit pointers*/ + for(y = 0; y < h; y++) + { + size_t x; + for(x = 0; x < olinebits; x++) + { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + ibp += diff; + } +} + +/*out must be buffer big enough to contain full image, and in must contain the full decompressed data from +the IDAT chunks (with filter index bytes and possible padding bits) +return value is error*/ +static unsigned postProcessScanlines(unsigned char* out, unsigned char* in, + unsigned w, unsigned h, const LodePNGInfo* info_png) +{ + /* + This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype. + Steps: + *) if no Adam7: 1) unfilter 2) remove padding bits (= posible extra bits per scanline if bpp < 8) + *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace + NOTE: the in buffer will be overwritten with intermediate data! + */ + unsigned bpp = lodepng_get_bpp(&info_png->color); + if(bpp == 0) return 31; /*error: invalid colortype*/ + + if(info_png->interlace_method == 0) + { + if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8) + { + CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp)); + removePaddingBits(out, in, w * bpp, ((w * bpp + 7) / 8) * 8, h); + } + /*we can immediatly filter into the out buffer, no other steps needed*/ + else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp)); + } + else /*interlace_method is 1 (Adam7)*/ + { + unsigned passw[7], passh[7]; size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + for(i = 0; i < 7; i++) + { + CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp)); + /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline, + move bytes instead of bits or move not at all*/ + if(bpp < 8) + { + /*remove padding bits in scanlines; after this there still may be padding + bits between the different reduced images: each reduced image still starts nicely at a byte*/ + removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp, + ((passw[i] * bpp + 7) / 8) * 8, passh[i]); + } + } + + Adam7_deinterlace(out, in, w, h, bpp); + } + + return 0; +} + +static unsigned readChunk_PLTE(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) +{ + unsigned pos = 0, i; + if(color->palette) lodepng_free(color->palette); + color->palettesize = chunkLength / 3; + color->palette = (unsigned char*)lodepng_malloc(4 * color->palettesize); + if(!color->palette && color->palettesize) + { + color->palettesize = 0; + return 83; /*alloc fail*/ + } + if(color->palettesize > 256) return 38; /*error: palette too big*/ + + for(i = 0; i < color->palettesize; i++) + { + color->palette[4 * i + 0] = data[pos++]; /*R*/ + color->palette[4 * i + 1] = data[pos++]; /*G*/ + color->palette[4 * i + 2] = data[pos++]; /*B*/ + color->palette[4 * i + 3] = 255; /*alpha*/ + } + + return 0; /* OK */ +} + +static unsigned readChunk_tRNS(LodePNGColorMode* color, const unsigned char* data, size_t chunkLength) +{ + unsigned i; + if(color->colortype == LCT_PALETTE) + { + /*error: more alpha values given than there are palette entries*/ + if(chunkLength > color->palettesize) return 38; + + for(i = 0; i < chunkLength; i++) color->palette[4 * i + 3] = data[i]; + } + else if(color->colortype == LCT_GREY) + { + /*error: this chunk must be 2 bytes for greyscale image*/ + if(chunkLength != 2) return 30; + + color->key_defined = 1; + color->key_r = color->key_g = color->key_b = 256 * data[0] + data[1]; + } + else if(color->colortype == LCT_RGB) + { + /*error: this chunk must be 6 bytes for RGB image*/ + if(chunkLength != 6) return 41; + + color->key_defined = 1; + color->key_r = 256 * data[0] + data[1]; + color->key_g = 256 * data[2] + data[3]; + color->key_b = 256 * data[4] + data[5]; + } + else return 42; /*error: tRNS chunk not allowed for other color models*/ + + return 0; /* OK */ +} + + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*background color chunk (bKGD)*/ +static unsigned readChunk_bKGD(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) +{ + if(info->color.colortype == LCT_PALETTE) + { + /*error: this chunk must be 1 byte for indexed color image*/ + if(chunkLength != 1) return 43; + + info->background_defined = 1; + info->background_r = info->background_g = info->background_b = data[0]; + } + else if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) + { + /*error: this chunk must be 2 bytes for greyscale image*/ + if(chunkLength != 2) return 44; + + info->background_defined = 1; + info->background_r = info->background_g = info->background_b + = 256 * data[0] + data[1]; + } + else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) + { + /*error: this chunk must be 6 bytes for greyscale image*/ + if(chunkLength != 6) return 45; + + info->background_defined = 1; + info->background_r = 256 * data[0] + data[1]; + info->background_g = 256 * data[2] + data[3]; + info->background_b = 256 * data[4] + data[5]; + } + + return 0; /* OK */ +} + +/*text chunk (tEXt)*/ +static unsigned readChunk_tEXt(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) +{ + unsigned error = 0; + char *key = 0, *str = 0; + unsigned i; + + while(!error) /*not really a while loop, only used to break on error*/ + { + unsigned length, string2_begin; + + length = 0; + while(length < chunkLength && data[length] != 0) length++; + /*even though it's not allowed by the standard, no error is thrown if + there's no null termination char, if the text is empty*/ + if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ + + key = (char*)lodepng_malloc(length + 1); + if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ + + key[length] = 0; + for(i = 0; i < length; i++) key[i] = data[i]; + + string2_begin = length + 1; /*skip keyword null terminator*/ + + length = chunkLength < string2_begin ? 0 : chunkLength - string2_begin; + str = (char*)lodepng_malloc(length + 1); + if(!str) CERROR_BREAK(error, 83); /*alloc fail*/ + + str[length] = 0; + for(i = 0; i < length; i++) str[i] = data[string2_begin + i]; + + error = lodepng_add_text(info, key, str); + + break; + } + + lodepng_free(key); + lodepng_free(str); + + return error; +} + +/*compressed text chunk (zTXt)*/ +static unsigned readChunk_zTXt(LodePNGInfo* info, const LodePNGDecompressSettings* zlibsettings, + const unsigned char* data, size_t chunkLength) +{ + unsigned error = 0; + unsigned i; + + unsigned length, string2_begin; + char *key = 0; + ucvector decoded; + + ucvector_init(&decoded); + + while(!error) /*not really a while loop, only used to break on error*/ + { + for(length = 0; length < chunkLength && data[length] != 0; length++) ; + if(length + 2 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ + if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ + + key = (char*)lodepng_malloc(length + 1); + if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ + + key[length] = 0; + for(i = 0; i < length; i++) key[i] = data[i]; + + if(data[length + 1] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ + + string2_begin = length + 2; + if(string2_begin > chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ + + length = chunkLength - string2_begin; + /*will fail if zlib error, e.g. if length is too small*/ + error = zlib_decompress(&decoded.data, &decoded.size, + (unsigned char*)(&data[string2_begin]), + length, zlibsettings); + if(error) break; + ucvector_push_back(&decoded, 0); + + error = lodepng_add_text(info, key, (char*)decoded.data); + + break; + } + + lodepng_free(key); + ucvector_cleanup(&decoded); + + return error; +} + +/*international text chunk (iTXt)*/ +static unsigned readChunk_iTXt(LodePNGInfo* info, const LodePNGDecompressSettings* zlibsettings, + const unsigned char* data, size_t chunkLength) +{ + unsigned error = 0; + unsigned i; + + unsigned length, begin, compressed; + char *key = 0, *langtag = 0, *transkey = 0; + ucvector decoded; + ucvector_init(&decoded); + + while(!error) /*not really a while loop, only used to break on error*/ + { + /*Quick check if the chunk length isn't too small. Even without check + it'd still fail with other error checks below if it's too short. This just gives a different error code.*/ + if(chunkLength < 5) CERROR_BREAK(error, 30); /*iTXt chunk too short*/ + + /*read the key*/ + for(length = 0; length < chunkLength && data[length] != 0; length++) ; + if(length + 3 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination char, corrupt?*/ + if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ + + key = (char*)lodepng_malloc(length + 1); + if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ + + key[length] = 0; + for(i = 0; i < length; i++) key[i] = data[i]; + + /*read the compression method*/ + compressed = data[length + 1]; + if(data[length + 2] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ + + /*even though it's not allowed by the standard, no error is thrown if + there's no null termination char, if the text is empty for the next 3 texts*/ + + /*read the langtag*/ + begin = length + 3; + length = 0; + for(i = begin; i < chunkLength && data[i] != 0; i++) length++; + + langtag = (char*)lodepng_malloc(length + 1); + if(!langtag) CERROR_BREAK(error, 83); /*alloc fail*/ + + langtag[length] = 0; + for(i = 0; i < length; i++) langtag[i] = data[begin + i]; + + /*read the transkey*/ + begin += length + 1; + length = 0; + for(i = begin; i < chunkLength && data[i] != 0; i++) length++; + + transkey = (char*)lodepng_malloc(length + 1); + if(!transkey) CERROR_BREAK(error, 83); /*alloc fail*/ + + transkey[length] = 0; + for(i = 0; i < length; i++) transkey[i] = data[begin + i]; + + /*read the actual text*/ + begin += length + 1; + + length = chunkLength < begin ? 0 : chunkLength - begin; + + if(compressed) + { + /*will fail if zlib error, e.g. if length is too small*/ + error = zlib_decompress(&decoded.data, &decoded.size, + (unsigned char*)(&data[begin]), + length, zlibsettings); + if(error) break; + if(decoded.allocsize < decoded.size) decoded.allocsize = decoded.size; + ucvector_push_back(&decoded, 0); + } + else + { + if(!ucvector_resize(&decoded, length + 1)) CERROR_BREAK(error, 83 /*alloc fail*/); + + decoded.data[length] = 0; + for(i = 0; i < length; i++) decoded.data[i] = data[begin + i]; + } + + error = lodepng_add_itext(info, key, langtag, transkey, (char*)decoded.data); + + break; + } + + lodepng_free(key); + lodepng_free(langtag); + lodepng_free(transkey); + ucvector_cleanup(&decoded); + + return error; +} + +static unsigned readChunk_tIME(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) +{ + if(chunkLength != 7) return 73; /*invalid tIME chunk size*/ + + info->time_defined = 1; + info->time.year = 256 * data[0] + data[+ 1]; + info->time.month = data[2]; + info->time.day = data[3]; + info->time.hour = data[4]; + info->time.minute = data[5]; + info->time.second = data[6]; + + return 0; /* OK */ +} + +static unsigned readChunk_pHYs(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) +{ + if(chunkLength != 9) return 74; /*invalid pHYs chunk size*/ + + info->phys_defined = 1; + info->phys_x = 16777216 * data[0] + 65536 * data[1] + 256 * data[2] + data[3]; + info->phys_y = 16777216 * data[4] + 65536 * data[5] + 256 * data[6] + data[7]; + info->phys_unit = data[8]; + + return 0; /* OK */ +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/*read a PNG, the result will be in the same color type as the PNG (hence "generic")*/ +static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize) +{ + unsigned char IEND = 0; + const unsigned char* chunk; + size_t i; + ucvector idat; /*the data from idat chunks*/ + ucvector scanlines; + + /*for unknown chunk order*/ + unsigned unknown = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + unsigned critical_pos = 1; /*1 = after IHDR, 2 = after PLTE, 3 = after IDAT*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + + /*provide some proper output values if error will happen*/ + *out = 0; + + state->error = lodepng_inspect(w, h, state, in, insize); /*reads header and resets other parameters in state->info_png*/ + if(state->error) return; + + ucvector_init(&idat); + chunk = &in[33]; /*first byte of the first chunk after the header*/ + + /*loop through the chunks, ignoring unknown chunks and stopping at IEND chunk. + IDAT data is put at the start of the in buffer*/ + while(!IEND && !state->error) + { + unsigned chunkLength; + const unsigned char* data; /*the data in the chunk*/ + + /*error: size of the in buffer too small to contain next chunk*/ + if((size_t)((chunk - in) + 12) > insize || chunk < in) CERROR_BREAK(state->error, 30); + + /*length of the data of the chunk, excluding the length bytes, chunk type and CRC bytes*/ + chunkLength = lodepng_chunk_length(chunk); + /*error: chunk length larger than the max PNG chunk size*/ + if(chunkLength > 2147483647) CERROR_BREAK(state->error, 63); + + if((size_t)((chunk - in) + chunkLength + 12) > insize || (chunk + chunkLength + 12) < in) + { + CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk*/ + } + + data = lodepng_chunk_data_const(chunk); + + /*IDAT chunk, containing compressed image data*/ + if(lodepng_chunk_type_equals(chunk, "IDAT")) + { + size_t oldsize = idat.size; + if(!ucvector_resize(&idat, oldsize + chunkLength)) CERROR_BREAK(state->error, 83 /*alloc fail*/); + for(i = 0; i < chunkLength; i++) idat.data[oldsize + i] = data[i]; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + critical_pos = 3; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + /*IEND chunk*/ + else if(lodepng_chunk_type_equals(chunk, "IEND")) + { + IEND = 1; + } + /*palette chunk (PLTE)*/ + else if(lodepng_chunk_type_equals(chunk, "PLTE")) + { + state->error = readChunk_PLTE(&state->info_png.color, data, chunkLength); + if(state->error) break; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + critical_pos = 2; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + /*palette transparency chunk (tRNS)*/ + else if(lodepng_chunk_type_equals(chunk, "tRNS")) + { + state->error = readChunk_tRNS(&state->info_png.color, data, chunkLength); + if(state->error) break; + } +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*background color chunk (bKGD)*/ + else if(lodepng_chunk_type_equals(chunk, "bKGD")) + { + state->error = readChunk_bKGD(&state->info_png, data, chunkLength); + if(state->error) break; + } + /*text chunk (tEXt)*/ + else if(lodepng_chunk_type_equals(chunk, "tEXt")) + { + if(state->decoder.read_text_chunks) + { + state->error = readChunk_tEXt(&state->info_png, data, chunkLength); + if(state->error) break; + } + } + /*compressed text chunk (zTXt)*/ + else if(lodepng_chunk_type_equals(chunk, "zTXt")) + { + if(state->decoder.read_text_chunks) + { + state->error = readChunk_zTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); + if(state->error) break; + } + } + /*international text chunk (iTXt)*/ + else if(lodepng_chunk_type_equals(chunk, "iTXt")) + { + if(state->decoder.read_text_chunks) + { + state->error = readChunk_iTXt(&state->info_png, &state->decoder.zlibsettings, data, chunkLength); + if(state->error) break; + } + } + else if(lodepng_chunk_type_equals(chunk, "tIME")) + { + state->error = readChunk_tIME(&state->info_png, data, chunkLength); + if(state->error) break; + } + else if(lodepng_chunk_type_equals(chunk, "pHYs")) + { + state->error = readChunk_pHYs(&state->info_png, data, chunkLength); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + else /*it's not an implemented chunk type, so ignore it: skip over the data*/ + { + /*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/ + if(!lodepng_chunk_ancillary(chunk)) CERROR_BREAK(state->error, 69); + + unknown = 1; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + if(state->decoder.remember_unknown_chunks) + { + state->error = lodepng_chunk_append(&state->info_png.unknown_chunks_data[critical_pos - 1], + &state->info_png.unknown_chunks_size[critical_pos - 1], chunk); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + + if(!state->decoder.ignore_crc && !unknown) /*check CRC if wanted, only on known chunk types*/ + { + if(lodepng_chunk_check_crc(chunk)) CERROR_BREAK(state->error, 57); /*invalid CRC*/ + } + + if(!IEND) chunk = lodepng_chunk_next_const(chunk); + } + + ucvector_init(&scanlines); + if(!state->error) + { + /*maximum final image length is already reserved in the vector's length - this is not really necessary*/ + if(!ucvector_resize(&scanlines, lodepng_get_raw_size(*w, *h, &state->info_png.color) + *h)) + { + state->error = 83; /*alloc fail*/ + } + } + if(!state->error) + { + /*decompress with the Zlib decompressor*/ + state->error = zlib_decompress(&scanlines.data, &scanlines.size, idat.data, + idat.size, &state->decoder.zlibsettings); + } + ucvector_cleanup(&idat); + + if(!state->error) + { + ucvector outv; + ucvector_init(&outv); + if(!ucvector_resizev(&outv, + lodepng_get_raw_size(*w, *h, &state->info_png.color), 0)) state->error = 83; /*alloc fail*/ + if(!state->error) state->error = postProcessScanlines(outv.data, scanlines.data, *w, *h, &state->info_png); + *out = outv.data; + } + ucvector_cleanup(&scanlines); +} + +unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize) +{ + *out = 0; + decodeGeneric(out, w, h, state, in, insize); + if(state->error) return state->error; + if(!state->decoder.color_convert || lodepng_color_mode_equal(&state->info_raw, &state->info_png.color)) + { + /*same color type, no copying or converting of data needed*/ + /*store the info_png color settings on the info_raw so that the info_raw still reflects what colortype + the raw image has to the end user*/ + if(!state->decoder.color_convert) + { + state->error = lodepng_color_mode_copy(&state->info_raw, &state->info_png.color); + if(state->error) return state->error; + } + } + else + { + /*color conversion needed; sort of copy of the data*/ + unsigned char* data = *out; + size_t outsize; + + /*TODO: check if this works according to the statement in the documentation: "The converter can convert + from greyscale input color type, to 8-bit greyscale or greyscale with alpha"*/ + if(!(state->info_raw.colortype == LCT_RGB || state->info_raw.colortype == LCT_RGBA) + && !(state->info_raw.bitdepth == 8)) + { + return 56; /*unsupported color mode conversion*/ + } + + outsize = lodepng_get_raw_size(*w, *h, &state->info_raw); + *out = (unsigned char*)lodepng_malloc(outsize); + if(!(*out)) + { + state->error = 83; /*alloc fail*/ + } + else state->error = lodepng_convert(*out, data, &state->info_raw, &state->info_png.color, *w, *h, state->decoder.fix_png); + lodepng_free(data); + } + return state->error; +} + +unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, + size_t insize, LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned error; + LodePNGState state; + lodepng_state_init(&state); + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; + error = lodepng_decode(out, w, h, &state, in, insize); + lodepng_state_cleanup(&state); + return error; +} + +unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) +{ + return lodepng_decode_memory(out, w, h, in, insize, LCT_RGBA, 8); +} + +unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, const unsigned char* in, size_t insize) +{ + return lodepng_decode_memory(out, w, h, in, insize, LCT_RGB, 8); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename, + LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char* buffer; + size_t buffersize; + unsigned error; + error = lodepng_load_file(&buffer, &buffersize, filename); + if(!error) error = lodepng_decode_memory(out, w, h, buffer, buffersize, colortype, bitdepth); + lodepng_free(buffer); + return error; +} + +unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) +{ + return lodepng_decode_file(out, w, h, filename, LCT_RGBA, 8); +} + +unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, const char* filename) +{ + return lodepng_decode_file(out, w, h, filename, LCT_RGB, 8); +} +#endif /*LODEPNG_COMPILE_DISK*/ + +void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings) +{ + settings->color_convert = 1; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + settings->read_text_chunks = 1; + settings->remember_unknown_chunks = 0; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + settings->ignore_crc = 0; + settings->fix_png = 0; + lodepng_decompress_settings_init(&settings->zlibsettings); +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) + +void lodepng_state_init(LodePNGState* state) +{ +#ifdef LODEPNG_COMPILE_DECODER + lodepng_decoder_settings_init(&state->decoder); +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER + lodepng_encoder_settings_init(&state->encoder); +#endif /*LODEPNG_COMPILE_ENCODER*/ + lodepng_color_mode_init(&state->info_raw); + lodepng_info_init(&state->info_png); + state->error = 1; +} + +void lodepng_state_cleanup(LodePNGState* state) +{ + lodepng_color_mode_cleanup(&state->info_raw); + lodepng_info_cleanup(&state->info_png); +} + +void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source) +{ + lodepng_state_cleanup(dest); + *dest = *source; + lodepng_color_mode_init(&dest->info_raw); + lodepng_info_init(&dest->info_png); + dest->error = lodepng_color_mode_copy(&dest->info_raw, &source->info_raw); if(dest->error) return; + dest->error = lodepng_info_copy(&dest->info_png, &source->info_png); if(dest->error) return; +} + +#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ + +#ifdef LODEPNG_COMPILE_ENCODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG Encoder / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*chunkName must be string of 4 characters*/ +static unsigned addChunk(ucvector* out, const char* chunkName, const unsigned char* data, size_t length) +{ + CERROR_TRY_RETURN(lodepng_chunk_create(&out->data, &out->size, (unsigned)length, chunkName, data)); + out->allocsize = out->size; /*fix the allocsize again*/ + return 0; +} + +static void writeSignature(ucvector* out) +{ + /*8 bytes PNG signature, aka the magic bytes*/ + ucvector_push_back(out, 137); + ucvector_push_back(out, 80); + ucvector_push_back(out, 78); + ucvector_push_back(out, 71); + ucvector_push_back(out, 13); + ucvector_push_back(out, 10); + ucvector_push_back(out, 26); + ucvector_push_back(out, 10); +} + +static unsigned addChunk_IHDR(ucvector* out, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth, unsigned interlace_method) +{ + unsigned error = 0; + ucvector header; + ucvector_init(&header); + + lodepng_add32bitInt(&header, w); /*width*/ + lodepng_add32bitInt(&header, h); /*height*/ + ucvector_push_back(&header, (unsigned char)bitdepth); /*bit depth*/ + ucvector_push_back(&header, (unsigned char)colortype); /*color type*/ + ucvector_push_back(&header, 0); /*compression method*/ + ucvector_push_back(&header, 0); /*filter method*/ + ucvector_push_back(&header, interlace_method); /*interlace method*/ + + error = addChunk(out, "IHDR", header.data, header.size); + ucvector_cleanup(&header); + + return error; +} + +static unsigned addChunk_PLTE(ucvector* out, const LodePNGColorMode* info) +{ + unsigned error = 0; + size_t i; + ucvector PLTE; + ucvector_init(&PLTE); + for(i = 0; i < info->palettesize * 4; i++) + { + /*add all channels except alpha channel*/ + if(i % 4 != 3) ucvector_push_back(&PLTE, info->palette[i]); + } + error = addChunk(out, "PLTE", PLTE.data, PLTE.size); + ucvector_cleanup(&PLTE); + + return error; +} + +static unsigned addChunk_tRNS(ucvector* out, const LodePNGColorMode* info) +{ + unsigned error = 0; + size_t i; + ucvector tRNS; + ucvector_init(&tRNS); + if(info->colortype == LCT_PALETTE) + { + size_t amount = info->palettesize; + /*the tail of palette values that all have 255 as alpha, does not have to be encoded*/ + for(i = info->palettesize; i > 0; i--) + { + if(info->palette[4 * (i - 1) + 3] == 255) amount--; + else break; + } + /*add only alpha channel*/ + for(i = 0; i < amount; i++) ucvector_push_back(&tRNS, info->palette[4 * i + 3]); + } + else if(info->colortype == LCT_GREY) + { + if(info->key_defined) + { + ucvector_push_back(&tRNS, (unsigned char)(info->key_r / 256)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_r % 256)); + } + } + else if(info->colortype == LCT_RGB) + { + if(info->key_defined) + { + ucvector_push_back(&tRNS, (unsigned char)(info->key_r / 256)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_r % 256)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_g / 256)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_g % 256)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_b / 256)); + ucvector_push_back(&tRNS, (unsigned char)(info->key_b % 256)); + } + } + + error = addChunk(out, "tRNS", tRNS.data, tRNS.size); + ucvector_cleanup(&tRNS); + + return error; +} + +static unsigned addChunk_IDAT(ucvector* out, const unsigned char* data, size_t datasize, + LodePNGCompressSettings* zlibsettings) +{ + ucvector zlibdata; + unsigned error = 0; + + /*compress with the Zlib compressor*/ + ucvector_init(&zlibdata); + error = zlib_compress(&zlibdata.data, &zlibdata.size, data, datasize, zlibsettings); + if(!error) error = addChunk(out, "IDAT", zlibdata.data, zlibdata.size); + ucvector_cleanup(&zlibdata); + + return error; +} + +static unsigned addChunk_IEND(ucvector* out) +{ + unsigned error = 0; + error = addChunk(out, "IEND", 0, 0); + return error; +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + +static unsigned addChunk_tEXt(ucvector* out, const char* keyword, const char* textstring) +{ + unsigned error = 0; + size_t i; + ucvector text; + ucvector_init(&text); + for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&text, (unsigned char)keyword[i]); + if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ + ucvector_push_back(&text, 0); /*0 termination char*/ + for(i = 0; textstring[i] != 0; i++) ucvector_push_back(&text, (unsigned char)textstring[i]); + error = addChunk(out, "tEXt", text.data, text.size); + ucvector_cleanup(&text); + + return error; +} + +static unsigned addChunk_zTXt(ucvector* out, const char* keyword, const char* textstring, + LodePNGCompressSettings* zlibsettings) +{ + unsigned error = 0; + ucvector data, compressed; + size_t i, textsize = strlen(textstring); + + ucvector_init(&data); + ucvector_init(&compressed); + for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&data, (unsigned char)keyword[i]); + if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ + ucvector_push_back(&data, 0); /*0 termination char*/ + ucvector_push_back(&data, 0); /*compression method: 0*/ + + error = zlib_compress(&compressed.data, &compressed.size, + (unsigned char*)textstring, textsize, zlibsettings); + if(!error) + { + for(i = 0; i < compressed.size; i++) ucvector_push_back(&data, compressed.data[i]); + error = addChunk(out, "zTXt", data.data, data.size); + } + + ucvector_cleanup(&compressed); + ucvector_cleanup(&data); + return error; +} + +static unsigned addChunk_iTXt(ucvector* out, unsigned compressed, const char* keyword, const char* langtag, + const char* transkey, const char* textstring, LodePNGCompressSettings* zlibsettings) +{ + unsigned error = 0; + ucvector data; + size_t i, textsize = strlen(textstring); + + ucvector_init(&data); + + for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&data, (unsigned char)keyword[i]); + if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ + ucvector_push_back(&data, 0); /*null termination char*/ + ucvector_push_back(&data, compressed ? 1 : 0); /*compression flag*/ + ucvector_push_back(&data, 0); /*compression method*/ + for(i = 0; langtag[i] != 0; i++) ucvector_push_back(&data, (unsigned char)langtag[i]); + ucvector_push_back(&data, 0); /*null termination char*/ + for(i = 0; transkey[i] != 0; i++) ucvector_push_back(&data, (unsigned char)transkey[i]); + ucvector_push_back(&data, 0); /*null termination char*/ + + if(compressed) + { + ucvector compressed_data; + ucvector_init(&compressed_data); + error = zlib_compress(&compressed_data.data, &compressed_data.size, + (unsigned char*)textstring, textsize, zlibsettings); + if(!error) + { + for(i = 0; i < compressed_data.size; i++) ucvector_push_back(&data, compressed_data.data[i]); + } + ucvector_cleanup(&compressed_data); + } + else /*not compressed*/ + { + for(i = 0; textstring[i] != 0; i++) ucvector_push_back(&data, (unsigned char)textstring[i]); + } + + if(!error) error = addChunk(out, "iTXt", data.data, data.size); + ucvector_cleanup(&data); + return error; +} + +static unsigned addChunk_bKGD(ucvector* out, const LodePNGInfo* info) +{ + unsigned error = 0; + ucvector bKGD; + ucvector_init(&bKGD); + if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) + { + ucvector_push_back(&bKGD, (unsigned char)(info->background_r / 256)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_r % 256)); + } + else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) + { + ucvector_push_back(&bKGD, (unsigned char)(info->background_r / 256)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_r % 256)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_g / 256)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_g % 256)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_b / 256)); + ucvector_push_back(&bKGD, (unsigned char)(info->background_b % 256)); + } + else if(info->color.colortype == LCT_PALETTE) + { + ucvector_push_back(&bKGD, (unsigned char)(info->background_r % 256)); /*palette index*/ + } + + error = addChunk(out, "bKGD", bKGD.data, bKGD.size); + ucvector_cleanup(&bKGD); + + return error; +} + +static unsigned addChunk_tIME(ucvector* out, const LodePNGTime* time) +{ + unsigned error = 0; + unsigned char* data = (unsigned char*)lodepng_malloc(7); + if(!data) return 83; /*alloc fail*/ + data[0] = (unsigned char)(time->year / 256); + data[1] = (unsigned char)(time->year % 256); + data[2] = time->month; + data[3] = time->day; + data[4] = time->hour; + data[5] = time->minute; + data[6] = time->second; + error = addChunk(out, "tIME", data, 7); + lodepng_free(data); + return error; +} + +static unsigned addChunk_pHYs(ucvector* out, const LodePNGInfo* info) +{ + unsigned error = 0; + ucvector data; + ucvector_init(&data); + + lodepng_add32bitInt(&data, info->phys_x); + lodepng_add32bitInt(&data, info->phys_y); + ucvector_push_back(&data, info->phys_unit); + + error = addChunk(out, "pHYs", data.data, data.size); + ucvector_cleanup(&data); + + return error; +} + +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline, + size_t length, size_t bytewidth, unsigned char filterType) +{ + size_t i; + switch(filterType) + { + case 0: /*None*/ + for(i = 0; i < length; i++) out[i] = scanline[i]; + break; + case 1: /*Sub*/ + if(prevline) + { + for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; + for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth]; + } + else + { + for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; + for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth]; + } + break; + case 2: /*Up*/ + if(prevline) + { + for(i = 0; i < length; i++) out[i] = scanline[i] - prevline[i]; + } + else + { + for(i = 0; i < length; i++) out[i] = scanline[i]; + } + break; + case 3: /*Average*/ + if(prevline) + { + for(i = 0; i < bytewidth; i++) out[i] = scanline[i] - prevline[i] / 2; + for(i = bytewidth; i < length; i++) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) / 2); + } + else + { + for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; + for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth] / 2; + } + break; + case 4: /*Paeth*/ + if(prevline) + { + /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/ + for(i = 0; i < bytewidth; i++) out[i] = (scanline[i] - prevline[i]); + for(i = bytewidth; i < length; i++) + { + out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth])); + } + } + else + { + for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; + /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/ + for(i = bytewidth; i < length; i++) out[i] = (scanline[i] - scanline[i - bytewidth]); + } + break; + default: return; /*unexisting filter type given*/ + } +} + +/* log2 approximation. A slight bit faster than std::log. */ +static float flog2(float f) +{ + float result = 0; + while(f > 32) { result += 4; f /= 16; } + while(f > 2) { result++; f /= 2; } + return result + 1.442695f * (f * f * f / 3 - 3 * f * f / 2 + 3 * f - 1.83333f); +} + +static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, + const LodePNGColorMode* info, const LodePNGEncoderSettings* settings) +{ + /* + For PNG filter method 0 + out must be a buffer with as size: h + (w * h * bpp + 7) / 8, because there are + the scanlines with 1 extra byte per scanline + */ + + unsigned bpp = lodepng_get_bpp(info); + /*the width of a scanline in bytes, not including the filter type*/ + size_t linebytes = (w * bpp + 7) / 8; + /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ + size_t bytewidth = (bpp + 7) / 8; + const unsigned char* prevline = 0; + unsigned x, y; + unsigned error = 0; + LodePNGFilterStrategy strategy = settings->filter_strategy; + + /* + There is a heuristic called the minimum sum of absolute differences heuristic, suggested by the PNG standard: + * If the image type is Palette, or the bit depth is smaller than 8, then do not filter the image (i.e. + use fixed filtering, with the filter None). + * (The other case) If the image type is Grayscale or RGB (with or without Alpha), and the bit depth is + not smaller than 8, then use adaptive filtering heuristic as follows: independently for each row, apply + all five filters and select the filter that produces the smallest sum of absolute values per row. + This heuristic is used if filter strategy is LFS_MINSUM and filter_palette_zero is true. + + If filter_palette_zero is true and filter_strategy is not LFS_MINSUM, the above heuristic is followed, + but for "the other case", whatever strategy filter_strategy is set to instead of the minimum sum + heuristic is used. + */ + if(settings->filter_palette_zero && + (info->colortype == LCT_PALETTE || info->bitdepth < 8)) strategy = LFS_ZERO; + + if(bpp == 0) return 31; /*error: invalid color type*/ + + if(strategy == LFS_ZERO) + { + for(y = 0; y < h; y++) + { + size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + size_t inindex = linebytes * y; + out[outindex] = 0; /*filter type byte*/ + filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, 0); + prevline = &in[inindex]; + } + } + else if(strategy == LFS_MINSUM) + { + /*adaptive filtering*/ + size_t sum[5]; + ucvector attempt[5]; /*five filtering attempts, one for each filter type*/ + size_t smallest = 0; + unsigned type, bestType = 0; + + for(type = 0; type < 5; type++) + { + ucvector_init(&attempt[type]); + if(!ucvector_resize(&attempt[type], linebytes)) return 83; /*alloc fail*/ + } + + if(!error) + { + for(y = 0; y < h; y++) + { + /*try the 5 filter types*/ + for(type = 0; type < 5; type++) + { + filterScanline(attempt[type].data, &in[y * linebytes], prevline, linebytes, bytewidth, type); + + /*calculate the sum of the result*/ + sum[type] = 0; + if(type == 0) + { + for(x = 0; x < linebytes; x++) sum[type] += (unsigned char)(attempt[type].data[x]); + } + else + { + for(x = 0; x < linebytes; x++) + { + /*For differences, each byte should be treated as signed, values above 127 are negative + (converted to signed char). Filtertype 0 isn't a difference though, so use unsigned there. + This means filtertype 0 is almost never chosen, but that is justified.*/ + signed char s = (signed char)(attempt[type].data[x]); + sum[type] += s < 0 ? -s : s; + } + } + + /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || sum[type] < smallest) + { + bestType = type; + smallest = sum[type]; + } + } + + prevline = &in[y * linebytes]; + + /*now fill the out values*/ + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x]; + } + } + + for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]); + } + else if(strategy == LFS_ENTROPY) + { + float sum[5]; + ucvector attempt[5]; /*five filtering attempts, one for each filter type*/ + float smallest = 0; + unsigned type, bestType = 0; + unsigned count[256]; + + for(type = 0; type < 5; type++) + { + ucvector_init(&attempt[type]); + if(!ucvector_resize(&attempt[type], linebytes)) return 83; /*alloc fail*/ + } + + for(y = 0; y < h; y++) + { + /*try the 5 filter types*/ + for(type = 0; type < 5; type++) + { + filterScanline(attempt[type].data, &in[y * linebytes], prevline, linebytes, bytewidth, type); + for(x = 0; x < 256; x++) count[x] = 0; + for(x = 0; x < linebytes; x++) count[attempt[type].data[x]]++; + count[type]++; /*the filter type itself is part of the scanline*/ + sum[type] = 0; + for(x = 0; x < 256; x++) + { + float p = count[x] / (float)(linebytes + 1); + sum[type] += count[x] == 0 ? 0 : flog2(1 / p) * p; + } + /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || sum[type] < smallest) + { + bestType = type; + smallest = sum[type]; + } + } + + prevline = &in[y * linebytes]; + + /*now fill the out values*/ + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x]; + } + + for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]); + } + else if(strategy == LFS_PREDEFINED) + { + for(y = 0; y < h; y++) + { + size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + size_t inindex = linebytes * y; + unsigned type = settings->predefined_filters[y]; + out[outindex] = type; /*filter type byte*/ + filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); + prevline = &in[inindex]; + } + } + else if(strategy == LFS_BRUTE_FORCE) + { + /*brute force filter chooser. + deflate the scanline after every filter attempt to see which one deflates best. + This is very slow and gives only slightly smaller, sometimes even larger, result*/ + size_t size[5]; + ucvector attempt[5]; /*five filtering attempts, one for each filter type*/ + size_t smallest = 0; + unsigned type = 0, bestType = 0; + unsigned char* dummy; + LodePNGCompressSettings zlibsettings = settings->zlibsettings; + /*use fixed tree on the attempts so that the tree is not adapted to the filtertype on purpose, + to simulate the true case where the tree is the same for the whole image. Sometimes it gives + better result with dynamic tree anyway. Using the fixed tree sometimes gives worse, but in rare + cases better compression. It does make this a bit less slow, so it's worth doing this.*/ + zlibsettings.btype = 1; + /*a custom encoder likely doesn't read the btype setting and is optimized for complete PNG + images only, so disable it*/ + zlibsettings.custom_zlib = 0; + zlibsettings.custom_deflate = 0; + for(type = 0; type < 5; type++) + { + ucvector_init(&attempt[type]); + ucvector_resize(&attempt[type], linebytes); /*todo: give error if resize failed*/ + } + for(y = 0; y < h; y++) /*try the 5 filter types*/ + { + for(type = 0; type < 5; type++) + { + unsigned testsize = attempt[type].size; + /*if(testsize > 8) testsize /= 8;*/ /*it already works good enough by testing a part of the row*/ + + filterScanline(attempt[type].data, &in[y * linebytes], prevline, linebytes, bytewidth, type); + size[type] = 0; + dummy = 0; + zlib_compress(&dummy, &size[type], attempt[type].data, testsize, &zlibsettings); + lodepng_free(dummy); + /*check if this is smallest size (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || size[type] < smallest) + { + bestType = type; + smallest = size[type]; + } + } + prevline = &in[y * linebytes]; + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x]; + } + for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]); + } + else return 88; /* unknown filter strategy */ + + return error; +} + +static void addPaddingBits(unsigned char* out, const unsigned char* in, + size_t olinebits, size_t ilinebits, unsigned h) +{ + /*The opposite of the removePaddingBits function + olinebits must be >= ilinebits*/ + unsigned y; + size_t diff = olinebits - ilinebits; + size_t obp = 0, ibp = 0; /*bit pointers*/ + for(y = 0; y < h; y++) + { + size_t x; + for(x = 0; x < ilinebits; x++) + { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + /*obp += diff; --> no, fill in some value in the padding bits too, to avoid + "Use of uninitialised value of size ###" warning from valgrind*/ + for(x = 0; x < diff; x++) setBitOfReversedStream(&obp, out, 0); + } +} + +/* +in: non-interlaced image with size w*h +out: the same pixels, but re-ordered according to PNG's Adam7 interlacing, with + no padding bits between scanlines, but between reduced images so that each + reduced image starts at a byte. +bpp: bits per pixel +there are no padding bits, not between scanlines, not between reduced images +in has the following size in bits: w * h * bpp. +out is possibly bigger due to padding bits between reduced images +NOTE: comments about padding bits are only relevant if bpp < 8 +*/ +static void Adam7_interlace(unsigned char* out, const unsigned char* in, unsigned w, unsigned h, unsigned bpp) +{ + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + if(bpp >= 8) + { + for(i = 0; i < 7; i++) + { + unsigned x, y, b; + size_t bytewidth = bpp / 8; + for(y = 0; y < passh[i]; y++) + for(x = 0; x < passw[i]; x++) + { + size_t pixelinstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; + size_t pixeloutstart = passstart[i] + (y * passw[i] + x) * bytewidth; + for(b = 0; b < bytewidth; b++) + { + out[pixeloutstart + b] = in[pixelinstart + b]; + } + } + } + } + else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ + { + for(i = 0; i < 7; i++) + { + unsigned x, y, b; + unsigned ilinebits = bpp * passw[i]; + unsigned olinebits = bpp * w; + size_t obp, ibp; /*bit pointers (for out and in buffer)*/ + for(y = 0; y < passh[i]; y++) + for(x = 0; x < passw[i]; x++) + { + ibp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; + obp = (8 * passstart[i]) + (y * ilinebits + x * bpp); + for(b = 0; b < bpp; b++) + { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + } + } + } +} + +/*out must be buffer big enough to contain uncompressed IDAT chunk data, and in must contain the full image. +return value is error**/ +static unsigned preProcessScanlines(unsigned char** out, size_t* outsize, const unsigned char* in, + unsigned w, unsigned h, + const LodePNGInfo* info_png, const LodePNGEncoderSettings* settings) +{ + /* + This function converts the pure 2D image with the PNG's colortype, into filtered-padded-interlaced data. Steps: + *) if no Adam7: 1) add padding bits (= posible extra bits per scanline if bpp < 8) 2) filter + *) if adam7: 1) Adam7_interlace 2) 7x add padding bits 3) 7x filter + */ + unsigned bpp = lodepng_get_bpp(&info_png->color); + unsigned error = 0; + + if(info_png->interlace_method == 0) + { + *outsize = h + (h * ((w * bpp + 7) / 8)); /*image size plus an extra byte per scanline + possible padding bits*/ + *out = (unsigned char*)lodepng_malloc(*outsize); + if(!(*out) && (*outsize)) error = 83; /*alloc fail*/ + + if(!error) + { + /*non multiple of 8 bits per scanline, padding bits needed per scanline*/ + if(bpp < 8 && w * bpp != ((w * bpp + 7) / 8) * 8) + { + unsigned char* padded = (unsigned char*)lodepng_malloc(h * ((w * bpp + 7) / 8)); + if(!padded) error = 83; /*alloc fail*/ + if(!error) + { + addPaddingBits(padded, in, ((w * bpp + 7) / 8) * 8, w * bpp, h); + error = filter(*out, padded, w, h, &info_png->color, settings); + } + lodepng_free(padded); + } + else + { + /*we can immediatly filter into the out buffer, no other steps needed*/ + error = filter(*out, in, w, h, &info_png->color, settings); + } + } + } + else /*interlace_method is 1 (Adam7)*/ + { + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned char* adam7; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + *outsize = filter_passstart[7]; /*image size plus an extra byte per scanline + possible padding bits*/ + *out = (unsigned char*)lodepng_malloc(*outsize); + if(!(*out)) error = 83; /*alloc fail*/ + + adam7 = (unsigned char*)lodepng_malloc(passstart[7]); + if(!adam7 && passstart[7]) error = 83; /*alloc fail*/ + + if(!error) + { + unsigned i; + + Adam7_interlace(adam7, in, w, h, bpp); + for(i = 0; i < 7; i++) + { + if(bpp < 8) + { + unsigned char* padded = (unsigned char*)lodepng_malloc(padded_passstart[i + 1] - padded_passstart[i]); + if(!padded) ERROR_BREAK(83); /*alloc fail*/ + addPaddingBits(padded, &adam7[passstart[i]], + ((passw[i] * bpp + 7) / 8) * 8, passw[i] * bpp, passh[i]); + error = filter(&(*out)[filter_passstart[i]], padded, + passw[i], passh[i], &info_png->color, settings); + lodepng_free(padded); + } + else + { + error = filter(&(*out)[filter_passstart[i]], &adam7[padded_passstart[i]], + passw[i], passh[i], &info_png->color, settings); + } + + if(error) break; + } + } + + lodepng_free(adam7); + } + + return error; +} + +/* +palette must have 4 * palettesize bytes allocated, and given in format RGBARGBARGBARGBA... +returns 0 if the palette is opaque, +returns 1 if the palette has a single color with alpha 0 ==> color key +returns 2 if the palette is semi-translucent. +*/ +static unsigned getPaletteTranslucency(const unsigned char* palette, size_t palettesize) +{ + size_t i, key = 0; + unsigned r = 0, g = 0, b = 0; /*the value of the color with alpha 0, so long as color keying is possible*/ + for(i = 0; i < palettesize; i++) + { + if(!key && palette[4 * i + 3] == 0) + { + r = palette[4 * i + 0]; g = palette[4 * i + 1]; b = palette[4 * i + 2]; + key = 1; + i = (size_t)(-1); /*restart from beginning, to detect earlier opaque colors with key's value*/ + } + else if(palette[4 * i + 3] != 255) return 2; + /*when key, no opaque RGB may have key's RGB*/ + else if(key && r == palette[i * 4 + 0] && g == palette[i * 4 + 1] && b == palette[i * 4 + 2]) return 2; + } + return key; +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +static unsigned addUnknownChunks(ucvector* out, unsigned char* data, size_t datasize) +{ + unsigned char* inchunk = data; + while((size_t)(inchunk - data) < datasize) + { + CERROR_TRY_RETURN(lodepng_chunk_append(&out->data, &out->size, inchunk)); + out->allocsize = out->size; /*fix the allocsize again*/ + inchunk = lodepng_chunk_next(inchunk); + } + return 0; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +unsigned lodepng_encode(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h, + LodePNGState* state) +{ + LodePNGInfo info; + ucvector outv; + unsigned char* data = 0; /*uncompressed version of the IDAT chunk data*/ + size_t datasize = 0; + + /*provide some proper output values if error will happen*/ + *out = 0; + *outsize = 0; + state->error = 0; + + lodepng_info_init(&info); + lodepng_info_copy(&info, &state->info_png); + + if((info.color.colortype == LCT_PALETTE || state->encoder.force_palette) + && (info.color.palettesize == 0 || info.color.palettesize > 256)) + { + state->error = 68; /*invalid palette size, it is only allowed to be 1-256*/ + return state->error; + } + + if(state->encoder.auto_convert != LAC_NO) + { + state->error = lodepng_auto_choose_color(&info.color, image, w, h, &state->info_raw, + state->encoder.auto_convert); + } + if(state->error) return state->error; + + if(state->encoder.zlibsettings.btype > 2) + { + CERROR_RETURN_ERROR(state->error, 61); /*error: unexisting btype*/ + } + if(state->info_png.interlace_method > 1) + { + CERROR_RETURN_ERROR(state->error, 71); /*error: unexisting interlace mode*/ + } + + state->error = checkColorValidity(info.color.colortype, info.color.bitdepth); + if(state->error) return state->error; /*error: unexisting color type given*/ + state->error = checkColorValidity(state->info_raw.colortype, state->info_raw.bitdepth); + if(state->error) return state->error; /*error: unexisting color type given*/ + + if(!lodepng_color_mode_equal(&state->info_raw, &info.color)) + { + unsigned char* converted; + size_t size = (w * h * lodepng_get_bpp(&info.color) + 7) / 8; + + converted = (unsigned char*)lodepng_malloc(size); + if(!converted && size) state->error = 83; /*alloc fail*/ + if(!state->error) + { + state->error = lodepng_convert(converted, image, &info.color, &state->info_raw, w, h, 0 /*fix_png*/); + } + if(!state->error) preProcessScanlines(&data, &datasize, converted, w, h, &info, &state->encoder); + lodepng_free(converted); + } + else preProcessScanlines(&data, &datasize, image, w, h, &info, &state->encoder); + + ucvector_init(&outv); + while(!state->error) /*while only executed once, to break on error*/ + { +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + size_t i; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*write signature and chunks*/ + writeSignature(&outv); + /*IHDR*/ + addChunk_IHDR(&outv, w, h, info.color.colortype, info.color.bitdepth, info.interlace_method); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*unknown chunks between IHDR and PLTE*/ + if(info.unknown_chunks_data[0]) + { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[0], info.unknown_chunks_size[0]); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*PLTE*/ + if(info.color.colortype == LCT_PALETTE) + { + addChunk_PLTE(&outv, &info.color); + } + if(state->encoder.force_palette && (info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA)) + { + addChunk_PLTE(&outv, &info.color); + } + /*tRNS*/ + if(info.color.colortype == LCT_PALETTE && getPaletteTranslucency(info.color.palette, info.color.palettesize) != 0) + { + addChunk_tRNS(&outv, &info.color); + } + if((info.color.colortype == LCT_GREY || info.color.colortype == LCT_RGB) && info.color.key_defined) + { + addChunk_tRNS(&outv, &info.color); + } +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*bKGD (must come between PLTE and the IDAt chunks*/ + if(info.background_defined) addChunk_bKGD(&outv, &info); + /*pHYs (must come before the IDAT chunks)*/ + if(info.phys_defined) addChunk_pHYs(&outv, &info); + + /*unknown chunks between PLTE and IDAT*/ + if(info.unknown_chunks_data[1]) + { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[1], info.unknown_chunks_size[1]); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*IDAT (multiple IDAT chunks must be consecutive)*/ + state->error = addChunk_IDAT(&outv, data, datasize, &state->encoder.zlibsettings); + if(state->error) break; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*tIME*/ + if(info.time_defined) addChunk_tIME(&outv, &info.time); + /*tEXt and/or zTXt*/ + for(i = 0; i < info.text_num; i++) + { + if(strlen(info.text_keys[i]) > 79) + { + state->error = 66; /*text chunk too large*/ + break; + } + if(strlen(info.text_keys[i]) < 1) + { + state->error = 67; /*text chunk too small*/ + break; + } + if(state->encoder.text_compression) + { + addChunk_zTXt(&outv, info.text_keys[i], info.text_strings[i], &state->encoder.zlibsettings); + } + else + { + addChunk_tEXt(&outv, info.text_keys[i], info.text_strings[i]); + } + } + /*LodePNG version id in text chunk*/ + if(state->encoder.add_id) + { + unsigned alread_added_id_text = 0; + for(i = 0; i < info.text_num; i++) + { + if(!strcmp(info.text_keys[i], "LodePNG")) + { + alread_added_id_text = 1; + break; + } + } + if(alread_added_id_text == 0) + { + addChunk_tEXt(&outv, "LodePNG", VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/ + } + } + /*iTXt*/ + for(i = 0; i < info.itext_num; i++) + { + if(strlen(info.itext_keys[i]) > 79) + { + state->error = 66; /*text chunk too large*/ + break; + } + if(strlen(info.itext_keys[i]) < 1) + { + state->error = 67; /*text chunk too small*/ + break; + } + addChunk_iTXt(&outv, state->encoder.text_compression, + info.itext_keys[i], info.itext_langtags[i], info.itext_transkeys[i], info.itext_strings[i], + &state->encoder.zlibsettings); + } + + /*unknown chunks between IDAT and IEND*/ + if(info.unknown_chunks_data[2]) + { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[2], info.unknown_chunks_size[2]); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + addChunk_IEND(&outv); + + break; /*this isn't really a while loop; no error happened so break out now!*/ + } + + lodepng_info_cleanup(&info); + lodepng_free(data); + /*instead of cleaning the vector up, give it to the output*/ + *out = outv.data; + *outsize = outv.size; + + return state->error; +} + +unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, const unsigned char* image, + unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned error; + LodePNGState state; + lodepng_state_init(&state); + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; + state.info_png.color.colortype = colortype; + state.info_png.color.bitdepth = bitdepth; + lodepng_encode(out, outsize, image, w, h, &state); + error = state.error; + lodepng_state_cleanup(&state); + return error; +} + +unsigned lodepng_encode32(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) +{ + return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGBA, 8); +} + +unsigned lodepng_encode24(unsigned char** out, size_t* outsize, const unsigned char* image, unsigned w, unsigned h) +{ + return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGB, 8); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned lodepng_encode_file(const char* filename, const unsigned char* image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char* buffer; + size_t buffersize; + unsigned error = lodepng_encode_memory(&buffer, &buffersize, image, w, h, colortype, bitdepth); + if(!error) error = lodepng_save_file(buffer, buffersize, filename); + lodepng_free(buffer); + return error; +} + +unsigned lodepng_encode32_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) +{ + return lodepng_encode_file(filename, image, w, h, LCT_RGBA, 8); +} + +unsigned lodepng_encode24_file(const char* filename, const unsigned char* image, unsigned w, unsigned h) +{ + return lodepng_encode_file(filename, image, w, h, LCT_RGB, 8); +} +#endif /*LODEPNG_COMPILE_DISK*/ + +void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings) +{ + lodepng_compress_settings_init(&settings->zlibsettings); + settings->filter_palette_zero = 1; + settings->filter_strategy = LFS_MINSUM; + settings->auto_convert = LAC_AUTO; + settings->force_palette = 0; + settings->predefined_filters = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + settings->add_id = 0; + settings->text_compression = 1; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ERROR_TEXT +/* +This returns the description of a numerical error code in English. This is also +the documentation of all the error codes. +*/ +const char* lodepng_error_text(unsigned code) +{ + switch(code) + { + case 0: return "no error, everything went ok"; + case 1: return "nothing done yet"; /*the Encoder/Decoder has done nothing yet, error checking makes no sense yet*/ + case 10: return "end of input memory reached without huffman end code"; /*while huffman decoding*/ + case 11: return "error in code tree made it jump outside of huffman tree"; /*while huffman decoding*/ + case 13: return "problem while processing dynamic deflate block"; + case 14: return "problem while processing dynamic deflate block"; + case 15: return "problem while processing dynamic deflate block"; + case 16: return "unexisting code while processing dynamic deflate block"; + case 17: return "end of out buffer memory reached while inflating"; + case 18: return "invalid distance code while inflating"; + case 19: return "end of out buffer memory reached while inflating"; + case 20: return "invalid deflate block BTYPE encountered while decoding"; + case 21: return "NLEN is not ones complement of LEN in a deflate block"; + /*end of out buffer memory reached while inflating: + This can happen if the inflated deflate data is longer than the amount of bytes required to fill up + all the pixels of the image, given the color depth and image dimensions. Something that doesn't + happen in a normal, well encoded, PNG image.*/ + case 22: return "end of out buffer memory reached while inflating"; + case 23: return "end of in buffer memory reached while inflating"; + case 24: return "invalid FCHECK in zlib header"; + case 25: return "invalid compression method in zlib header"; + case 26: return "FDICT encountered in zlib header while it's not used for PNG"; + case 27: return "PNG file is smaller than a PNG header"; + /*Checks the magic file header, the first 8 bytes of the PNG file*/ + case 28: return "incorrect PNG signature, it's no PNG or corrupted"; + case 29: return "first chunk is not the header chunk"; + case 30: return "chunk length too large, chunk broken off at end of file"; + case 31: return "illegal PNG color type or bpp"; + case 32: return "illegal PNG compression method"; + case 33: return "illegal PNG filter method"; + case 34: return "illegal PNG interlace method"; + case 35: return "chunk length of a chunk is too large or the chunk too small"; + case 36: return "illegal PNG filter type encountered"; + case 37: return "illegal bit depth for this color type given"; + case 38: return "the palette is too big"; /*more than 256 colors*/ + case 39: return "more palette alpha values given in tRNS chunk than there are colors in the palette"; + case 40: return "tRNS chunk has wrong size for greyscale image"; + case 41: return "tRNS chunk has wrong size for RGB image"; + case 42: return "tRNS chunk appeared while it was not allowed for this color type"; + case 43: return "bKGD chunk has wrong size for palette image"; + case 44: return "bKGD chunk has wrong size for greyscale image"; + case 45: return "bKGD chunk has wrong size for RGB image"; + /*Is the palette too small?*/ + case 46: return "a value in indexed image is larger than the palette size (bitdepth = 8)"; + /*Is the palette too small?*/ + case 47: return "a value in indexed image is larger than the palette size (bitdepth < 8)"; + /*the input data is empty, maybe a PNG file doesn't exist or is in the wrong path*/ + case 48: return "empty input or file doesn't exist"; + case 49: return "jumped past memory while generating dynamic huffman tree"; + case 50: return "jumped past memory while generating dynamic huffman tree"; + case 51: return "jumped past memory while inflating huffman block"; + case 52: return "jumped past memory while inflating"; + case 53: return "size of zlib data too small"; + case 54: return "repeat symbol in tree while there was no value symbol yet"; + /*jumped past tree while generating huffman tree, this could be when the + tree will have more leaves than symbols after generating it out of the + given lenghts. They call this an oversubscribed dynamic bit lengths tree in zlib.*/ + case 55: return "jumped past tree while generating huffman tree"; + case 56: return "given output image colortype or bitdepth not supported for color conversion"; + case 57: return "invalid CRC encountered (checking CRC can be disabled)"; + case 58: return "invalid ADLER32 encountered (checking ADLER32 can be disabled)"; + case 59: return "requested color conversion not supported"; + case 60: return "invalid window size given in the settings of the encoder (must be 0-32768)"; + case 61: return "invalid BTYPE given in the settings of the encoder (only 0, 1 and 2 are allowed)"; + /*LodePNG leaves the choice of RGB to greyscale conversion formula to the user.*/ + case 62: return "conversion from color to greyscale not supported"; + case 63: return "length of a chunk too long, max allowed for PNG is 2147483647 bytes per chunk"; /*(2^31-1)*/ + /*this would result in the inability of a deflated block to ever contain an end code. It must be at least 1.*/ + case 64: return "the length of the END symbol 256 in the Huffman tree is 0"; + case 66: return "the length of a text chunk keyword given to the encoder is longer than the maximum of 79 bytes"; + case 67: return "the length of a text chunk keyword given to the encoder is smaller than the minimum of 1 byte"; + case 68: return "tried to encode a PLTE chunk with a palette that has less than 1 or more than 256 colors"; + case 69: return "unknown chunk type with 'critical' flag encountered by the decoder"; + case 71: return "unexisting interlace mode given to encoder (must be 0 or 1)"; + case 72: return "while decoding, unexisting compression method encountering in zTXt or iTXt chunk (it must be 0)"; + case 73: return "invalid tIME chunk size"; + case 74: return "invalid pHYs chunk size"; + /*length could be wrong, or data chopped off*/ + case 75: return "no null termination char found while decoding text chunk"; + case 76: return "iTXt chunk too short to contain required bytes"; + case 77: return "integer overflow in buffer size"; + case 78: return "failed to open file for reading"; /*file doesn't exist or couldn't be opened for reading*/ + case 79: return "failed to open file for writing"; + case 80: return "tried creating a tree of 0 symbols"; + case 81: return "lazy matching at pos 0 is impossible"; + case 82: return "color conversion to palette requested while a color isn't in palette"; + case 83: return "memory allocation failed"; + case 84: return "given image too small to contain all pixels to be encoded"; + case 85: return "internal color conversion bug"; + case 86: return "impossible offset in lz77 encoding (internal bug)"; + case 87: return "must provide custom zlib function pointer if LODEPNG_COMPILE_ZLIB is not defined"; + case 88: return "invalid filter strategy given for LodePNGEncoderSettings.filter_strategy"; + case 89: return "text chunk keyword too short or long: must have size 1-79"; + /*the windowsize in the LodePNGCompressSettings. Requiring POT(==> & instead of %) makes encoding 12% faster.*/ + case 90: return "windowsize must be a power of two"; + } + return "unknown error code"; +} +#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // C++ Wrapper // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_CPP +namespace lodepng +{ + +#ifdef LODEPNG_COMPILE_DISK +void load_file(std::vector& buffer, const std::string& filename) +{ + std::ifstream file(filename.c_str(), std::ios::in|std::ios::binary|std::ios::ate); + + /*get filesize*/ + std::streamsize size = 0; + if(file.seekg(0, std::ios::end).good()) size = file.tellg(); + if(file.seekg(0, std::ios::beg).good()) size -= file.tellg(); + + /*read contents of the file into the vector*/ + buffer.resize(size_t(size)); + if(size > 0) file.read((char*)(&buffer[0]), size); +} + +/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ +void save_file(const std::vector& buffer, const std::string& filename) +{ + std::ofstream file(filename.c_str(), std::ios::out|std::ios::binary); + file.write(buffer.empty() ? 0 : (char*)&buffer[0], std::streamsize(buffer.size())); +} +#endif //LODEPNG_COMPILE_DISK + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_DECODER +unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGDecompressSettings& settings) +{ + unsigned char* buffer = 0; + size_t buffersize = 0; + unsigned error = zlib_decompress(&buffer, &buffersize, in, insize, &settings); + if(buffer) + { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned decompress(std::vector& out, const std::vector& in, + const LodePNGDecompressSettings& settings) +{ + return decompress(out, in.empty() ? 0 : &in[0], in.size(), settings); +} +#endif //LODEPNG_COMPILE_DECODER + +#ifdef LODEPNG_COMPILE_ENCODER +unsigned compress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGCompressSettings& settings) +{ + unsigned char* buffer = 0; + size_t buffersize = 0; + unsigned error = zlib_compress(&buffer, &buffersize, in, insize, &settings); + if(buffer) + { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned compress(std::vector& out, const std::vector& in, + const LodePNGCompressSettings& settings) +{ + return compress(out, in.empty() ? 0 : &in[0], in.size(), settings); +} +#endif //LODEPNG_COMPILE_ENCODER +#endif //LODEPNG_COMPILE_ZLIB + + +#ifdef LODEPNG_COMPILE_PNG + +State::State() +{ + lodepng_state_init(this); +} + +State::State(const State& other) +{ + lodepng_state_init(this); + lodepng_state_copy(this, &other); +} + +State::~State() +{ + lodepng_state_cleanup(this); +} + +State& State::operator=(const State& other) +{ + lodepng_state_copy(this, &other); + return *this; +} + +#ifdef LODEPNG_COMPILE_DECODER + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, const unsigned char* in, + size_t insize, LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char* buffer; + unsigned error = lodepng_decode_memory(&buffer, &w, &h, in, insize, colortype, bitdepth); + if(buffer && !error) + { + State state; + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; + size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const std::vector& in, LodePNGColorType colortype, unsigned bitdepth) +{ + return decode(out, w, h, in.empty() ? 0 : &in[0], (unsigned)in.size(), colortype, bitdepth); +} + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const unsigned char* in, size_t insize) +{ + unsigned char* buffer = NULL; + unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize); + if(buffer && !error) + { + size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + } + lodepng_free(buffer); + return error; +} + +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const std::vector& in) +{ + return decode(out, w, h, state, in.empty() ? 0 : &in[0], in.size()); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned decode(std::vector& out, unsigned& w, unsigned& h, const std::string& filename, + LodePNGColorType colortype, unsigned bitdepth) +{ + std::vector buffer; + load_file(buffer, filename); + return decode(out, w, h, buffer, colortype, bitdepth); +} +#endif //LODEPNG_COMPILE_DECODER +#endif //LODEPNG_COMPILE_DISK + +#ifdef LODEPNG_COMPILE_ENCODER +unsigned encode(std::vector& out, const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char* buffer; + size_t buffersize; + unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth); + if(buffer) + { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; + return encode(out, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); +} + +unsigned encode(std::vector& out, + const unsigned char* in, unsigned w, unsigned h, + State& state) +{ + unsigned char* buffer; + size_t buffersize; + unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state); + if(buffer) + { + out.insert(out.end(), &buffer[0], &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + State& state) +{ + if(lodepng_get_raw_size(w, h, &state.info_raw) > in.size()) return 84; + return encode(out, in.empty() ? 0 : &in[0], w, h, state); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned encode(const std::string& filename, + const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + std::vector buffer; + unsigned error = encode(buffer, in, w, h, colortype, bitdepth); + if(!error) save_file(buffer, filename); + return error; +} + +unsigned encode(const std::string& filename, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; + return encode(filename, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); +} +#endif //LODEPNG_COMPILE_DISK +#endif //LODEPNG_COMPILE_ENCODER +#endif //LODEPNG_COMPILE_PNG +} //namespace lodepng +#endif /*LODEPNG_COMPILE_CPP*/ diff --git a/demo/lodepng.h b/demo/lodepng.h new file mode 100644 index 0000000..c497a5c --- /dev/null +++ b/demo/lodepng.h @@ -0,0 +1,1716 @@ +/* +LodePNG version 20131222 + +Copyright (c) 2005-2013 Lode Vandevenne + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ + +#ifndef LODEPNG_H +#define LODEPNG_H + +#include /*for size_t*/ + +#ifdef __cplusplus +#include +#include +#endif /*__cplusplus*/ + +/* +The following #defines are used to create code sections. They can be disabled +to disable code sections, which can give faster compile time and smaller binary. +The "NO_COMPILE" defines are designed to be used to pass as defines to the +compiler command to disable them without modifying this header, e.g. +-DLODEPNG_NO_COMPILE_ZLIB for gcc. +*/ +/*deflate & zlib. If disabled, you must specify alternative zlib functions in +the custom_zlib field of the compress and decompress settings*/ +#ifndef LODEPNG_NO_COMPILE_ZLIB +#define LODEPNG_COMPILE_ZLIB +#endif +/*png encoder and png decoder*/ +#ifndef LODEPNG_NO_COMPILE_PNG +#define LODEPNG_COMPILE_PNG +#endif +/*deflate&zlib decoder and png decoder*/ +#ifndef LODEPNG_NO_COMPILE_DECODER +#define LODEPNG_COMPILE_DECODER +#endif +/*deflate&zlib encoder and png encoder*/ +#ifndef LODEPNG_NO_COMPILE_ENCODER +#define LODEPNG_COMPILE_ENCODER +#endif +/*the optional built in harddisk file loading and saving functions*/ +#ifndef LODEPNG_NO_COMPILE_DISK +#define LODEPNG_COMPILE_DISK +#endif +/*support for chunks other than IHDR, IDAT, PLTE, tRNS, IEND: ancillary and unknown chunks*/ +#ifndef LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS +#define LODEPNG_COMPILE_ANCILLARY_CHUNKS +#endif +/*ability to convert error numerical codes to English text string*/ +#ifndef LODEPNG_NO_COMPILE_ERROR_TEXT +#define LODEPNG_COMPILE_ERROR_TEXT +#endif +/*Compile the default allocators (C's free, malloc and realloc). If you disable this, +you can define the functions lodepng_free, lodepng_malloc and lodepng_realloc in your +source files with custom allocators.*/ +#ifndef LODEPNG_NO_COMPILE_ALLOCATORS +#define LODEPNG_COMPILE_ALLOCATORS +#endif +/*compile the C++ version (you can disable the C++ wrapper here even when compiling for C++)*/ +#ifdef __cplusplus +#ifndef LODEPNG_NO_COMPILE_CPP +#define LODEPNG_COMPILE_CPP +#endif +#endif + +#ifdef LODEPNG_COMPILE_PNG +/*The PNG color types (also used for raw).*/ +typedef enum LodePNGColorType +{ + LCT_GREY = 0, /*greyscale: 1,2,4,8,16 bit*/ + LCT_RGB = 2, /*RGB: 8,16 bit*/ + LCT_PALETTE = 3, /*palette: 1,2,4,8 bit*/ + LCT_GREY_ALPHA = 4, /*greyscale with alpha: 8,16 bit*/ + LCT_RGBA = 6 /*RGB with alpha: 8,16 bit*/ +} LodePNGColorType; + +#ifdef LODEPNG_COMPILE_DECODER +/* +Converts PNG data in memory to raw pixel data. +out: Output parameter. Pointer to buffer that will contain the raw pixel data. + After decoding, its size is w * h * (bytes per pixel) bytes larger than + initially. Bytes per pixel depends on colortype and bitdepth. + Must be freed after usage with free(*out). + Note: for 16-bit per channel colors, uses big endian format like PNG does. +w: Output parameter. Pointer to width of pixel data. +h: Output parameter. Pointer to height of pixel data. +in: Memory buffer with the PNG file. +insize: size of the in buffer. +colortype: the desired color type for the raw output image. See explanation on PNG color types. +bitdepth: the desired bit depth for the raw output image. See explanation on PNG color types. +Return value: LodePNG error code (0 means no error). +*/ +unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, + const unsigned char* in, size_t insize, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_decode_memory, but always decodes to 32-bit RGBA raw image*/ +unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, + const unsigned char* in, size_t insize); + +/*Same as lodepng_decode_memory, but always decodes to 24-bit RGB raw image*/ +unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, + const unsigned char* in, size_t insize); + +#ifdef LODEPNG_COMPILE_DISK +/* +Load PNG from disk, from file with given name. +Same as the other decode functions, but instead takes a filename as input. +*/ +unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, + const char* filename, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_decode_file, but always decodes to 32-bit RGBA raw image.*/ +unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, + const char* filename); + +/*Same as lodepng_decode_file, but always decodes to 24-bit RGB raw image.*/ +unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, + const char* filename); +#endif /*LODEPNG_COMPILE_DISK*/ +#endif /*LODEPNG_COMPILE_DECODER*/ + + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Converts raw pixel data into a PNG image in memory. The colortype and bitdepth + of the output PNG image cannot be chosen, they are automatically determined + by the colortype, bitdepth and content of the input pixel data. + Note: for 16-bit per channel colors, needs big endian format like PNG does. +out: Output parameter. Pointer to buffer that will contain the PNG image data. + Must be freed after usage with free(*out). +outsize: Output parameter. Pointer to the size in bytes of the out buffer. +image: The raw pixel data to encode. The size of this buffer should be + w * h * (bytes per pixel), bytes per pixel depends on colortype and bitdepth. +w: width of the raw pixel data in pixels. +h: height of the raw pixel data in pixels. +colortype: the color type of the raw input image. See explanation on PNG color types. +bitdepth: the bit depth of the raw input image. See explanation on PNG color types. +Return value: LodePNG error code (0 means no error). +*/ +unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_encode_memory, but always encodes from 32-bit RGBA raw image.*/ +unsigned lodepng_encode32(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h); + +/*Same as lodepng_encode_memory, but always encodes from 24-bit RGB raw image.*/ +unsigned lodepng_encode24(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h); + +#ifdef LODEPNG_COMPILE_DISK +/* +Converts raw pixel data into a PNG file on disk. +Same as the other encode functions, but instead takes a filename as output. +NOTE: This overwrites existing files without warning! +*/ +unsigned lodepng_encode_file(const char* filename, + const unsigned char* image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_encode_file, but always encodes from 32-bit RGBA raw image.*/ +unsigned lodepng_encode32_file(const char* filename, + const unsigned char* image, unsigned w, unsigned h); + +/*Same as lodepng_encode_file, but always encodes from 24-bit RGB raw image.*/ +unsigned lodepng_encode24_file(const char* filename, + const unsigned char* image, unsigned w, unsigned h); +#endif /*LODEPNG_COMPILE_DISK*/ +#endif /*LODEPNG_COMPILE_ENCODER*/ + + +#ifdef LODEPNG_COMPILE_CPP +namespace lodepng +{ +#ifdef LODEPNG_COMPILE_DECODER +/*Same as lodepng_decode_memory, but decodes to an std::vector.*/ +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const unsigned char* in, size_t insize, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const std::vector& in, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#ifdef LODEPNG_COMPILE_DISK +/* +Converts PNG file from disk to raw pixel data in memory. +Same as the other decode functions, but instead takes a filename as input. +*/ +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + const std::string& filename, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#endif //LODEPNG_COMPILE_DISK +#endif //LODEPNG_COMPILE_DECODER + +#ifdef LODEPNG_COMPILE_ENCODER +/*Same as lodepng_encode_memory, but encodes to an std::vector.*/ +unsigned encode(std::vector& out, + const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#ifdef LODEPNG_COMPILE_DISK +/* +Converts 32-bit RGBA raw pixel data into a PNG file on disk. +Same as the other encode functions, but instead takes a filename as output. +NOTE: This overwrites existing files without warning! +*/ +unsigned encode(const std::string& filename, + const unsigned char* in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned encode(const std::string& filename, + const std::vector& in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#endif //LODEPNG_COMPILE_DISK +#endif //LODEPNG_COMPILE_ENCODER +} //namespace lodepng +#endif /*LODEPNG_COMPILE_CPP*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ERROR_TEXT +/*Returns an English description of the numerical error code.*/ +const char* lodepng_error_text(unsigned code); +#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ + +#ifdef LODEPNG_COMPILE_DECODER +/*Settings for zlib decompression*/ +typedef struct LodePNGDecompressSettings LodePNGDecompressSettings; +struct LodePNGDecompressSettings +{ + unsigned ignore_adler32; /*if 1, continue and don't give an error message if the Adler32 checksum is corrupted*/ + + /*use custom zlib decoder instead of built in one (default: null)*/ + unsigned (*custom_zlib)(unsigned char**, size_t*, + const unsigned char*, size_t, + const LodePNGDecompressSettings*); + /*use custom deflate decoder instead of built in one (default: null) + if custom_zlib is used, custom_deflate is ignored since only the built in + zlib function will call custom_deflate*/ + unsigned (*custom_inflate)(unsigned char**, size_t*, + const unsigned char*, size_t, + const LodePNGDecompressSettings*); + + const void* custom_context; /*optional custom settings for custom functions*/ +}; + +extern const LodePNGDecompressSettings lodepng_default_decompress_settings; +void lodepng_decompress_settings_init(LodePNGDecompressSettings* settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Settings for zlib compression. Tweaking these settings tweaks the balance +between speed and compression ratio. +*/ +typedef struct LodePNGCompressSettings LodePNGCompressSettings; +struct LodePNGCompressSettings /*deflate = compress*/ +{ + /*LZ77 related settings*/ + unsigned btype; /*the block type for LZ (0, 1, 2 or 3, see zlib standard). Should be 2 for proper compression.*/ + unsigned use_lz77; /*whether or not to use LZ77. Should be 1 for proper compression.*/ + unsigned windowsize; /*must be a power of two <= 32768. higher compresses more but is slower. Typical value: 2048.*/ + unsigned minmatch; /*mininum lz77 length. 3 is normally best, 6 can be better for some PNGs. Default: 0*/ + unsigned nicematch; /*stop searching if >= this length found. Set to 258 for best compression. Default: 128*/ + unsigned lazymatching; /*use lazy matching: better compression but a bit slower. Default: true*/ + + /*use custom zlib encoder instead of built in one (default: null)*/ + unsigned (*custom_zlib)(unsigned char**, size_t*, + const unsigned char*, size_t, + const LodePNGCompressSettings*); + /*use custom deflate encoder instead of built in one (default: null) + if custom_zlib is used, custom_deflate is ignored since only the built in + zlib function will call custom_deflate*/ + unsigned (*custom_deflate)(unsigned char**, size_t*, + const unsigned char*, size_t, + const LodePNGCompressSettings*); + + const void* custom_context; /*optional custom settings for custom functions*/ +}; + +extern const LodePNGCompressSettings lodepng_default_compress_settings; +void lodepng_compress_settings_init(LodePNGCompressSettings* settings); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_PNG +/* +Color mode of an image. Contains all information required to decode the pixel +bits to RGBA colors. This information is the same as used in the PNG file +format, and is used both for PNG and raw image data in LodePNG. +*/ +typedef struct LodePNGColorMode +{ + /*header (IHDR)*/ + LodePNGColorType colortype; /*color type, see PNG standard or documentation further in this header file*/ + unsigned bitdepth; /*bits per sample, see PNG standard or documentation further in this header file*/ + + /* + palette (PLTE and tRNS) + + Dynamically allocated with the colors of the palette, including alpha. + When encoding a PNG, to store your colors in the palette of the LodePNGColorMode, first use + lodepng_palette_clear, then for each color use lodepng_palette_add. + If you encode an image without alpha with palette, don't forget to put value 255 in each A byte of the palette. + + When decoding, by default you can ignore this palette, since LodePNG already + fills the palette colors in the pixels of the raw RGBA output. + + The palette is only supported for color type 3. + */ + unsigned char* palette; /*palette in RGBARGBA... order. When allocated, must be either 0, or have size 1024*/ + size_t palettesize; /*palette size in number of colors (amount of bytes is 4 * palettesize)*/ + + /* + transparent color key (tRNS) + + This color uses the same bit depth as the bitdepth value in this struct, which can be 1-bit to 16-bit. + For greyscale PNGs, r, g and b will all 3 be set to the same. + + When decoding, by default you can ignore this information, since LodePNG sets + pixels with this key to transparent already in the raw RGBA output. + + The color key is only supported for color types 0 and 2. + */ + unsigned key_defined; /*is a transparent color key given? 0 = false, 1 = true*/ + unsigned key_r; /*red/greyscale component of color key*/ + unsigned key_g; /*green component of color key*/ + unsigned key_b; /*blue component of color key*/ +} LodePNGColorMode; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_color_mode_init(LodePNGColorMode* info); +void lodepng_color_mode_cleanup(LodePNGColorMode* info); +/*return value is error code (0 means no error)*/ +unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* source); + +void lodepng_palette_clear(LodePNGColorMode* info); +/*add 1 color to the palette*/ +unsigned lodepng_palette_add(LodePNGColorMode* info, + unsigned char r, unsigned char g, unsigned char b, unsigned char a); + +/*get the total amount of bits per pixel, based on colortype and bitdepth in the struct*/ +unsigned lodepng_get_bpp(const LodePNGColorMode* info); +/*get the amount of color channels used, based on colortype in the struct. +If a palette is used, it counts as 1 channel.*/ +unsigned lodepng_get_channels(const LodePNGColorMode* info); +/*is it a greyscale type? (only colortype 0 or 4)*/ +unsigned lodepng_is_greyscale_type(const LodePNGColorMode* info); +/*has it got an alpha channel? (only colortype 2 or 6)*/ +unsigned lodepng_is_alpha_type(const LodePNGColorMode* info); +/*has it got a palette? (only colortype 3)*/ +unsigned lodepng_is_palette_type(const LodePNGColorMode* info); +/*only returns true if there is a palette and there is a value in the palette with alpha < 255. +Loops through the palette to check this.*/ +unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info); +/* +Check if the given color info indicates the possibility of having non-opaque pixels in the PNG image. +Returns true if the image can have translucent or invisible pixels (it still be opaque if it doesn't use such pixels). +Returns false if the image can only have opaque pixels. +In detail, it returns true only if it's a color type with alpha, or has a palette with non-opaque values, +or if "key_defined" is true. +*/ +unsigned lodepng_can_have_alpha(const LodePNGColorMode* info); +/*Returns the byte size of a raw image buffer with given width, height and color mode*/ +size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode* color); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*The information of a Time chunk in PNG.*/ +typedef struct LodePNGTime +{ + unsigned year; /*2 bytes used (0-65535)*/ + unsigned month; /*1-12*/ + unsigned day; /*1-31*/ + unsigned hour; /*0-23*/ + unsigned minute; /*0-59*/ + unsigned second; /*0-60 (to allow for leap seconds)*/ +} LodePNGTime; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/*Information about the PNG image, except pixels, width and height.*/ +typedef struct LodePNGInfo +{ + /*header (IHDR), palette (PLTE) and transparency (tRNS) chunks*/ + unsigned compression_method;/*compression method of the original file. Always 0.*/ + unsigned filter_method; /*filter method of the original file*/ + unsigned interlace_method; /*interlace method of the original file*/ + LodePNGColorMode color; /*color type and bits, palette and transparency of the PNG file*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /* + suggested background color chunk (bKGD) + This color uses the same color mode as the PNG (except alpha channel), which can be 1-bit to 16-bit. + + For greyscale PNGs, r, g and b will all 3 be set to the same. When encoding + the encoder writes the red one. For palette PNGs: When decoding, the RGB value + will be stored, not a palette index. But when encoding, specify the index of + the palette in background_r, the other two are then ignored. + + The decoder does not use this background color to edit the color of pixels. + */ + unsigned background_defined; /*is a suggested background color given?*/ + unsigned background_r; /*red component of suggested background color*/ + unsigned background_g; /*green component of suggested background color*/ + unsigned background_b; /*blue component of suggested background color*/ + + /* + non-international text chunks (tEXt and zTXt) + + The char** arrays each contain num strings. The actual messages are in + text_strings, while text_keys are keywords that give a short description what + the actual text represents, e.g. Title, Author, Description, or anything else. + + A keyword is minimum 1 character and maximum 79 characters long. It's + discouraged to use a single line length longer than 79 characters for texts. + + Don't allocate these text buffers yourself. Use the init/cleanup functions + correctly and use lodepng_add_text and lodepng_clear_text. + */ + size_t text_num; /*the amount of texts in these char** buffers (there may be more texts in itext)*/ + char** text_keys; /*the keyword of a text chunk (e.g. "Comment")*/ + char** text_strings; /*the actual text*/ + + /* + international text chunks (iTXt) + Similar to the non-international text chunks, but with additional strings + "langtags" and "transkeys". + */ + size_t itext_num; /*the amount of international texts in this PNG*/ + char** itext_keys; /*the English keyword of the text chunk (e.g. "Comment")*/ + char** itext_langtags; /*language tag for this text's language, ISO/IEC 646 string, e.g. ISO 639 language tag*/ + char** itext_transkeys; /*keyword translated to the international language - UTF-8 string*/ + char** itext_strings; /*the actual international text - UTF-8 string*/ + + /*time chunk (tIME)*/ + unsigned time_defined; /*set to 1 to make the encoder generate a tIME chunk*/ + LodePNGTime time; + + /*phys chunk (pHYs)*/ + unsigned phys_defined; /*if 0, there is no pHYs chunk and the values below are undefined, if 1 else there is one*/ + unsigned phys_x; /*pixels per unit in x direction*/ + unsigned phys_y; /*pixels per unit in y direction*/ + unsigned phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/ + + /* + unknown chunks + There are 3 buffers, one for each position in the PNG where unknown chunks can appear + each buffer contains all unknown chunks for that position consecutively + The 3 buffers are the unknown chunks between certain critical chunks: + 0: IHDR-PLTE, 1: PLTE-IDAT, 2: IDAT-IEND + Do not allocate or traverse this data yourself. Use the chunk traversing functions declared + later, such as lodepng_chunk_next and lodepng_chunk_append, to read/write this struct. + */ + unsigned char* unknown_chunks_data[3]; + size_t unknown_chunks_size[3]; /*size in bytes of the unknown chunks, given for protection*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGInfo; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_info_init(LodePNGInfo* info); +void lodepng_info_cleanup(LodePNGInfo* info); +/*return value is error code (0 means no error)*/ +unsigned lodepng_info_copy(LodePNGInfo* dest, const LodePNGInfo* source); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +void lodepng_clear_text(LodePNGInfo* info); /*use this to clear the texts again after you filled them in*/ +unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str); /*push back both texts at once*/ + +void lodepng_clear_itext(LodePNGInfo* info); /*use this to clear the itexts again after you filled them in*/ +unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langtag, + const char* transkey, const char* str); /*push back the 4 texts of 1 chunk at once*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/* +Converts raw buffer from one color type to another color type, based on +LodePNGColorMode structs to describe the input and output color type. +See the reference manual at the end of this header file to see which color conversions are supported. +return value = LodePNG error code (0 if all went ok, an error if the conversion isn't supported) +The out buffer must have size (w * h * bpp + 7) / 8, where bpp is the bits per pixel +of the output color type (lodepng_get_bpp) +The fix_png value works as described in struct LodePNGDecoderSettings. +Note: for 16-bit per channel colors, uses big endian format like PNG does. +*/ +unsigned lodepng_convert(unsigned char* out, const unsigned char* in, + LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, + unsigned w, unsigned h, unsigned fix_png); + +#ifdef LODEPNG_COMPILE_DECODER +/* +Settings for the decoder. This contains settings for the PNG and the Zlib +decoder, but not the Info settings from the Info structs. +*/ +typedef struct LodePNGDecoderSettings +{ + LodePNGDecompressSettings zlibsettings; /*in here is the setting to ignore Adler32 checksums*/ + + unsigned ignore_crc; /*ignore CRC checksums*/ + /* + The fix_png setting, if 1, makes the decoder tolerant towards some PNG images + that do not correctly follow the PNG specification. This only supports errors + that are fixable, were found in images that are actually used on the web, and + are silently tolerated by other decoders as well. Currently only one such fix + is implemented: if a palette index is out of bounds given the palette size, + interpret it as opaque black. + By default this value is 0, which makes it stop with an error on such images. + */ + unsigned fix_png; + unsigned color_convert; /*whether to convert the PNG to the color type you want. Default: yes*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + unsigned read_text_chunks; /*if false but remember_unknown_chunks is true, they're stored in the unknown chunks*/ + /*store all bytes from unknown chunks in the LodePNGInfo (off by default, useful for a png editor)*/ + unsigned remember_unknown_chunks; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGDecoderSettings; + +void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/*automatically use color type with less bits per pixel if losslessly possible. Default: AUTO*/ +typedef enum LodePNGFilterStrategy +{ + /*every filter at zero*/ + LFS_ZERO, + /*Use filter that gives minumum sum, as described in the official PNG filter heuristic.*/ + LFS_MINSUM, + /*Use the filter type that gives smallest Shannon entropy for this scanline. Depending + on the image, this is better or worse than minsum.*/ + LFS_ENTROPY, + /* + Brute-force-search PNG filters by compressing each filter for each scanline. + Experimental, very slow, and only rarely gives better compression than MINSUM. + */ + LFS_BRUTE_FORCE, + /*use predefined_filters buffer: you specify the filter type for each scanline*/ + LFS_PREDEFINED +} LodePNGFilterStrategy; + +/*automatically use color type with less bits per pixel if losslessly possible. Default: LAC_AUTO*/ +typedef enum LodePNGAutoConvert +{ + LAC_NO, /*use color type user requested*/ + LAC_ALPHA, /*use color type user requested, but if only opaque pixels and RGBA or grey+alpha, use RGB or grey*/ + LAC_AUTO, /*use PNG color type that can losslessly represent the uncompressed image the smallest possible*/ + /* + like AUTO, but do not choose 1, 2 or 4 bit per pixel types. + sometimes a PNG image compresses worse if less than 8 bits per pixels. + */ + LAC_AUTO_NO_NIBBLES, + /* + like AUTO, but never choose palette color type. For small images, encoding + the palette may take more bytes than what is gained. Note that AUTO also + already prevents encoding the palette for extremely small images, but that may + not be sufficient because due to the compression it cannot predict when to + switch. + */ + LAC_AUTO_NO_PALETTE, + LAC_AUTO_NO_NIBBLES_NO_PALETTE +} LodePNGAutoConvert; + + +/* +Automatically chooses color type that gives smallest amount of bits in the +output image, e.g. grey if there are only greyscale pixels, palette if there +are less than 256 colors, ... +The auto_convert parameter allows limiting it to not use palette, ... +*/ +unsigned lodepng_auto_choose_color(LodePNGColorMode* mode_out, + const unsigned char* image, unsigned w, unsigned h, + const LodePNGColorMode* mode_in, + LodePNGAutoConvert auto_convert); + +/*Settings for the encoder.*/ +typedef struct LodePNGEncoderSettings +{ + LodePNGCompressSettings zlibsettings; /*settings for the zlib encoder, such as window size, ...*/ + + LodePNGAutoConvert auto_convert; /*how to automatically choose output PNG color type, if at all*/ + + /*If true, follows the official PNG heuristic: if the PNG uses a palette or lower than + 8 bit depth, set all filters to zero. Otherwise use the filter_strategy. Note that to + completely follow the official PNG heuristic, filter_palette_zero must be true and + filter_strategy must be LFS_MINSUM*/ + unsigned filter_palette_zero; + /*Which filter strategy to use when not using zeroes due to filter_palette_zero. + Set filter_palette_zero to 0 to ensure always using your chosen strategy. Default: LFS_MINSUM*/ + LodePNGFilterStrategy filter_strategy; + /*used if filter_strategy is LFS_PREDEFINED. In that case, this must point to a buffer with + the same length as the amount of scanlines in the image, and each value must <= 5. You + have to cleanup this buffer, LodePNG will never free it. Don't forget that filter_palette_zero + must be set to 0 to ensure this is also used on palette or low bitdepth images.*/ + const unsigned char* predefined_filters; + + /*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette). + If colortype is 3, PLTE is _always_ created.*/ + unsigned force_palette; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*add LodePNG identifier and version as a text chunk, for debugging*/ + unsigned add_id; + /*encode text chunks as zTXt chunks instead of tEXt chunks, and use compression in iTXt chunks*/ + unsigned text_compression; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGEncoderSettings; + +void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings); +#endif /*LODEPNG_COMPILE_ENCODER*/ + + +#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) +/*The settings, state and information for extended encoding and decoding.*/ +typedef struct LodePNGState +{ +#ifdef LODEPNG_COMPILE_DECODER + LodePNGDecoderSettings decoder; /*the decoding settings*/ +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER + LodePNGEncoderSettings encoder; /*the encoding settings*/ +#endif /*LODEPNG_COMPILE_ENCODER*/ + LodePNGColorMode info_raw; /*specifies the format in which you would like to get the raw pixel buffer*/ + LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/ + unsigned error; +#ifdef LODEPNG_COMPILE_CPP + //For the lodepng::State subclass. + virtual ~LodePNGState(){} +#endif +} LodePNGState; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_state_init(LodePNGState* state); +void lodepng_state_cleanup(LodePNGState* state); +void lodepng_state_copy(LodePNGState* dest, const LodePNGState* source); +#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ + +#ifdef LODEPNG_COMPILE_DECODER +/* +Same as lodepng_decode_memory, but uses a LodePNGState to allow custom settings and +getting much more information about the PNG image and color mode. +*/ +unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize); + +/* +Read the PNG header, but not the actual data. This returns only the information +that is in the header chunk of the PNG, such as width, height and color type. The +information is placed in the info_png field of the LodePNGState. +*/ +unsigned lodepng_inspect(unsigned* w, unsigned* h, + LodePNGState* state, + const unsigned char* in, size_t insize); +#endif /*LODEPNG_COMPILE_DECODER*/ + + +#ifdef LODEPNG_COMPILE_ENCODER +/*This function allocates the out buffer with standard malloc and stores the size in *outsize.*/ +unsigned lodepng_encode(unsigned char** out, size_t* outsize, + const unsigned char* image, unsigned w, unsigned h, + LodePNGState* state); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/* +The lodepng_chunk functions are normally not needed, except to traverse the +unknown chunks stored in the LodePNGInfo struct, or add new ones to it. +It also allows traversing the chunks of an encoded PNG file yourself. + +PNG standard chunk naming conventions: +First byte: uppercase = critical, lowercase = ancillary +Second byte: uppercase = public, lowercase = private +Third byte: must be uppercase +Fourth byte: uppercase = unsafe to copy, lowercase = safe to copy +*/ + +/*get the length of the data of the chunk. Total chunk length has 12 bytes more.*/ +unsigned lodepng_chunk_length(const unsigned char* chunk); + +/*puts the 4-byte type in null terminated string*/ +void lodepng_chunk_type(char type[5], const unsigned char* chunk); + +/*check if the type is the given type*/ +unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type); + +/*0: it's one of the critical chunk types, 1: it's an ancillary chunk (see PNG standard)*/ +unsigned char lodepng_chunk_ancillary(const unsigned char* chunk); + +/*0: public, 1: private (see PNG standard)*/ +unsigned char lodepng_chunk_private(const unsigned char* chunk); + +/*0: the chunk is unsafe to copy, 1: the chunk is safe to copy (see PNG standard)*/ +unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk); + +/*get pointer to the data of the chunk, where the input points to the header of the chunk*/ +unsigned char* lodepng_chunk_data(unsigned char* chunk); +const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk); + +/*returns 0 if the crc is correct, 1 if it's incorrect (0 for OK as usual!)*/ +unsigned lodepng_chunk_check_crc(const unsigned char* chunk); + +/*generates the correct CRC from the data and puts it in the last 4 bytes of the chunk*/ +void lodepng_chunk_generate_crc(unsigned char* chunk); + +/*iterate to next chunks. don't use on IEND chunk, as there is no next chunk then*/ +unsigned char* lodepng_chunk_next(unsigned char* chunk); +const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk); + +/* +Appends chunk to the data in out. The given chunk should already have its chunk header. +The out variable and outlength are updated to reflect the new reallocated buffer. +Returns error code (0 if it went ok) +*/ +unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk); + +/* +Appends new chunk to out. The chunk to append is given by giving its length, type +and data separately. The type is a 4-letter string. +The out variable and outlength are updated to reflect the new reallocated buffer. +Returne error code (0 if it went ok) +*/ +unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, + const char* type, const unsigned char* data); + + +/*Calculate CRC32 of buffer*/ +unsigned lodepng_crc32(const unsigned char* buf, size_t len); +#endif /*LODEPNG_COMPILE_PNG*/ + + +#ifdef LODEPNG_COMPILE_ZLIB +/* +This zlib part can be used independently to zlib compress and decompress a +buffer. It cannot be used to create gzip files however, and it only supports the +part of zlib that is required for PNG, it does not support dictionaries. +*/ + +#ifdef LODEPNG_COMPILE_DECODER +/*Inflate a buffer. Inflate is the decompression step of deflate. Out buffer must be freed after use.*/ +unsigned lodepng_inflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings); + +/* +Decompresses Zlib data. Reallocates the out buffer and appends the data. The +data must be according to the zlib specification. +Either, *out must be NULL and *outsize must be 0, or, *out must be a valid +buffer and *outsize its size in bytes. out must be freed by user after usage. +*/ +unsigned lodepng_zlib_decompress(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGDecompressSettings* settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Compresses data with Zlib. Reallocates the out buffer and appends the data. +Zlib adds a small header and trailer around the deflate data. +The data is output in the format of the zlib specification. +Either, *out must be NULL and *outsize must be 0, or, *out must be a valid +buffer and *outsize its size in bytes. out must be freed by user after usage. +*/ +unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings); + +/* +Find length-limited Huffman code for given frequencies. This function is in the +public interface only for tests, it's used internally by lodepng_deflate. +*/ +unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, + size_t numcodes, unsigned maxbitlen); + +/*Compress a buffer with deflate. See RFC 1951. Out buffer must be freed after use.*/ +unsigned lodepng_deflate(unsigned char** out, size_t* outsize, + const unsigned char* in, size_t insize, + const LodePNGCompressSettings* settings); + +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_ZLIB*/ + +#ifdef LODEPNG_COMPILE_DISK +/* +Load a file from disk into buffer. The function allocates the out buffer, and +after usage you should free it. +out: output parameter, contains pointer to loaded buffer. +outsize: output parameter, size of the allocated out buffer +filename: the path to the file to load +return value: error code (0 means ok) +*/ +unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename); + +/* +Save a file from buffer to disk. Warning, if it exists, this function overwrites +the file without warning! +buffer: the buffer to write +buffersize: size of the buffer to write +filename: the path to the file to save to +return value: error code (0 means ok) +*/ +unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename); +#endif /*LODEPNG_COMPILE_DISK*/ + +#ifdef LODEPNG_COMPILE_CPP +//The LodePNG C++ wrapper uses std::vectors instead of manually allocated memory buffers. +namespace lodepng +{ +#ifdef LODEPNG_COMPILE_PNG +class State : public LodePNGState +{ + public: + State(); + State(const State& other); + virtual ~State(); + State& operator=(const State& other); +}; + +#ifdef LODEPNG_COMPILE_DECODER +//Same as other lodepng::decode, but using a State for more settings and information. +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const unsigned char* in, size_t insize); +unsigned decode(std::vector& out, unsigned& w, unsigned& h, + State& state, + const std::vector& in); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +//Same as other lodepng::encode, but using a State for more settings and information. +unsigned encode(std::vector& out, + const unsigned char* in, unsigned w, unsigned h, + State& state); +unsigned encode(std::vector& out, + const std::vector& in, unsigned w, unsigned h, + State& state); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DISK +/* +Load a file from disk into an std::vector. If the vector is empty, then either +the file doesn't exist or is an empty file. +*/ +void load_file(std::vector& buffer, const std::string& filename); + +/* +Save the binary data in an std::vector to a file on disk. The file is overwritten +without warning. +*/ +void save_file(const std::vector& buffer, const std::string& filename); +#endif //LODEPNG_COMPILE_DISK +#endif //LODEPNG_COMPILE_PNG + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_DECODER +//Zlib-decompress an unsigned char buffer +unsigned decompress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); + +//Zlib-decompress an std::vector +unsigned decompress(std::vector& out, const std::vector& in, + const LodePNGDecompressSettings& settings = lodepng_default_decompress_settings); +#endif //LODEPNG_COMPILE_DECODER + +#ifdef LODEPNG_COMPILE_ENCODER +//Zlib-compress an unsigned char buffer +unsigned compress(std::vector& out, const unsigned char* in, size_t insize, + const LodePNGCompressSettings& settings = lodepng_default_compress_settings); + +//Zlib-compress an std::vector +unsigned compress(std::vector& out, const std::vector& in, + const LodePNGCompressSettings& settings = lodepng_default_compress_settings); +#endif //LODEPNG_COMPILE_ENCODER +#endif //LODEPNG_COMPILE_ZLIB +} //namespace lodepng +#endif /*LODEPNG_COMPILE_CPP*/ + +/* +TODO: +[.] test if there are no memory leaks or security exploits - done a lot but needs to be checked often +[.] check compatibility with vareous compilers - done but needs to be redone for every newer version +[X] converting color to 16-bit per channel types +[ ] read all public PNG chunk types (but never let the color profile and gamma ones touch RGB values) +[ ] make sure encoder generates no chunks with size > (2^31)-1 +[ ] partial decoding (stream processing) +[X] let the "isFullyOpaque" function check color keys and transparent palettes too +[X] better name for the variables "codes", "codesD", "codelengthcodes", "clcl" and "lldl" +[ ] don't stop decoding on errors like 69, 57, 58 (make warnings) +[ ] make option to choose if the raw image with non multiple of 8 bits per scanline should have padding bits or not +[ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes +*/ + +#endif /*LODEPNG_H inclusion guard*/ + +/* +LodePNG Documentation +--------------------- + +0. table of contents +-------------------- + + 1. about + 1.1. supported features + 1.2. features not supported + 2. C and C++ version + 3. security + 4. decoding + 5. encoding + 6. color conversions + 6.1. PNG color types + 6.2. color conversions + 6.3. padding bits + 6.4. A note about 16-bits per channel and endianness + 7. error values + 8. chunks and PNG editing + 9. compiler support + 10. examples + 10.1. decoder C++ example + 10.2. decoder C example + 11. changes + 12. contact information + + +1. about +-------- + +PNG is a file format to store raster images losslessly with good compression, +supporting different color types and alpha channel. + +LodePNG is a PNG codec according to the Portable Network Graphics (PNG) +Specification (Second Edition) - W3C Recommendation 10 November 2003. + +The specifications used are: + +*) Portable Network Graphics (PNG) Specification (Second Edition): + http://www.w3.org/TR/2003/REC-PNG-20031110 +*) RFC 1950 ZLIB Compressed Data Format version 3.3: + http://www.gzip.org/zlib/rfc-zlib.html +*) RFC 1951 DEFLATE Compressed Data Format Specification ver 1.3: + http://www.gzip.org/zlib/rfc-deflate.html + +The most recent version of LodePNG can currently be found at +http://lodev.org/lodepng/ + +LodePNG works both in C (ISO C90) and C++, with a C++ wrapper that adds +extra functionality. + +LodePNG exists out of two files: +-lodepng.h: the header file for both C and C++ +-lodepng.c(pp): give it the name lodepng.c or lodepng.cpp (or .cc) depending on your usage + +If you want to start using LodePNG right away without reading this doc, get the +examples from the LodePNG website to see how to use it in code, or check the +smaller examples in chapter 13 here. + +LodePNG is simple but only supports the basic requirements. To achieve +simplicity, the following design choices were made: There are no dependencies +on any external library. There are functions to decode and encode a PNG with +a single function call, and extended versions of these functions taking a +LodePNGState struct allowing to specify or get more information. By default +the colors of the raw image are always RGB or RGBA, no matter what color type +the PNG file uses. To read and write files, there are simple functions to +convert the files to/from buffers in memory. + +This all makes LodePNG suitable for loading textures in games, demos and small +programs, ... It's less suitable for full fledged image editors, loading PNGs +over network (it requires all the image data to be available before decoding can +begin), life-critical systems, ... + +1.1. supported features +----------------------- + +The following features are supported by the decoder: + +*) decoding of PNGs with any color type, bit depth and interlace mode, to a 24- or 32-bit color raw image, + or the same color type as the PNG +*) encoding of PNGs, from any raw image to 24- or 32-bit color, or the same color type as the raw image +*) Adam7 interlace and deinterlace for any color type +*) loading the image from harddisk or decoding it from a buffer from other sources than harddisk +*) support for alpha channels, including RGBA color model, translucent palettes and color keying +*) zlib decompression (inflate) +*) zlib compression (deflate) +*) CRC32 and ADLER32 checksums +*) handling of unknown chunks, allowing making a PNG editor that stores custom and unknown chunks. +*) the following chunks are supported (generated/interpreted) by both encoder and decoder: + IHDR: header information + PLTE: color palette + IDAT: pixel data + IEND: the final chunk + tRNS: transparency for palettized images + tEXt: textual information + zTXt: compressed textual information + iTXt: international textual information + bKGD: suggested background color + pHYs: physical dimensions + tIME: modification time + +1.2. features not supported +--------------------------- + +The following features are _not_ supported: + +*) some features needed to make a conformant PNG-Editor might be still missing. +*) partial loading/stream processing. All data must be available and is processed in one call. +*) The following public chunks are not supported but treated as unknown chunks by LodePNG + cHRM, gAMA, iCCP, sRGB, sBIT, hIST, sPLT + Some of these are not supported on purpose: LodePNG wants to provide the RGB values + stored in the pixels, not values modified by system dependent gamma or color models. + + +2. C and C++ version +-------------------- + +The C version uses buffers allocated with alloc that you need to free() +yourself. You need to use init and cleanup functions for each struct whenever +using a struct from the C version to avoid exploits and memory leaks. + +The C++ version has extra functions with std::vectors in the interface and the +lodepng::State class which is a LodePNGState with constructor and destructor. + +These files work without modification for both C and C++ compilers because all +the additional C++ code is in "#ifdef __cplusplus" blocks that make C-compilers +ignore it, and the C code is made to compile both with strict ISO C90 and C++. + +To use the C++ version, you need to rename the source file to lodepng.cpp +(instead of lodepng.c), and compile it with a C++ compiler. + +To use the C version, you need to rename the source file to lodepng.c (instead +of lodepng.cpp), and compile it with a C compiler. + + +3. Security +----------- + +Even if carefully designed, it's always possible that LodePNG contains possible +exploits. If you discover one, please let me know, and it will be fixed. + +When using LodePNG, care has to be taken with the C version of LodePNG, as well +as the C-style structs when working with C++. The following conventions are used +for all C-style structs: + +-if a struct has a corresponding init function, always call the init function when making a new one +-if a struct has a corresponding cleanup function, call it before the struct disappears to avoid memory leaks +-if a struct has a corresponding copy function, use the copy function instead of "=". + The destination must also be inited already. + + +4. Decoding +----------- + +Decoding converts a PNG compressed image to a raw pixel buffer. + +Most documentation on using the decoder is at its declarations in the header +above. For C, simple decoding can be done with functions such as +lodepng_decode32, and more advanced decoding can be done with the struct +LodePNGState and lodepng_decode. For C++, all decoding can be done with the +various lodepng::decode functions, and lodepng::State can be used for advanced +features. + +When using the LodePNGState, it uses the following fields for decoding: +*) LodePNGInfo info_png: it stores extra information about the PNG (the input) in here +*) LodePNGColorMode info_raw: here you can say what color mode of the raw image (the output) you want to get +*) LodePNGDecoderSettings decoder: you can specify a few extra settings for the decoder to use + +LodePNGInfo info_png +-------------------- + +After decoding, this contains extra information of the PNG image, except the actual +pixels, width and height because these are already gotten directly from the decoder +functions. + +It contains for example the original color type of the PNG image, text comments, +suggested background color, etc... More details about the LodePNGInfo struct are +at its declaration documentation. + +LodePNGColorMode info_raw +------------------------- + +When decoding, here you can specify which color type you want +the resulting raw image to be. If this is different from the colortype of the +PNG, then the decoder will automatically convert the result. This conversion +always works, except if you want it to convert a color PNG to greyscale or to +a palette with missing colors. + +By default, 32-bit color is used for the result. + +LodePNGDecoderSettings decoder +------------------------------ + +The settings can be used to ignore the errors created by invalid CRC and Adler32 +chunks, and to disable the decoding of tEXt chunks. + +There's also a setting color_convert, true by default. If false, no conversion +is done, the resulting data will be as it was in the PNG (after decompression) +and you'll have to puzzle the colors of the pixels together yourself using the +color type information in the LodePNGInfo. + + +5. Encoding +----------- + +Encoding converts a raw pixel buffer to a PNG compressed image. + +Most documentation on using the encoder is at its declarations in the header +above. For C, simple encoding can be done with functions such as +lodepng_encode32, and more advanced decoding can be done with the struct +LodePNGState and lodepng_encode. For C++, all encoding can be done with the +various lodepng::encode functions, and lodepng::State can be used for advanced +features. + +Like the decoder, the encoder can also give errors. However it gives less errors +since the encoder input is trusted, the decoder input (a PNG image that could +be forged by anyone) is not trusted. + +When using the LodePNGState, it uses the following fields for encoding: +*) LodePNGInfo info_png: here you specify how you want the PNG (the output) to be. +*) LodePNGColorMode info_raw: here you say what color type of the raw image (the input) has +*) LodePNGEncoderSettings encoder: you can specify a few settings for the encoder to use + +LodePNGInfo info_png +-------------------- + +When encoding, you use this the opposite way as when decoding: for encoding, +you fill in the values you want the PNG to have before encoding. By default it's +not needed to specify a color type for the PNG since it's automatically chosen, +but it's possible to choose it yourself given the right settings. + +The encoder will not always exactly match the LodePNGInfo struct you give, +it tries as close as possible. Some things are ignored by the encoder. The +encoder uses, for example, the following settings from it when applicable: +colortype and bitdepth, text chunks, time chunk, the color key, the palette, the +background color, the interlace method, unknown chunks, ... + +When encoding to a PNG with colortype 3, the encoder will generate a PLTE chunk. +If the palette contains any colors for which the alpha channel is not 255 (so +there are translucent colors in the palette), it'll add a tRNS chunk. + +LodePNGColorMode info_raw +------------------------- + +You specify the color type of the raw image that you give to the input here, +including a possible transparent color key and palette you happen to be using in +your raw image data. + +By default, 32-bit color is assumed, meaning your input has to be in RGBA +format with 4 bytes (unsigned chars) per pixel. + +LodePNGEncoderSettings encoder +------------------------------ + +The following settings are supported (some are in sub-structs): +*) auto_convert: when this option is enabled, the encoder will +automatically choose the smallest possible color mode (including color key) that +can encode the colors of all pixels without information loss. +*) btype: the block type for LZ77. 0 = uncompressed, 1 = fixed huffman tree, + 2 = dynamic huffman tree (best compression). Should be 2 for proper + compression. +*) use_lz77: whether or not to use LZ77 for compressed block types. Should be + true for proper compression. +*) windowsize: the window size used by the LZ77 encoder (1 - 32768). Has value + 2048 by default, but can be set to 32768 for better, but slow, compression. +*) force_palette: if colortype is 2 or 6, you can make the encoder write a PLTE + chunk if force_palette is true. This can used as suggested palette to convert + to by viewers that don't support more than 256 colors (if those still exist) +*) add_id: add text chunk "Encoder: LodePNG " to the image. +*) text_compression: default 1. If 1, it'll store texts as zTXt instead of tEXt chunks. + zTXt chunks use zlib compression on the text. This gives a smaller result on + large texts but a larger result on small texts (such as a single program name). + It's all tEXt or all zTXt though, there's no separate setting per text yet. + + +6. color conversions +-------------------- + +An important thing to note about LodePNG, is that the color type of the PNG, and +the color type of the raw image, are completely independent. By default, when +you decode a PNG, you get the result as a raw image in the color type you want, +no matter whether the PNG was encoded with a palette, greyscale or RGBA color. +And if you encode an image, by default LodePNG will automatically choose the PNG +color type that gives good compression based on the values of colors and amount +of colors in the image. It can be configured to let you control it instead as +well, though. + +To be able to do this, LodePNG does conversions from one color mode to another. +It can convert from almost any color type to any other color type, except the +following conversions: RGB to greyscale is not supported, and converting to a +palette when the palette doesn't have a required color is not supported. This is +not supported on purpose: this is information loss which requires a color +reduction algorithm that is beyong the scope of a PNG encoder (yes, RGB to grey +is easy, but there are multiple ways if you want to give some channels more +weight). + +By default, when decoding, you get the raw image in 32-bit RGBA or 24-bit RGB +color, no matter what color type the PNG has. And by default when encoding, +LodePNG automatically picks the best color model for the output PNG, and expects +the input image to be 32-bit RGBA or 24-bit RGB. So, unless you want to control +the color format of the images yourself, you can skip this chapter. + +6.1. PNG color types +-------------------- + +A PNG image can have many color types, ranging from 1-bit color to 64-bit color, +as well as palettized color modes. After the zlib decompression and unfiltering +in the PNG image is done, the raw pixel data will have that color type and thus +a certain amount of bits per pixel. If you want the output raw image after +decoding to have another color type, a conversion is done by LodePNG. + +The PNG specification gives the following color types: + +0: greyscale, bit depths 1, 2, 4, 8, 16 +2: RGB, bit depths 8 and 16 +3: palette, bit depths 1, 2, 4 and 8 +4: greyscale with alpha, bit depths 8 and 16 +6: RGBA, bit depths 8 and 16 + +Bit depth is the amount of bits per pixel per color channel. So the total amount +of bits per pixel is: amount of channels * bitdepth. + +6.2. color conversions +---------------------- + +As explained in the sections about the encoder and decoder, you can specify +color types and bit depths in info_png and info_raw to change the default +behaviour. + +If, when decoding, you want the raw image to be something else than the default, +you need to set the color type and bit depth you want in the LodePNGColorMode, +or the parameters of the simple function of LodePNG you're using. + +If, when encoding, you use another color type than the default in the input +image, you need to specify its color type and bit depth in the LodePNGColorMode +of the raw image, or use the parameters of the simplefunction of LodePNG you're +using. + +If, when encoding, you don't want LodePNG to choose the output PNG color type +but control it yourself, you need to set auto_convert in the encoder settings +to LAC_NONE, and specify the color type you want in the LodePNGInfo of the +encoder. + +If you do any of the above, LodePNG may need to do a color conversion, which +follows the rules below, and may sometimes not be allowed. + +To avoid some confusion: +-the decoder converts from PNG to raw image +-the encoder converts from raw image to PNG +-the colortype and bitdepth in LodePNGColorMode info_raw, are those of the raw image +-the colortype and bitdepth in the color field of LodePNGInfo info_png, are those of the PNG +-when encoding, the color type in LodePNGInfo is ignored if auto_convert + is enabled, it is automatically generated instead +-when decoding, the color type in LodePNGInfo is set by the decoder to that of the original + PNG image, but it can be ignored since the raw image has the color type you requested instead +-if the color type of the LodePNGColorMode and PNG image aren't the same, a conversion + between the color types is done if the color types are supported. If it is not + supported, an error is returned. If the types are the same, no conversion is done. +-even though some conversions aren't supported, LodePNG supports loading PNGs from any + colortype and saving PNGs to any colortype, sometimes it just requires preparing + the raw image correctly before encoding. +-both encoder and decoder use the same color converter. + +Non supported color conversions: +-color to greyscale: no error is thrown, but the result will look ugly because +only the red channel is taken +-anything, to palette when that palette does not have that color in it: in this +case an error is thrown + +Supported color conversions: +-anything to 8-bit RGB, 8-bit RGBA, 16-bit RGB, 16-bit RGBA +-any grey or grey+alpha, to grey or grey+alpha +-anything to a palette, as long as the palette has the requested colors in it +-removing alpha channel +-higher to smaller bitdepth, and vice versa + +If you want no color conversion to be done: +-In the encoder, you can make it save a PNG with any color type by giving the +raw color mode and LodePNGInfo the same color mode, and setting auto_convert to +LAC_NO. +-In the decoder, you can make it store the pixel data in the same color type +as the PNG has, by setting the color_convert setting to false. Settings in +info_raw are then ignored. + +The function lodepng_convert does the color conversion. It is available in the +interface but normally isn't needed since the encoder and decoder already call +it. + +6.3. padding bits +----------------- + +In the PNG file format, if a less than 8-bit per pixel color type is used and the scanlines +have a bit amount that isn't a multiple of 8, then padding bits are used so that each +scanline starts at a fresh byte. But that is NOT true for the LodePNG raw input and output. +The raw input image you give to the encoder, and the raw output image you get from the decoder +will NOT have these padding bits, e.g. in the case of a 1-bit image with a width +of 7 pixels, the first pixel of the second scanline will the the 8th bit of the first byte, +not the first bit of a new byte. + +6.4. A note about 16-bits per channel and endianness +---------------------------------------------------- + +LodePNG uses unsigned char arrays for 16-bit per channel colors too, just like +for any other color format. The 16-bit values are stored in big endian (most +significant byte first) in these arrays. This is the opposite order of the +little endian used by x86 CPU's. + +LodePNG always uses big endian because the PNG file format does so internally. +Conversions to other formats than PNG uses internally are not supported by +LodePNG on purpose, there are myriads of formats, including endianness of 16-bit +colors, the order in which you store R, G, B and A, and so on. Supporting and +converting to/from all that is outside the scope of LodePNG. + +This may mean that, depending on your use case, you may want to convert the big +endian output of LodePNG to little endian with a for loop. This is certainly not +always needed, many applications and libraries support big endian 16-bit colors +anyway, but it means you cannot simply cast the unsigned char* buffer to an +unsigned short* buffer on x86 CPUs. + + +7. error values +--------------- + +All functions in LodePNG that return an error code, return 0 if everything went +OK, or a non-zero code if there was an error. + +The meaning of the LodePNG error values can be retrieved with the function +lodepng_error_text: given the numerical error code, it returns a description +of the error in English as a string. + +Check the implementation of lodepng_error_text to see the meaning of each code. + + +8. chunks and PNG editing +------------------------- + +If you want to add extra chunks to a PNG you encode, or use LodePNG for a PNG +editor that should follow the rules about handling of unknown chunks, or if your +program is able to read other types of chunks than the ones handled by LodePNG, +then that's possible with the chunk functions of LodePNG. + +A PNG chunk has the following layout: + +4 bytes length +4 bytes type name +length bytes data +4 bytes CRC + +8.1. iterating through chunks +----------------------------- + +If you have a buffer containing the PNG image data, then the first chunk (the +IHDR chunk) starts at byte number 8 of that buffer. The first 8 bytes are the +signature of the PNG and are not part of a chunk. But if you start at byte 8 +then you have a chunk, and can check the following things of it. + +NOTE: none of these functions check for memory buffer boundaries. To avoid +exploits, always make sure the buffer contains all the data of the chunks. +When using lodepng_chunk_next, make sure the returned value is within the +allocated memory. + +unsigned lodepng_chunk_length(const unsigned char* chunk): + +Get the length of the chunk's data. The total chunk length is this length + 12. + +void lodepng_chunk_type(char type[5], const unsigned char* chunk): +unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type): + +Get the type of the chunk or compare if it's a certain type + +unsigned char lodepng_chunk_critical(const unsigned char* chunk): +unsigned char lodepng_chunk_private(const unsigned char* chunk): +unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk): + +Check if the chunk is critical in the PNG standard (only IHDR, PLTE, IDAT and IEND are). +Check if the chunk is private (public chunks are part of the standard, private ones not). +Check if the chunk is safe to copy. If it's not, then, when modifying data in a critical +chunk, unsafe to copy chunks of the old image may NOT be saved in the new one if your +program doesn't handle that type of unknown chunk. + +unsigned char* lodepng_chunk_data(unsigned char* chunk): +const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk): + +Get a pointer to the start of the data of the chunk. + +unsigned lodepng_chunk_check_crc(const unsigned char* chunk): +void lodepng_chunk_generate_crc(unsigned char* chunk): + +Check if the crc is correct or generate a correct one. + +unsigned char* lodepng_chunk_next(unsigned char* chunk): +const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk): + +Iterate to the next chunk. This works if you have a buffer with consecutive chunks. Note that these +functions do no boundary checking of the allocated data whatsoever, so make sure there is enough +data available in the buffer to be able to go to the next chunk. + +unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsigned char* chunk): +unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned length, + const char* type, const unsigned char* data): + +These functions are used to create new chunks that are appended to the data in *out that has +length *outlength. The append function appends an existing chunk to the new data. The create +function creates a new chunk with the given parameters and appends it. Type is the 4-letter +name of the chunk. + +8.2. chunks in info_png +----------------------- + +The LodePNGInfo struct contains fields with the unknown chunk in it. It has 3 +buffers (each with size) to contain 3 types of unknown chunks: +the ones that come before the PLTE chunk, the ones that come between the PLTE +and the IDAT chunks, and the ones that come after the IDAT chunks. +It's necessary to make the distionction between these 3 cases because the PNG +standard forces to keep the ordering of unknown chunks compared to the critical +chunks, but does not force any other ordering rules. + +info_png.unknown_chunks_data[0] is the chunks before PLTE +info_png.unknown_chunks_data[1] is the chunks after PLTE, before IDAT +info_png.unknown_chunks_data[2] is the chunks after IDAT + +The chunks in these 3 buffers can be iterated through and read by using the same +way described in the previous subchapter. + +When using the decoder to decode a PNG, you can make it store all unknown chunks +if you set the option settings.remember_unknown_chunks to 1. By default, this +option is off (0). + +The encoder will always encode unknown chunks that are stored in the info_png. +If you need it to add a particular chunk that isn't known by LodePNG, you can +use lodepng_chunk_append or lodepng_chunk_create to the chunk data in +info_png.unknown_chunks_data[x]. + +Chunks that are known by LodePNG should not be added in that way. E.g. to make +LodePNG add a bKGD chunk, set background_defined to true and add the correct +parameters there instead. + + +9. compiler support +------------------- + +No libraries other than the current standard C library are needed to compile +LodePNG. For the C++ version, only the standard C++ library is needed on top. +Add the files lodepng.c(pp) and lodepng.h to your project, include +lodepng.h where needed, and your program can read/write PNG files. + +If performance is important, use optimization when compiling! For both the +encoder and decoder, this makes a large difference. + +Make sure that LodePNG is compiled with the same compiler of the same version +and with the same settings as the rest of the program, or the interfaces with +std::vectors and std::strings in C++ can be incompatible. + +CHAR_BITS must be 8 or higher, because LodePNG uses unsigned chars for octets. + +*) gcc and g++ + +LodePNG is developed in gcc so this compiler is natively supported. It gives no +warnings with compiler options "-Wall -Wextra -pedantic -ansi", with gcc and g++ +version 4.7.1 on Linux, 32-bit and 64-bit. + +*) Mingw + +The Mingw compiler (a port of gcc) for Windows is fully supported by LodePNG. + +*) Visual Studio 2005 and up, Visual C++ Express Edition 2005 and up + +Visual Studio may give warnings about 'fopen' being deprecated. A multiplatform library +can't support the proposed Visual Studio alternative however, so LodePNG keeps using +fopen. If you don't want to see the deprecated warnings, put this on top of lodepng.h +before the inclusions: +#define _CRT_SECURE_NO_DEPRECATE + +Other than the above warnings, LodePNG should be warning-free with warning +level 3 (W3). Warning level 4 (W4) will give warnings about integer conversions. +I'm not planning to resolve these warnings. To get rid of them, let Visual +Studio use warning level W3 for lodepng.cpp only: right click lodepng.cpp, +Properties, C/C++, General, Warning Level: Level 3 (/W3). + +Visual Studio may want "stdafx.h" files to be included in each source file and +give an error "unexpected end of file while looking for precompiled header". +That is not standard C++ and will not be added to the stock LodePNG. You can +disable it for lodepng.cpp only by right clicking it, Properties, C/C++, +Precompiled Headers, and set it to Not Using Precompiled Headers there. + +*) Visual Studio 6.0 + +LodePNG support for Visual Studio 6.0 is not guaranteed because VS6 doesn't +follow the C++ standard correctly. + +*) Comeau C/C++ + +Vesion 20070107 compiles without problems on the Comeau C/C++ Online Test Drive +at http://www.comeaucomputing.com/tryitout in both C90 and C++ mode. + +*) Compilers on Macintosh + +LodePNG has been reported to work both with the gcc and LLVM for Macintosh, both +for C and C++. + +*) Other Compilers + +If you encounter problems on other compilers, feel free to let me know and I may +try to fix it if the compiler is modern standards complient. + + +10. examples +------------ + +This decoder example shows the most basic usage of LodePNG. More complex +examples can be found on the LodePNG website. + +10.1. decoder C++ example +------------------------- + +#include "lodepng.h" +#include + +int main(int argc, char *argv[]) +{ + const char* filename = argc > 1 ? argv[1] : "test.png"; + + //load and decode + std::vector image; + unsigned width, height; + unsigned error = lodepng::decode(image, width, height, filename); + + //if there's an error, display it + if(error) std::cout << "decoder error " << error << ": " << lodepng_error_text(error) << std::endl; + + //the pixels are now in the vector "image", 4 bytes per pixel, ordered RGBARGBA..., use it as texture, draw it, ... +} + +10.2. decoder C example +----------------------- + +#include "lodepng.h" + +int main(int argc, char *argv[]) +{ + unsigned error; + unsigned char* image; + size_t width, height; + const char* filename = argc > 1 ? argv[1] : "test.png"; + + error = lodepng_decode32_file(&image, &width, &height, filename); + + if(error) printf("decoder error %u: %s\n", error, lodepng_error_text(error)); + + / * use image here * / + + free(image); + return 0; +} + + +11. changes +----------- + +The version number of LodePNG is the date of the change given in the format +yyyymmdd. + +Some changes aren't backwards compatible. Those are indicated with a (!) +symbol. + +*) 22 dec 2013: Power of two windowsize required for optimization. +*) 15 apr 2013: Fixed bug with LAC_ALPHA and color key. +*) 25 mar 2013: Added an optional feature to ignore some PNG errors (fix_png). +*) 11 mar 2013 (!): Bugfix with custom free. Changed from "my" to "lodepng_" + prefix for the custom allocators and made it possible with a new #define to + use custom ones in your project without needing to change lodepng's code. +*) 28 jan 2013: Bugfix with color key. +*) 27 okt 2012: Tweaks in text chunk keyword length error handling. +*) 8 okt 2012 (!): Added new filter strategy (entropy) and new auto color mode. + (no palette). Better deflate tree encoding. New compression tweak settings. + Faster color conversions while decoding. Some internal cleanups. +*) 23 sep 2012: Reduced warnings in Visual Studio a little bit. +*) 1 sep 2012 (!): Removed #define's for giving custom (de)compression functions + and made it work with function pointers instead. +*) 23 jun 2012: Added more filter strategies. Made it easier to use custom alloc + and free functions and toggle #defines from compiler flags. Small fixes. +*) 6 may 2012 (!): Made plugging in custom zlib/deflate functions more flexible. +*) 22 apr 2012 (!): Made interface more consistent, renaming a lot. Removed + redundant C++ codec classes. Reduced amount of structs. Everything changed, + but it is cleaner now imho and functionality remains the same. Also fixed + several bugs and shrinked the implementation code. Made new samples. +*) 6 nov 2011 (!): By default, the encoder now automatically chooses the best + PNG color model and bit depth, based on the amount and type of colors of the + raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color. +*) 9 okt 2011: simpler hash chain implementation for the encoder. +*) 8 sep 2011: lz77 encoder lazy matching instead of greedy matching. +*) 23 aug 2011: tweaked the zlib compression parameters after benchmarking. + A bug with the PNG filtertype heuristic was fixed, so that it chooses much + better ones (it's quite significant). A setting to do an experimental, slow, + brute force search for PNG filter types is added. +*) 17 aug 2011 (!): changed some C zlib related function names. +*) 16 aug 2011: made the code less wide (max 120 characters per line). +*) 17 apr 2011: code cleanup. Bugfixes. Convert low to 16-bit per sample colors. +*) 21 feb 2011: fixed compiling for C90. Fixed compiling with sections disabled. +*) 11 dec 2010: encoding is made faster, based on suggestion by Peter Eastman + to optimize long sequences of zeros. +*) 13 nov 2010: added LodePNG_InfoColor_hasPaletteAlpha and + LodePNG_InfoColor_canHaveAlpha functions for convenience. +*) 7 nov 2010: added LodePNG_error_text function to get error code description. +*) 30 okt 2010: made decoding slightly faster +*) 26 okt 2010: (!) changed some C function and struct names (more consistent). + Reorganized the documentation and the declaration order in the header. +*) 08 aug 2010: only changed some comments and external samples. +*) 05 jul 2010: fixed bug thanks to warnings in the new gcc version. +*) 14 mar 2010: fixed bug where too much memory was allocated for char buffers. +*) 02 sep 2008: fixed bug where it could create empty tree that linux apps could + read by ignoring the problem but windows apps couldn't. +*) 06 jun 2008: added more error checks for out of memory cases. +*) 26 apr 2008: added a few more checks here and there to ensure more safety. +*) 06 mar 2008: crash with encoding of strings fixed +*) 02 feb 2008: support for international text chunks added (iTXt) +*) 23 jan 2008: small cleanups, and #defines to divide code in sections +*) 20 jan 2008: support for unknown chunks allowing using LodePNG for an editor. +*) 18 jan 2008: support for tIME and pHYs chunks added to encoder and decoder. +*) 17 jan 2008: ability to encode and decode compressed zTXt chunks added + Also vareous fixes, such as in the deflate and the padding bits code. +*) 13 jan 2008: Added ability to encode Adam7-interlaced images. Improved + filtering code of encoder. +*) 07 jan 2008: (!) changed LodePNG to use ISO C90 instead of C++. A + C++ wrapper around this provides an interface almost identical to before. + Having LodePNG be pure ISO C90 makes it more portable. The C and C++ code + are together in these files but it works both for C and C++ compilers. +*) 29 dec 2007: (!) changed most integer types to unsigned int + other tweaks +*) 30 aug 2007: bug fixed which makes this Borland C++ compatible +*) 09 aug 2007: some VS2005 warnings removed again +*) 21 jul 2007: deflate code placed in new namespace separate from zlib code +*) 08 jun 2007: fixed bug with 2- and 4-bit color, and small interlaced images +*) 04 jun 2007: improved support for Visual Studio 2005: crash with accessing + invalid std::vector element [0] fixed, and level 3 and 4 warnings removed +*) 02 jun 2007: made the encoder add a tag with version by default +*) 27 may 2007: zlib and png code separated (but still in the same file), + simple encoder/decoder functions added for more simple usage cases +*) 19 may 2007: minor fixes, some code cleaning, new error added (error 69), + moved some examples from here to lodepng_examples.cpp +*) 12 may 2007: palette decoding bug fixed +*) 24 apr 2007: changed the license from BSD to the zlib license +*) 11 mar 2007: very simple addition: ability to encode bKGD chunks. +*) 04 mar 2007: (!) tEXt chunk related fixes, and support for encoding + palettized PNG images. Plus little interface change with palette and texts. +*) 03 mar 2007: Made it encode dynamic Huffman shorter with repeat codes. + Fixed a bug where the end code of a block had length 0 in the Huffman tree. +*) 26 feb 2007: Huffman compression with dynamic trees (BTYPE 2) now implemented + and supported by the encoder, resulting in smaller PNGs at the output. +*) 27 jan 2007: Made the Adler-32 test faster so that a timewaste is gone. +*) 24 jan 2007: gave encoder an error interface. Added color conversion from any + greyscale type to 8-bit greyscale with or without alpha. +*) 21 jan 2007: (!) Totally changed the interface. It allows more color types + to convert to and is more uniform. See the manual for how it works now. +*) 07 jan 2007: Some cleanup & fixes, and a few changes over the last days: + encode/decode custom tEXt chunks, separate classes for zlib & deflate, and + at last made the decoder give errors for incorrect Adler32 or Crc. +*) 01 jan 2007: Fixed bug with encoding PNGs with less than 8 bits per channel. +*) 29 dec 2006: Added support for encoding images without alpha channel, and + cleaned out code as well as making certain parts faster. +*) 28 dec 2006: Added "Settings" to the encoder. +*) 26 dec 2006: The encoder now does LZ77 encoding and produces much smaller files now. + Removed some code duplication in the decoder. Fixed little bug in an example. +*) 09 dec 2006: (!) Placed output parameters of public functions as first parameter. + Fixed a bug of the decoder with 16-bit per color. +*) 15 okt 2006: Changed documentation structure +*) 09 okt 2006: Encoder class added. It encodes a valid PNG image from the + given image buffer, however for now it's not compressed. +*) 08 sep 2006: (!) Changed to interface with a Decoder class +*) 30 jul 2006: (!) LodePNG_InfoPng , width and height are now retrieved in different + way. Renamed decodePNG to decodePNGGeneric. +*) 29 jul 2006: (!) Changed the interface: image info is now returned as a + struct of type LodePNG::LodePNG_Info, instead of a vector, which was a bit clumsy. +*) 28 jul 2006: Cleaned the code and added new error checks. + Corrected terminology "deflate" into "inflate". +*) 23 jun 2006: Added SDL example in the documentation in the header, this + example allows easy debugging by displaying the PNG and its transparency. +*) 22 jun 2006: (!) Changed way to obtain error value. Added + loadFile function for convenience. Made decodePNG32 faster. +*) 21 jun 2006: (!) Changed type of info vector to unsigned. + Changed position of palette in info vector. Fixed an important bug that + happened on PNGs with an uncompressed block. +*) 16 jun 2006: Internally changed unsigned into unsigned where + needed, and performed some optimizations. +*) 07 jun 2006: (!) Renamed functions to decodePNG and placed them + in LodePNG namespace. Changed the order of the parameters. Rewrote the + documentation in the header. Renamed files to lodepng.cpp and lodepng.h +*) 22 apr 2006: Optimized and improved some code +*) 07 sep 2005: (!) Changed to std::vector interface +*) 12 aug 2005: Initial release (C++, decoder only) + + +12. contact information +----------------------- + +Feel free to contact me with suggestions, problems, comments, ... concerning +LodePNG. If you encounter a PNG image that doesn't work properly with this +decoder, feel free to send it and I'll use it to find and fix the problem. + +My email address is (puzzle the account and domain together with an @ symbol): +Domain: gmail dot com. +Account: lode dot vandevenne. + + +Copyright (c) 2005-2013 Lode Vandevenne +*/ diff --git a/demo/main.cpp b/demo/main.cpp new file mode 100644 index 0000000..8a79ef6 --- /dev/null +++ b/demo/main.cpp @@ -0,0 +1,299 @@ +/* + * See Copyright Notice in main.h + */ +#include +#include +#include +#include + +#include "main.h" +#include "lodepng.h" + +MORPH_OPTIONS options; + +int main(int argc, char **argv) { + if (!init(argc, argv)) { + fprintf(stderr, "Failed to initialize!\n"); + return -1; + } + if (options.exit_flag) return 0; + + std::chrono::steady_clock::time_point program_start; + std::chrono::steady_clock::time_point program_end; + + program_start = std::chrono::steady_clock::now(); + { + am::morph morph; + + // Options should be set before any operations with + // the morph instance. However, they can be changed + // during the run time too. + morph.set_blob_delimiter (options.differ_blobs); + morph.set_blob_max_size (options.blob_max_size); + morph.set_blob_min_size (options.blob_min_size); + morph.set_blob_box_grip (options.blob_box_grip); + morph.set_blob_box_samples(options.blob_box_samples); + morph.set_blob_threshold (options.blob_threshold); + morph.set_blob_number (options.blob_number); + morph.set_seed (options.seed); + morph.set_blob_rgba_weight(options.blob_rgba_weight); + morph.set_blob_size_weight(options.blob_size_weight); + morph.set_blob_xy_weight (options.blob_xy_weight); + morph.set_degeneration (options.degenerate); + morph.set_density (options.density); // Higher than 1 sets fluid to 0. + morph.set_motion (options.motion); + morph.set_fading (options.fading); + morph.set_threads (options.threads); + morph.set_cycle_length (options.cycle_length); + morph.set_feather (options.feather); + morph.set_keep_background (options.keep_background); + morph.set_finite (options.finite); + morph.set_show_blobs (options.show_blobs); + morph.set_fluid (options.fluid); // Higher than 0 sets density to 1. + + if (!load_files(&morph)) return -1; + + main_loop (&morph); + save_files(&morph); + } + program_end = std::chrono::steady_clock::now(); + + if (options.verbose) { + size_t duration = std::chrono::duration_cast(program_end - program_start).count(); + if (duration < 1000) printf("Process took %lu microseconds to finish.\n", duration); + else if (duration < 1000000) printf("Process took %lu milliseconds to finish.\n", duration/1000); + else printf("Process took %lu seconds to finish.\n", duration/1000000); + } + + return 0; +} + +bool init(int argc, char **argv) { + if (true == (am::get_warning()&am::WARN_POINTER_SIZE)) { + fprintf(stderr, "Pointer size is insufficiently small.\n"); + } + if (true == (am::get_warning()&am::WARN_PIXEL_SIZE)) { + fprintf(stderr, "Pixel size (%lu) is larger than optimal (%lu).\n", + sizeof(am::pixel), + sizeof(void *) + ); + } + if (true == (am::get_warning()&am::WARN_POINT_SIZE)) { + fprintf(stderr, "Point size (%lu) is larger than optimal (%lu).\n", + sizeof(am::point), + sizeof(void *) + ); + } + if (am::uses_opencv()) { + fprintf(stderr, "Experimental OpenCV optimizations are enabled.\n"); + } + if (argc == 1) { + fprintf(stderr, "No arguments specified, try \"\e[1;33m%s --help\e[0m\".\n", argv[0]); + } + return options.parse(argc, argv); +} + +bool fill_morph(am::morph *morph, size_t frame, std::vector *image, unsigned width) { + size_t sz = image->size(); + unsigned char r=0,g=0,b=0,a=0; + size_t pixel = 0; + bool empty = true; + + if (width > UINT16_MAX) return false; + + for (size_t j=0; jat(j); break; + case 1: g=image->at(j); break; + case 2: b=image->at(j); break; + default: { + a=image->at(j); + + if (a == 0) { + pixel++; + continue; + } + morph->add_pixel(frame, am::create_pixel(pixel%width, pixel/width, r, g, b, a)); + pixel++; + empty = false; + break; + } + } + } + + if (empty) morph->add_frame(frame); + + return true; +} + +void save_files(am::morph *morph) { + for (unsigned f = 0; fget_width(), morph->get_height()); + } +} + +bool load_files(am::morph *morph) { + std::string buf; + std::vector image; + unsigned width, height, error; + unsigned max_width=0, max_height=0; + image.reserve(262144); + size_t i; + + // Load input image files: + for (i=0; iget_frame_count()==0) { + fprintf(stderr, "Error. Morph does not contain any key frames.\n"); + return false; + } + + width = max_width; + height= max_height; + morph->set_resolution(width, height); + + return true; +} + +void write_image(am::morph *morph, size_t frame_out, unsigned width, unsigned height) { + double t = morph->get_time(frame_out, options.frames_out); + + char buf[1024]; + sprintf(buf, "%s/%s_%04lu.png", options.outdir.c_str(), options.file.c_str(), frame_out+1); + if (options.verbose) printf("Rendering %4lu. frame ... ", frame_out+1); + + std::vector image; + image.reserve(4*width*height); + image.resize (4*width*height, 0); + + std::vector pixels; + morph->get_pixels(t, &pixels); + + while (!pixels.empty()) { + am::pixel px = pixels.back(); + pixels.pop_back(); + + size_t pos = (px.y*width + px.x)*4; + if (pos >= image.size()) continue; + + image[pos + 0] = px.c.r; + image[pos + 1] = px.c.g; + image[pos + 2] = px.c.b; + image[pos + 3] = px.c.a; + } + + if (options.verbose) printf("writing %s ... ", buf); + + unsigned error = lodepng::encode(buf, image, width, height); + if (error) { + if (options.verbose) printf("[\e[1;31mFAIL\e[0m]\n"); + std::cerr << "encoder error " << error << ": "<< lodepng_error_text(error) << std::endl; + } + else if (options.verbose) printf("[\e[1;32mDONE\e[0m]\n"); +} + +void main_loop(am::morph *morph) { + if (options.verbose) { + printf("Blobifying %ux%u morph.\n", morph->get_width(), morph->get_height()); + } + + std::chrono::steady_clock::time_point start,end; + start = std::chrono::steady_clock::now(); + + size_t blob_count = 0; + size_t largest_frame = 0; + double last_energy = 0.0; + size_t match_blobs = 0; + size_t morph_atoms = 0; + size_t fs = options.files.size(); + + while (1) { + morph->suspend(); + morph->synchronize(); + morph->compute(); + + blob_count = 0; + for (size_t i=0; iget_blob_count(i); + if (bc >= blob_count) { + blob_count = bc; + largest_frame = i; + } + } + + unsigned morph_state = morph->get_state(); + + end = std::chrono::steady_clock::now(); + if (std::chrono::duration_cast(end - start).count() > 1000) { + if (morph_state == am::STATE_BLOB_DETECTION + || morph_state == am::STATE_BLOB_UNIFICATION) { + if (options.verbose) { + printf("%lu/%lu blob%s remaining on frame %lu.\n", + blob_count, morph->get_blob_count(), + blob_count == 1 ? "" : "s", largest_frame + ); + } + } + else if (morph_state == am::STATE_BLOB_MATCHING) { + if (options.verbose) { + double e = morph->get_energy(); + if (last_energy < e) printf("Matching blobs, absolute energy was %30.10f.\n", e); + else printf("Matching blobs, energy decreased by %30.10f.\n", last_energy - e); + last_energy = e; + } + if (++match_blobs >= options.match_time) { + morph->next_state(); + last_energy = 0.0; + } + } + else if (morph_state == am::STATE_ATOM_MORPHING) { + if (options.verbose) { + double e = morph->get_energy(); + if (last_energy < e) printf("Matching atoms, absolute energy was %30.2f.\n", e); + else printf("Matching atoms, energy decreased by %30.2f.\n", last_energy - e); + last_energy = e; + } + if (++morph_atoms >= options.morph_time) { + morph->next_state(); + } + } + else if (morph_state == am::STATE_DONE) { + if (options.verbose) printf("All done!\n"); + break; + } + else { + if (options.verbose) printf("Unknown state!\n"); + break; + } + start = std::chrono::steady_clock::now(); + } + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + + if (options.verbose) { + printf("Frame %lu had the most blobs (%lu).\n", largest_frame, blob_count); + } + + return; +} + diff --git a/demo/main.h b/demo/main.h new file mode 100644 index 0000000..2d0d77b --- /dev/null +++ b/demo/main.h @@ -0,0 +1,38 @@ +/* + * AtoMorph - Command line program for morphing images with AtoMorph Library. + * See Copyright Notice at the end of this file. + */ + +#include "../atomorph.h" +#include "options.h" + +bool init (int argc, char **argv); +bool fill_morph (am::morph *morph, size_t frame, std::vector *image, unsigned width); +void write_image (am::morph *morph, size_t frame, unsigned width, unsigned height); +bool load_files (am::morph *morph); +void save_files (am::morph *morph); +void main_loop (am::morph *morph); + +/* +The MIT License (MIT) + +Copyright (c) 2013-2014 Erich Erstu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ diff --git a/demo/obj/.gitignore b/demo/obj/.gitignore new file mode 100644 index 0000000..5e7d273 --- /dev/null +++ b/demo/obj/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore diff --git a/demo/options.h b/demo/options.h new file mode 100644 index 0000000..9d461aa --- /dev/null +++ b/demo/options.h @@ -0,0 +1,226 @@ +/* + * See Copyright Notice in main.h + */ +#include + +class MORPH_OPTIONS { + public: + MORPH_OPTIONS() {} + ~MORPH_OPTIONS() {} + + const int AS_TEXTURE = am::TEXTURE; + const int AS_AVERAGE = am::AVERAGE; + const int AS_DISTINCT= am::DISTINCT; + + const int BY_RGB = am::RGB; + const int BY_HSP = am::HSP; + + const int MOTION_NONE = am::NONE; + const int MOTION_LINEAR = am::LINEAR; + const int MOTION_SPLINE = am::SPLINE; + + const int FADING_NONE = am::NONE; + const int FADING_LINEAR = am::LINEAR; + const int FADING_COSINE = am::COSINE; + const int FADING_PERLIN = am::PERLIN; + + int verbose = 0; + int blend_blobs = 0; + int finite = 0; + int keep_background= 0; + int show_blobs = AS_TEXTURE; + int differ_blobs = BY_HSP; + int motion = MOTION_SPLINE; + int fading = FADING_PERLIN; + int exit_flag = 0; + std::string name = ""; + std::string indir = "."; + std::string outdir = "."; + std::string file = "untitled_morph"; + int height = 0; + int width = 0; + unsigned seed = 0; + unsigned frames_out= 0; + unsigned match_time= 1; + unsigned morph_time= 3; + unsigned feather = 0; + unsigned fluid = 0; + + unsigned cycle_length=100000; + unsigned threads =8; + + size_t blob_number = 1; + size_t blob_max_size = SIZE_MAX; + size_t blob_min_size = 1; + uint16_t blob_box_grip = UINT16_MAX; + size_t blob_box_samples = 100; + double blob_threshold = 1.0; + unsigned char blob_rgba_weight = 1; + unsigned char blob_size_weight = 1; + unsigned char blob_xy_weight = 1; + size_t degenerate = 10000; + uint16_t density = 2; + + bool frames_out_defined = false; + + std::vector files; + + inline void print_usage (FILE* stream) { + fprintf (stream, "Usage: %s [options] \n", name.c_str()); + fprintf (stream, "Example: %s data/otu_1.png data/otu_2.png data/otu_3.png --verbose\n", name.c_str()); + fprintf (stream, "Options:\n"); + fprintf (stream, + " --blend-blobs Blob intersections are blended together.\n" + " -E --blob-feather INT Number of gradually transparent outer layers.\n" + " -c --blob-rgba-weight[0-255] Importance of a blob's color when matching.\n" + " -z --blob-size-weight[0-255] Importance of a blob's size when matching.\n" + " -p --blob-xy-weight [0-255] Importance of a blob's location when matching.\n" + " -b --blobs INT Preferred number of blobs to keep.\n" + " --blobs-as-texture A blob is textured by its pixels (default).\n" + " --blobs-as-average A blob has the average color of its pixels.\n" + " --blobs-as-distinct A blob has a random color.\n" + " --blobs-by-rgb Differentiate blobs by RGB distance.\n" + " --blobs-by-hsp Differentiate blobs by HSP distance (default).\n" + " -B --blobs-max-size INT Maximum size of a single blob in pixels.\n" + " -m --blobs-min-size INT Minimum size of a single blob in pixels.\n" + " -g --blobs-box-grip INT Unifying grip bounds for undersized blobs.\n" + " -S --blobs-box-samples INT Number of samples to take for each dust box.\n" + " -t --blobs-threshold [0-255] Maximum color difference for merging blobs.\n" + " --brief Print brief messages (default).\n" + " -C --cycle-length INT Number of iterations per morph cycle.\n" + " -d --degenerate INT Degeneration period for energy minimzation.\n" + " -D --density INT Number of atoms per pixel at minimum.\n" + " --fading-none Colours are not interpolated.\n" + " --fading-linear Colours are interpolated linearly.\n" + " --fading-cosine Colours are cosine interpolated.\n" + " --fading-perlin Use Perlin noise colour transition (default).\n" + " -f --file STR Output files with prefix.\n" + " --finite Morph will not repeat itself seamlessly.\n" + " -L --fluid INT Number of fluid simulation steps per frame.\n" + " -F --frames INT Number of frames to generate.\n" + " -h --help Display this usage information.\n" + " -i --indir STR Read input from this directory.\n" + " --keep-background Morph background is cross-dissolved.\n" + " -M --match-time INT Time in seconds given for blob matching.\n" + " -O --morph-time INT Time in seconds given for atom morphing.\n" + " --motion-none Positions are not interpolated.\n" + " --motion-linear Positions are linearly interpolated.\n" + " --motion-spline Uses Catmull-Rom splines (default).\n" + " -o --outdir STR Write output to this directory.\n" + " -s --seed INT Seed for the random number generator.\n" + " -T --threads INT Number of worker threads to spawn.\n" + " --verbose Print verbose messages.\n" + " -v --version Show version information.\n" + ); + } + + inline bool parse(int argc, char **argv) { + int c; + name = argv[0]; + while (1) { + static struct option long_options[] = { + // These options set a flag: + {"verbose", no_argument, &verbose, 1 }, + {"blend-blobs", no_argument, &blend_blobs, 1 }, + {"finite", no_argument, &finite, 1 }, + {"blobs-as-texture", no_argument, &show_blobs, AS_TEXTURE }, + {"blobs-as-average", no_argument, &show_blobs, AS_AVERAGE }, + {"blobs-as-distinct", no_argument, &show_blobs, AS_DISTINCT }, + {"blobs-by-rgb", no_argument, &differ_blobs, BY_RGB }, + {"blobs-by-hsp", no_argument, &differ_blobs, BY_HSP }, + {"brief", no_argument, &verbose, 0 }, + {"keep-background", no_argument, &keep_background, 1 }, + // These options don't set a flag. We distinguish them by their indices: + {"blob-feather", required_argument, 0, 'E'}, + {"blob-rgba-weight", required_argument, 0, 'c'}, + {"blob-size-weight", required_argument, 0, 'z'}, + {"blob-xy-weight", required_argument, 0, 'p'}, + {"blobs", required_argument, 0, 'b'}, + {"blobs-max-size", required_argument, 0, 'B'}, + {"blobs-min-size", required_argument, 0, 'm'}, + {"blobs-box-grip", required_argument, 0, 'g'}, + {"blobs-box-samples", required_argument, 0, 'S'}, + {"blobs-threshold", required_argument, 0, 't'}, + {"cycle-length", required_argument, 0, 'C'}, + {"degenerate", required_argument, 0, 'd'}, + {"density", required_argument, 0, 'D'}, + {"fading-none", no_argument, &fading, FADING_NONE }, + {"fading-linear", no_argument, &fading, FADING_LINEAR }, + {"fading-cosine", no_argument, &fading, FADING_COSINE }, + {"fading-perlin", no_argument, &fading, FADING_PERLIN }, + {"file", required_argument, 0, 'f'}, + {"fluid", required_argument, 0, 'L'}, + {"frames", required_argument, 0, 'F'}, + {"help", no_argument, 0, 'h'}, + {"indir", required_argument, 0, 'i'}, + {"match-time", required_argument, 0, 'M'}, + {"morph-time", required_argument, 0, 'O'}, + {"motion-none", no_argument, &motion, MOTION_NONE }, + {"motion-linear", no_argument, &motion, MOTION_LINEAR }, + {"motion-spline", no_argument, &motion, MOTION_SPLINE }, + {"outdir", required_argument, 0, 'o'}, + {"seed", required_argument, 0, 's'}, + {"threads", required_argument, 0, 'T'}, + {"version", no_argument, 0, 'v'}, + {0, 0, 0, 0 } + }; + + // getopt_long stores the option index here. + int option_index = 0; + + c = getopt_long(argc, argv, "b:B:c:C:d:D:E:m:M:O:g:p:S:t:T:f:L:F:hi:o:s:vz:", long_options, &option_index); + + /* Detect the end of the options. */ + if (c == -1) break; + + switch (c) { + case 0: // If this option set a flag, do nothing else now. + if (long_options[option_index].flag != 0) break; + printf ("option %s", long_options[option_index].name); + if (optarg) printf(" with arg %s", optarg); printf ("\n"); + break; + case 'E': feather = atoi(optarg); break; + case 'c': blob_rgba_weight= std::min(atoi(optarg),255); break; + case 'z': blob_size_weight= std::min(atoi(optarg),255); break; + case 'p': blob_xy_weight = std::min(atoi(optarg),255); break; + case 'b': blob_number = (size_t) atoi(optarg); break; + case 'B': blob_max_size = atoi(optarg); break; + case 'C': cycle_length = atoi(optarg); break; + case 'd': degenerate = (size_t) atoi(optarg); break; + case 'D': density = (uint16_t) atoi(optarg); break; + case 'm': blob_min_size = atoi(optarg); break; + case 'M': match_time = atoi(optarg); break; + case 'O': morph_time = atoi(optarg); break; + case 'g': blob_box_grip = atoi(optarg); break; + case 'S': blob_box_samples= atoi(optarg); break; + case 't': blob_threshold = std::min(atoi(optarg),255)/255.0; break; + case 's': seed = atoi(optarg); break; + case 'T': threads = std::min(atoi(optarg),1024); break; + case 'L': fluid = atoi(optarg); break; + case 'F': frames_out = atoi(optarg); break; + case 'i': indir = optarg; break; + case 'o': outdir = optarg; break; + case 'f': file = optarg; break; + case 'h': print_usage(stdout); exit_flag = 1; break; + case 'v': + printf("AtoMorph %s Copyright (C) 2013-2014 Erich Erstu\n", am::get_version()); + exit_flag = 1; + break; + case '?': + /* getopt_long already printed an error message. */ + break; + default: return false; + } + } + + while (optind < argc) { + files.push_back(argv[optind++]); + } + if (frames_out == 0) { + if (files.size() > 1) frames_out = files.size()*2; + else frames_out = 1; + } + return true; + } +}; + diff --git a/demo/tests/README b/demo/tests/README new file mode 100644 index 0000000..9e15878 --- /dev/null +++ b/demo/tests/README @@ -0,0 +1,9 @@ +ImageMagick is needed for these tests to run properly: + +sudo apt-get update +sudo apt-get install imagemagick --fix-missing + +The completion of all of the tests requires approximately 10 minutes. +However, some of the individual tests finish within seconds. Feel free +to examine the test scripts and modify the parameters. + diff --git a/demo/tests/data/RGB_1.png b/demo/tests/data/RGB_1.png new file mode 100644 index 0000000000000000000000000000000000000000..62e1fa2e6373312699e5f13c63eedfa6248a4952 GIT binary patch literal 628 zcmV-)0*n2LP)e7ALLSvlBog8O}xk z&5&6J0w_bgJ)MAzL|`=dY-C_2_zWbZAYdjDbrnKMygy3?=@c-U^erJStQ_#`1W*!@!bc3R85Md*~EdG*@wHRH;;$yte4F%GB zUl|5JdmFw2ubba>r^ zLEr&^VLU%DqWdR;Xzu`ywK%X3XbPl@C%Z#vCD!H6KmR#=W$T3?`CkBjspAEfA#*N5 wcOVb~*n;uWzZx|KD&O+BqS*LUC=@l~1yKJ^bck!ou>b%707*qoM6N<$f{AROQvd(} literal 0 HcmV?d00001 diff --git a/demo/tests/data/RGB_3.png b/demo/tests/data/RGB_3.png new file mode 100644 index 0000000000000000000000000000000000000000..97d33fd212adb2eb14d9a0b3b3477b4d7ab22963 GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9*Z=uo>y_&LDnIH3b2NIR z9bMng7OL1Upk{eI?9G>|st<;OF<~m=N3B=2KHU+Lz07vLod5KKt!dq_o<7aV-uZj= zg4omZD%fIlOZfFC%oB3SsGX}5a(mzMw-20+4=(3*=#ayCfMb9m|7`)==n``>;rD9E*?JXMO**Ewi!<;dc|07qaCGgJu5-z&(H T{BuolJ4nFO)z4*}Q$iB}w2Pa7 literal 0 HcmV?d00001 diff --git a/demo/tests/data/RGB_4.png b/demo/tests/data/RGB_4.png new file mode 100644 index 0000000000000000000000000000000000000000..6948987d350e0414b9ffa10c063012e5812c57d2 GIT binary patch literal 417 zcmV;S0bc%zP)e1G!=Ytpy7!^U@zX>1|S$wSb z+qoF$g>;t39H(4K5c4mzd=)@d>-!MEs>DIhqi65+eK}wUajbDb3I{BR@c$%eAx3Bc zN>>3(A(R5-X@r!*<>~|#BJ@xMpEftDByn=UuNZ$`mu?)!zIDQVEMxB)yKa5s@rMfO-dlDD~! z$^q~?L&O?}WW%?C`A|R}@;VXN2sw>RoN^Cmfn4!Fe}6iF0=PYiEi1nVr+0M?42sRCs^R2D@-vtPQAWGu}>TzCE^}|n|00000 LNkvXXu0mjfv*W9w literal 0 HcmV?d00001 diff --git a/demo/tests/data/armors/a-0.png b/demo/tests/data/armors/a-0.png new file mode 100644 index 0000000000000000000000000000000000000000..efa71531178bc1b44d2ed2bcb097aceef31b8e3a GIT binary patch literal 1500 zcmZ{kYdq5n7{~wU$R)>-E@&*pDk2*Vi&Hes7%_9FVm5_x*$64pTw*OY$~9>?L|O|& zF0CcWB`4Pm6LlJglyT$|=ikfo;=FjC-}8N*&+qejo;S};Cr6Buf`$SB07_U}G#*rQ zFbHxoU{+0%~NF*1| z9cQ!I@PoU$c#%!zA)8YrI}`zp9df$*R-2offlM=ScR-qocXR=OC|0)_NK*dx7_?4} z>`E>O@?o}~6aY|E{TWg~UV+-rW>lC}Ab2_ztO>y56~{sl%&=%Hf`?%4&c*ymy=}>w zVsE(`Zzt#6nQF=A=G5=k8`+fu=4(sahK{<}N0@47&<19p?ZVbX(Z|gM!e!&t;F89n z%0+wbC8LpJj~KYV{?33`8brNyGM5o@+-z5eG7{FQ#f-d2uTUp$Ip3@d8O-kl)pf2&o0-#$3tsNy~2mw zV%}BJ*0|A8CP%zp$D=9tx^+IB$cNSmjJ~%7`$C(V_?e2U$QyfO=cQHXtF*`a^JJj{ zJLNUQ_rMcq(^H?fVquYu?B~RthoBhUK{qy-M#MW;~KL09x3ppFZ%`1X2^E7mjoF$E=t1tWQlx(MZUkkX#q0 z=6%1bW{^RW^v2&aR14Q{Fl*9h_F(wC0}A(C&TvJLU-Op{@aczp^wGl$O4v(ZoscXB zX7*rh?(DLf5K-)sA^ETsGgQKtZzHEcXUx33Yo)nY+ST6BO70a`U2fKwt0-I^7WZ-3eznoTfU`T zxU_=VDO3P~?yT+Ou6 zMSZ~wK6cqzh5fn-$YTPOB&hhLt>X=JlL z>GYr7*9n(?NUd2}v_v%EUX(Er+7mMAiaO~j9Ccy^#wY%!g??$oo8lMfLy1{VsV&xy zWIWs*lYL^O|5j!z+Kz~KmT9Zbu=hPM?bQm)Y%ZTaakSm;SrmlL-+sP6nfN>MI2wXE2v!R@bfv&vsLt6>V%dcr9|7MX%Z% z@7~A}zM;GenV!mjK+sYS5 zNr-mhnNsogWdfcNq3W^E0hW$cWR-WwJd3k`;JH9Aa6g1B5ps62<5VnR1B+PZ^exOM z)0QX-9c@yP^3mM7K=rA)H(YisL~=ObPMd@nT6;+SR?u${e?jUIt=b@kw6Z!*kK`pq zlm>;mjVhL5V%s7z1Mc-GezY49+h8kU#aO;eKdvK_mX<}OFLh_HB%|?q4U^{$40Z;l z#!hh*43?ouYwd{K1$Wn!_N`Gg`@pyJ(Iq6V1EqW+-sE}Mj~2T*L`?j0tGobVUVZO& zc;@=)sr+?VYe(op^14#;Uk>`UQm0RX&qSAM<3SDZqmod>2ofj&!U%3+V06>~Zc2cg up-kW?V}!nuG0Mp3TkD7C|1n$)4Y)v#`F}&gq-Pvx0I)WW=xXb8iT?r#=&Bb0 literal 0 HcmV?d00001 diff --git a/demo/tests/data/armors/a-1.png b/demo/tests/data/armors/a-1.png new file mode 100644 index 0000000000000000000000000000000000000000..1d0e5de4bd0b35d6087af014203d6ff74808b340 GIT binary patch literal 1658 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 QJr!&KC{7-v7Gh}Tzr~7wg#Z8m literal 0 HcmV?d00001 diff --git a/demo/tests/data/armors/a-12.png b/demo/tests/data/armors/a-12.png new file mode 100644 index 0000000000000000000000000000000000000000..0eaeb52ee07a9abec29bd11e0647580f9a8b2d1a GIT binary patch literal 1925 zcmZ`)Ydq8YAO8u-r9w1`#kNB3AyL@am|SA^>KGH+%+g|JPnjuS0%4+Qp zLb)bXBxf#14y90Q3*khrsrdhT_XdH-6 z;NZ6@f_vw^I6DxOqEUV*0I0d5{ykC|)CvhWFL$7-&tMu9MkFlG4**gR001i!0MNW#{Fw;1M`D^FCrr|ih((%=JxdP_v`>!n z-rU?Qv6J2fb6c1={~!QJ%I`e_DuvTNUTA|7C6o#%RO3876TrkhkOKhxY!c(ANyidE zQ+?OZQ2>fd^nRL2bW}9>ZYId_K=oJuKL9{k=8Z<-gP-0J&t4pd><6z<`6XBhb{KEBvdn{$cA@#M7 zupu$&`}0S-sn7Z*?a<-yFzt6uoHcC%u4jikJ{*?Toh6eqobGOu zvxNT;chq!#Irdud$xB9KahP?{cihIINGtrTaW*UY z5aE9KaP^I#${M>@qExIJ5;c63xqo+ze{E5@;EidI3WBXz2dL4tKhJy{m=z-t4%7?C zY;lUb^EP7Rw}aLhdg!33=VaXu$McyUyM;CPmnX%kGrD;`^d&AaMi=uQgE`*Z&~yG7 z^*3z6KWBe%mGl;%2AHPh*QbN(;N@dnD4%Qo*d7&c=KP{fM6t*gzp*u=Ui64B?$nba zyl5kXcZTL!_mtxulrk!7XtLT|lT7aJ*IHTlRE+^5y@4hq^T(uIo&nGIaOmh3Q9D8_ z&I|I&LtF7vdx-TTS6B`_9bWOq!W0Q{F@lgainM1h@&V)QQnu&ny=NphL;K;?Dl=Ua zTSSOYScYd+ZB^4e;1%5BOTS57E_+UvBd2nY1~|m;jWkDkks=0v@BTY7-ApI5bZh3y zwU4lmntlxrW)UJ*qDl@kinv?Fw$hLzq!op7lWNtX54Do7NMEX7R}pnfi}dwX(=KnI ztf(=D@7OQ2DlQe?Tx+o43`gi)G%{~V=OtTt1QF}jt(gxZwyel^)}nW6(mHvcapy^Y z4axel^Ox%-ezm6unrn_n7nVZ1q|wyDzz6Q*i;Pi3;Jj(b4RdDQ4w6$wiVk1aj@O=JaYBX>3#9uuBW9tNUxR77e9>f*>Wvf z;l?A1Bk9aJGId5{pjEU+|LeN&l1>qRo*mgKpmpJbt_EVDtB>Sz`|^u=p0`IsZ#Ni+K#$3IK=F!&#}mpf#{^(mIpUcyD*EMuorf< z60UMwv@88wBWIg+q(xc(7jY{8t?F3tERA@)J}1JU_z+F!JTup*VJ>Ze0zJSSSG)d{-t~j8+#e*SN1q~x|K2sD|*AN%6~h$ zrX|aidG!*4ifvBlW9(iivzig3KA#;v_$3S#9G6tR4nYu{+>m8FCBtqC6vd#&4FApa zy#G)=WKO0ar341E#rGN2)Ad|h@hvp#Ye^7}CvjU*Icd>97WT5=bp2Pjtrj4St&HLi zs7~$DnlM>-*dk(x;?E}X3VA*;khe7sG1;Xh#8KzLx7rnbq)^Ckk+0VorTQVhHAIl3 zOXpo^Ku`EcMjBIFZiSP1$*PX~-i5T>2s(JzaYb<>{simm^asoBtIou=D^AIe4<|W( zx3EZ&D9l50QFR}hC%qF8L2T}SwH{4=$^uEuj0 zn(9R#L|4mgn*-Hda=q=h{wfUiz+L*ht)fH4(s13)s)Z1T)Ez%qV9PBMJoIkd3XqrHzB7 yts~y{h_k(|v)v(c8#`wkn}xRb?f+9a7e_urN%{W;mXvS-ECAjZe{_|51pB{Ad}yKo literal 0 HcmV?d00001 diff --git a/demo/tests/data/armors/a-13.png b/demo/tests/data/armors/a-13.png new file mode 100644 index 0000000000000000000000000000000000000000..3df94db0d6246cd99e5e241d9d95bfffa981f837 GIT binary patch literal 1709 zcmZ{kXz~OuBfQFp`~S@66pujOi(lz6ciaXLP1keAuG3lYEmn6`e?S9Xw)R$ znJk zknIRS-emyRAuDeVfYVq2<`V%R+y%fYOWYRe15HRGsB{vA!-3kp`ubm*nsO~HauJ9U z2%%$*jBJgK`@FmiwY6CQbO2E8;NWMaXKHHd>go#D223WitgMXB=M#xU8*{ytl@)Us zu(Pw{a=8pNdI{Q|#Y)BDs8lKf0dUTiv5_9`2n6|%(k3D zp;bW8NeS|&$MmS5v-#7WCOV0aS@?2;zVE8;GlU9@K9ot%Sls&77HjHu8up9Q87^Uy z*NOk7yO_cH3FU6H`R`N950<{)KyP_d3cg7fHMDMsktVHe$nAHE!^~D-wpMVP*;dVW z=4P!;1#vmf5;(apj#~BnnP4=$iYY2-cOo)Bs)mM!GMgJM6^f0Uje~D^3{j9-#=^qD zi>K8q22UFc({dR}SAJ7ZZrUgGE7OIOOiy3i9h8nYb!P<^w`O>_NE7qtgT-6c))-SO>kn#g`gRnj|nQm*vy`q}KMYSoaF zs)@_2z~E#grEzi1+isTSeSU{zdSbLez!Aab-?zurx0fhN7-M^gLez`={>Qy0VZh_% zz=u=fMj0DzP2(lTmybsO9KmhTZAs9CtW*<2u}2f0ZAo;7Ov(y5-9P=)v$pEi6TNv3 zUnXJ8hD8_bT{;}JzEQM%jl)Y_9V2s(D8so0uS+w%Rcr@&^rm5`y-+#dAxCuf=8ok& zek)xY@-D_B%EEqkO%c`{opY`$c&I`?iDIE~q~N*h$g6u^lg&aSho$c#YIiG>g(r+Z+@ibDZ`=& z%*24c*1ylbuRJ(N*ZZE+zF8mlt?)1H(dOhLiy%(74yJsjKk-q#Z zV5(p8hmxL1BNv&)vYKA(cFo>{HZGk|c~dAX>a}LLX2Jh~Q>306`(9@0ecVKBzeFoE z``G4(dga+(`bt-!*65m5y9E9r7FNaUE>efdzg`l^Df{M6Pbx-o@O20G(aR8kQifH5<9hoeM7EkMQN+PA3=|&sCpxY5 zBYgu2e%1SYe9pa0CyuFQ&94OMs~smYn`6oU;0{Pm2}7sk&H?Agy4Ah>U1p3w`HKdVr8yF z3!Y@8lilLD8$(@`E;{SYPhm=u5*ikz;9DLG-*NH6yAKI7T~7}eHQ&^q$%no)lz&gk&BE65xi#dAMK?xZn=bab5%u r9KqcUgLNlhvCCaAfBBz4dS=RT?z#UT$eU*7LIFS_(Sm9N67&BHWn|?I literal 0 HcmV?d00001 diff --git a/demo/tests/data/armors/a-14.png b/demo/tests/data/armors/a-14.png new file mode 100644 index 0000000000000000000000000000000000000000..69503e5702c4715c9b1131101106a08343d292b7 GIT binary patch literal 2082 zcmZ`)X*kpi7ysMFUiM`$jVxgdGluNN*t3L?xiiHuM%)^cu}!GS)=)8nNXV7--t2o) zbnQ#D*y5&aSq51Xxy?I$d_UX|=lquQ{Lb^7Pbb;c#ZFWRECc|6sDr(=I|q$9BlQVP#oY5v~;!vfZ8)gu!5Tc6MfFW^{CP zhK7b95J*u`QDS0ZW@e_ixVRe3(io|Pb<+>>J!@}q3M?fcDy|?8fwS3c{^^%*IP18> z++8jJKt#rCBaY(obF{OTUn4crIYKbR)|LVQJP-~CfOn9QmR}~>9>Xz(C4Utc@F-92 zml;8}4CI^}#^D}7^?^%10Dw{)tSvpfJJ-FZv!+jr>~gE(;|;rW8~$bMu8U}VJ*NS*8Rn=4J{o)ol;vYDjUPt}@#T7M&5m?C59&YVWk=mHvZY5KjE48&#omxOrU&Ipn z8}akvYcatF*&$5g6ou03CI9C*7EI**Qbnw0)Tp^{XDW;C#}dXK`wHuV^(e3Enm;kg zZ-st#pdsoec&qT?$A>jcwXBv^9|oc{1-fvryV&Zw7qnNA>QwxfcMk}Mh((*w{JoPj zEtWLeTB!F51DyWhG5F5=HO*d5L1iyTJxe$hC#0{4S+g&(?WW2sQJ@CBjNZ@d~=`jKUko0Sv4WkjACN>B{X14Ww#@4|6P4Vhe* zY{i*Ivw06>Ps*r2>nl=$A-3!8(TK0sW;6P@Ub;;L?@`oQURv{PNd7dJ* z0Ly}(G!C2#h*~jFISU@1<4gL^o#ShF*QFR-JLVP|caSG5b2p$Am*mI9wlwZH_^~#U zTJco9m>0Qb66edh0XqVUC8>}@ZU-Orm%be*urccv!p zO5XC!FzhnOr#Db7Vr$du!pSrqE~Ih4(rM+Lk~syj*&+D~Y)(j*RelTyfy=<%;!0p#pMt!{hL$J?L zCcPuW8@I8a<7TuOQF`+h`#=y5%M0*)&ZnXzwfS@B-;CSo;QIKa({3GH z!aoyNO#f!`q^KDPPWmKm&p4Jv`EdW3`?czGj#OGx%G{U`X3E(QRz7vVRIqgb=>Jw0QuWf{fd}S7)4}aU^TZY&{f;W5G}0GTo)P|uK`&l2VH!y z!nzM7C+Ud`5M__6CJbd?JY!S6&Vw=9{R}d53VvMfnIIGAi>;4JX#c$JC>5@A!v6c^ zI2WdAi5X@h-%LR<=}{bCn6#NSp<9))MW}%08fG514z&t6sa6?9%Jixe%f>5f>lz6UsM~gvQNqwfJvLSf! zYW9h~+Y2VnBnf7tgLDa$r2owM?y}!Aq(<=kZT(7#RtxTKF~cjO{5G&`+T5vQK4e)? z@n7bQ>~p=2PKL{6$uTuER5V2Hczstz%V@V1Jv9UQT=s@h(`K#BV%4oS{M76!-ssHh z(UhPPlrk3Ub$ysdTGtinf5BSh+xEG{R$+JAPn=mOSi6H*UU|wR!8PE@hJf}uwKpQH z(MugglH1=zb$XYVD;1eP0PDk>e8pmGJHvvQRZ)V47nL-Q!tjogpDtBD9qhW-zasYH zNMzLra*FLXv}6nuifxhz^Ka)LC?uQA=d(Y-hG3sLA{SQ3BEc67p~N)Lk-lQ;^=*sq`5ju#)SX7tEOL3W?^?>(P_6{7^? zq}I&*ts;%o0hTV~=resJ@nGx=uE6x&k#V{|Xz?KEyFuXQz0uBJ*5X4$Pk*%(`bNm-l8G=RK)~*?5N$@L>Ta{-FUJ0Q3+@ zeK^7Zjx_W@8ky)LO;CC;1j+<~*lM5c_`krl5JC`<`riTC943Yn032*wtgFzzasLBT Cvz& z&p8&7%dnH{WNv578Bw|9Q2gZfbBo`%KYxGx{&;_0ujlLYcs)Lk&*z`dU81|Q(hu4{ z005wb$2od}iUNnEC=v)BMxKYsLaUR@=BoatiJcR<GMQ|lrNzEYI(qb|9t2`%XLmwb+0@jOPNz3CG?bQ> zhJ=K0x!mUG*DLda=4x-Jq@;-JV#&s-$5&krIWBYc9MADc5y)m&a>bQR||%7&LKZFha2J;=)_YUcf= zc}=kXYz(1Bvw5(zJfo>pnOrZY)$Ul{9p}>FHy7S@x-r6LT-!(>32JNOxqbN~bNer& zE3c(574o4m=U&&uLnNfiSyXg%=lJH1jX1N3D5BKR%dXf`&-PCx{U@MC8pyKXO_-WG zB^s|ONEf+%bbVzjF4XSb0K7jxCdXBoM|-lkO+ie{qdrmoCF7YM>=;h-{zzF}X{s+5 z<<7^oRoxTldO=`Oz1FD)atkxP5jH!c8eZqS(lh#dpGGw6V+r9J?Qj<65+RQ%m=qp5 zJ>uYfjtaT#LY+zTi9dwgd=va{UMD$RKxui;*P2X#h3?gU)@&-ww1X28Vdqfy0N=-W^ZuCEcP8GNXBAJ>zDeaUw+o@E z6*IQ|9{tC6&{hWil5OJG&8b&VkDc9jv>XMif=?<9XS+F?J8L{_dZ_tNgv*_xSAm~o z(1GsE4klvnV!Dsa$F{S&Hfj>9hmhS5@nI_)m4#K1akk0tx*}%cd_$d_W(cMDpC24ltO~RCS%gmy*os?)$x~Ot<6XrxJ8eK2MxJ=lf-iFS=P; zo}1ivgeo+IFb7lg8sk}4TA2CFFjRtMCcFk}@OJ&f*{ogopEI-<Sy1+-#93TOdGS<*Di8}M=u{D69nm;V@;49u)A$i;v#mODx*+eP znrG8XzG^2%)XJ)QYn+n3PL@>rPQrDxEFCtm*&8GBb3?^th2&?g!k)YoKbz{xRKbGYSUkRR^@Y%(Y1q_S`=skf4y3T00^4XlMX8G?+1H z_(6eNqgFzMGfoH{!r&HlEw6(ziW*Zq!;aKR)8Fb&MmJmPiy!$8@yE z)L%IIT7FBurN>C|3ne{-tCjXloEk4*wv)duZa+!h`P%@KPmb@i2pFPg>wKImcxJn7#a*!{NU zu*ccIx^hxGz&|SgH`e#R!GMAFVFU*-DCnSQ3Mha%(#+BXX=P$&Lo%~PTbiLQ%+DY# l&`9K0;m1Gzrw|?)ObcQD|3cCf`4(6J@K|@pDvbY~{{ob|0384T literal 0 HcmV?d00001 diff --git a/demo/tests/data/armors/a-16.png b/demo/tests/data/armors/a-16.png new file mode 100644 index 0000000000000000000000000000000000000000..ba93484b285cf2039e00984aef82cf3d53a07f99 GIT binary patch literal 1118 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 J-(=@|?O$I?D8v8& literal 0 HcmV?d00001 diff --git a/demo/tests/data/armors/a-18.png b/demo/tests/data/armors/a-18.png new file mode 100644 index 0000000000000000000000000000000000000000..b8e434c4228f56bc574b48524182bcc4751ddfd4 GIT binary patch literal 2248 zcmZ`)Ydq6!AO9nbIV)k>Fvm<-Bb!4S!xlykF_qIWLMDrKqnMU-J2j+4x`)ussK`_c zIaCf6>scWr)Eq-1NuKrcdGWmXUf;v@`+k0(>(!O%L3EY_L%;w4$Pw^3PZ488@RpJg zoeH(FC=u%QN9RO6RC6A8Uh%V?JuHKG>urQIdwY4RYNb&LU;o;$~uCC?fu;WL~>9K^2^WKp`c1XiLklj*BN=h2?@)#u4T}eqtS{frK7p|gm z{qK|cFj%s>dJPrtPmI451Cjp1`_UouDk|`QS%Q8u=%GTsB!JZC55k)cU+uNNyU-?|IJEQ!+3`-bx zfh1N~*n^G!<#%5h7l=k#fqmZobza%Lt4B1*bzVIaUafu-cIIy7$aa6Sf1)<;p*GDe ziq-wA2Uin!pIks#Ba z^to?qlb2Ig{u#K_Rl$+_Jv&0W$%zaCCC_O$r@#o7-Ouh{I&`Z(l)*b3EdOMVd|vF? zF%nGNs!{`E&?(u0hL&8=Z>56_E^^ZAoZ9~5FebrFS2FMP+Aww3Qg%iqoFspy@m&L? zPuF1u?@VjY)K~WPQp9Wg0k+m@czhijDn@$e`N1Q^Ta?<@(R#E@65EVdW zXBD?IJwuZP{(()?sDd9&J7w#khIu`rE)F!C>92GIM^j*sKAlUFrb9(FBkp{&9M?qS zGBA9`YhK0y^?Ic6rvC8yKWo!j1s#Z9%~w9e%b^f3(J-er`K3C>&ex6Lar>OcjWd#= z1c&)xkKzb)_v!V!V~fmZ!niyoJnQ`J?19|(#1dffny>DFeHk^=CYVCiX|~L!c9<17 zLId()(QJbw4BrEc1Hj(MX{ycO+m4AP|M(%9OaTpw%UgWm#UpVXF%@z4Khl zUy04!ju{$#oTu;W_-YKgCZ1UeQnKY;upMoCSAmXmS2xRe)YUPwrK;P;+qE(>-g4zp zhxH+?jqh_S(k+Xg3G3Mug`-pOyb*19kfkO8=KIxme6e0_Wr2Q3-Zp{G5YEiCKZzC0 z2;~lc>MY0YGyN=nvCvcR%9LhM!(;xL)Fu$4C!rLn6{RwO#jPi`pGu<$zR3DrOuP(k zo{4!5$0~QZCB@c`8>5?>z#n%Jw2DsKI7#Jh+4U}h*$PU^VIafB-&;niH-t7<4c)6@ z^zY>jX9$U0Sn;Wt{Y}`|HT009@>53B(rt38$;YP&IuVCGrkON$ruLA3uE0oIo+2Be znQ@}?-YsI9Y|0!k*jl}~sj;ssb!s_TUj`IS$27F3WfR%}2?bZwiS?gU$HsBBC=R+B{>H@yFPg(a=K1@T!JeCWNJ^K1RN60ygGR@~iQi6FdL z3UJhrMm=<&T1WZUFl0!R@&eA$_X6frOeGg$ym5OU%qr*0AVLG()iYhYWihD-T`H8j z((+9V3M%M-06qpcT`0d>F(}@1%ET|AD{*S~Yviqrko5dR3}}PbEPG}Ou~xjhF2e1p z^g7OF{RXSOpxKM~wMzBrsPLKZM!~50 zWC`8Tj)hcj9Qei_j>`wKDf>aAALG;W)G^tN$ut~^dg9swn>B;`Qp{k$2kgl_uUt#z zcLnl3nN!XzLx=~hOJF-1W~2Ax9s`lt>S9Uosf9qk<4#wUa&Fd6B|GYj7F4|8@wj$z z!~%zS?y>djgOY`VGLCfQ6F4a(xhLxCrK#kMPY0QXgD-emLr)D39lU}c6HxFq6i=vA z)^w-MVEhXTw^`{JsU|S{^jNBRO@cFjJ&l?*^RMmbr{RG)7qBsa^qd(dS3e>`Wp3Uj()VzU|N_J`AnFI zfCFYo^ZjNP`;nI3NVJtX(h79|VTQ6YGh1$*X#1Z+Ol)Xm___aINc}`g78L-3BN4~3 H4`Tcm8VTI4 literal 0 HcmV?d00001 diff --git a/demo/tests/data/armors/a-19.png b/demo/tests/data/armors/a-19.png new file mode 100644 index 0000000000000000000000000000000000000000..a3f20c0fbadb147e3eb7f1e2cb5d9f8c3d597bf3 GIT binary patch literal 2314 zcmZ`)c|6nqAOB3rEz5nahLE8ReQjgqHrGOPU&(}AGc);;E)tS!gd91_y@a%{+zXrB zN6{CBa(B3rihb9gzdwF|yxz~_^?E+ukH_nuSE4P>T!>$W9{>O$3#^Gf2T`2D^B&^7 zM{7d0IdIs|(8dq|o}~)>_U7hjP`JIh5kMQ1Tj7WkK3IDj0Qg%O0B*zqz)y~KV;KM< z-~h0C5dhFR03b=sZ?@CtG%9SZ@un8Oz8tElscCI(?c(ARA0JPpQp3Z;OG``XbUFkA z>F@8yU@%w%mD$vc%WdXX>Xh zm}{V8KeroUp{&mfTU!fGCv5ZT_pL*U5SHIhvMlo&_p#aUH`brMi@~T#T|4mf%>2E= zGrVc#hcb@^9bBFNT2^s9c5mZ19x=rmdsHliFfq23>IJzH2F)4|vf3MohN9Yi?2=la z$OY$SuUeBd-aS!^fa%f3)%sRURopxrZD2a>ljG0*kJe__e-d1f@PNFqztS)Iyls+@ z(NHxVA{|=hYOGyBU`$cm9Pe3CSZSj*6@B$p8zk<56WY-(P7V(6nTi+F-!mi~;wPwY za+Rp3eL9#IOI^J1rgrPTY%?uo@5Us_>BTy9SS|0_z3vAWvk^KhU~CW6L+CAgY71gR*v#Ewip?Rw_v3 zW=6*%zdEGwc;sWP_kZ=($s25|Z2IOF+r{4r6dnfFw>RnO*Sx5zGc%EjZNVaEyVR|= zXuGAb>BQT|K0ZcwkQe6c%F0FU~kpUeu z^46|4e}zvw zrVJij9!N_jA;YP4w0-b_%ecXRaKPIr20i@%7lWKY7@s{xhG<#csp zc+4?N^qOiQlYjKlnT{X1`Y)rmXD=uV8h6f9EydtXJjO3Hkmq`J{Z3=KVw2@2xnHMqt3|+-;jVb?ha2yR`PzeAr=+rFMaKxx z9b*N*A^6FOgemmWhYYXFA!n~Noo9(I-EL^Gy3JCY3%~~CEv0+5540(yI;SgiheqaI zR?^xND@hh6exvk%+{o^)>~>$ebXVfs7U3p6D*v+__*K3l3gW~9Ncp{YgXmL*>ry_A zlrArG?~avd0%o`=l5q%Z8dI{ZXp-l)0q2-lBTz&Epn?2lqLmN72nef#* z=}F1_*Qo9&eV54sAHfBkcLu0;)6m2gLGl)4DmP>0;~HH{1>EPC0?l2#zNDdE zedOP_pC1-ku%DfNoekODmn7W$C7obXfb5zM-)|7#uyweq`ts+FKz(0pImE62{}T z=Lt!h#G>sa=QnGUWy1%h!BM@Y4?^$V;VJr(PL9hG;imbs$LmfmQ_HbReQLU0dP*`m zHuPj_{Ks>qZ)Jp@f1B$FE0`b0^-ev_MD8r-CVk0Opad&68suLm(+9)kA{%w16Shx9 zDsZnHV<$zgCmU$&%N`pV371FjhVEZLHj9Ub?S)OY!9nii_~dI_ zOD;}W`MQdfm25friDZG(+q-5?kAxcw#-hOEe z^=NmpFQ1HZx2e?k09D6)WCSxYhd1mo;_=sq+jx8k2Viq9myIqX`UD9bhuls zq!01_l}Wn@8&x5Giq6d4jH!h=_Xdab?uWV)RZ5tZUA+TrlaTsi^6t(HHrHpmaQ@e~ z&x$$6@+8^RnN08|`=WhFz8nCw;0PTJ_!$j^E*^nI>mbnDS}?da8V=uRpX>OaKyWA_ Z;BwUe58Rk{iQxnQ3sam4&FJE-{{Z$J9Torp literal 0 HcmV?d00001 diff --git a/demo/tests/data/armors/a-2.png b/demo/tests/data/armors/a-2.png new file mode 100644 index 0000000000000000000000000000000000000000..e3e2138a8ab5524a5a6a0b66c4a4c8b4afcacfb3 GIT binary patch literal 1930 zcmZ{kX*kqtAIJaJW{f3cjx8p}o^8fX97ZEE*~T;{#ui~HyI~k=EMY7u;yjkJk0pB& zPCUw%LJpOp$#gKM;?N;+5t{QqFP|6Bi|_sUeZTkpz3%I}U)(uFS4RmkMKJ&XBnWsM z38W<`GDHYmrCOtmK?sLnU9bRf{}${pKm_yxG?Jq|&_1oS3L2F_Jjn$Bk~9GzH3I;? zgHh^d0EkBez?we*Sd{{RT=d;X?$+Q&KGB)%KnM;7$IJe<-tH!NJ1t9$a!Yw&X`U~O zNluI+I6FHdk;oI0lEw-O15M#JHa3Q4L<0kZsowa-QRbJ~8~hbEl}gpn#fl$0MxjtL zGc%>7rD-(U_V%`f^ohEr{rGbnE1ps%SC<=ps zM&l`92$T6&0zmm)`F}%tG&Tf$tvGNd10DOW6#yXefPll2Jx4Y?Hs~BP@tr2A+|)2} z`owM2nahMfO~bzb=;(E-UnrO25K`9H9phWIdlE&K1^ZIX?o?Sb4=8^a^4wHhUeOKT z#zzDisJKKOdmEwnR^D8ECokqj1MT|83rlrVm#_ow!>5Ye$TC}WZ)7M-nTZH=RY?gk zy&m6xH0Tj?)SlqNk-TOrf1h>4rJRO5&P814=Sb|Xt#I?2AM}sR1w>UeuXp^6%sOH^ zwpRI}&LARpPbRm{OVw!(6?y(j!DSCob6d2$&w$8S=7jGyK|22JQ5y(&|+z~dA{2A73Sql8;JHKkcv zf*!-1(vI=FtGkYD;fCRQ;s2DG@J_(_6no@KVg<~lNVCG|l?gQovZmJMwOsA4Th^({ zQ*$UReK4+|=CmlG+lj53SC>rJABwHEys~MIN$dzH&(S=*Xq}lM6S;RNM6zEd&E_g= z3B!-gX}RC4gtv)WV)7BShJ4gk*qh_gwgKavhKphGJT!wHdUy;q}M|Dlk7>F`R(Oqwm5{Lg6sI4RU*O@eJ>&Hn(T9p*U1j{ed_b< z_gl}jRrk(CE)5Lb)@WMZM~3s7D4n-N#zmy?~4hx`5OuS%xIVV z7%?dBHDc6n>_Bh=7QX!Eei~Uxl9<<6{ztWvsXfU)M+a}9n!K0lKTbZHU-y{OnS1{} z9a5Us0cnk{ow#u6TF<&^{m0xuDT_3*wrP>&7v2R>vIg2KUrkw;=EY4PowobC=Owj* zR_%1Ww^wB(sWT#M^HELm-VY=%rcLUA$^PpN>C1<-_ti7iUBoBvSo8v@!@WTf9pr+a z_Q|bPqix9SFG(=?9K5AZw__t<&UcnGiT7LXvO^`d_Yg1aq(3exB$SLb7U!rTs9CMV zuVqKUye{OtCN@ZnEza=m?=*xXYT@)`DCG)e z96qDoTxrLS8rbxy|0HM>8PFw5wTnOV`ts{j#6xR2Kh*3?1d}8-Gf`N4s=x60MV!HL ztVLNi4A+K(JYeuzofl_VmWmPgf=xH>-PaHn*H7&Fm$cpMCG%84z3eT(guU z@Z2dKd8V(XB|K^I+%9i>GL~^!M!Df5P53X5arT6;g-k3aV zeS1E9W4`uN0kOZBVZ%5~-`dJyp*;CY;AwrU z$_xu4Rwt-v#~7z}S=h6z_vX&y)qN>(6{YAH#cqwrWH!3tUhX%IO8Z#t85MEEQl;l6 zP=QCi2}YXgE1sY5Dey8`LNIow=+fD<$mcd(B_nEI%!Ji+W4HmLuv`0FvFwNbQMLo?oq(gVK4p; z=Rt7C&djMzkTFyO&`GaVf$68e9^M&=?baw5dMEoQ$!sGQn6G8|k8rtjA>cOX>gwXQs0I7k4D%Bu6JY=Y3jk9JjKv zqEe}JIz1ziMnWRH8>7H&MN=iz2P0gmJCg|So?ryk}_RPx*^PRbS zw{De4Btj#dR%o$0(!g+j8U?QfsX^Uo_JBGOy+-eemZ+)mhF zF1wvn`Km!8nH-MMaBQsdTe(`X(L6|T9bI=M4qqUPQEMaoUh)xhf8GsHeLDBmWPFp) zDd&xPye+P=d=rh8A9L;73Jmb;xifBk{?&a~lB-OYVz@$m-cjDfUDY?D)DowgUd_#v zLX>^k33uO=py7dj{2uAwLiouLn7eXE5i08hJ9j`n!(}i`$Prb43plqrqWH$L3SP?R z)W`i}gPicU=_4FuEIAkU31ug!ZtkHsRL90|&~*uG6iTRJl_B>>&)f+(v*7p$m$zQw zkld}#u(>w#`kB%9i)O(X>7sH+!AQd^qGfyE;Mg&7lh)hv;OL#RryFZ2D9fB^(ejIg z$3(cMb7aupiXhU6!K%1xq396<2 z7BgE?6fTzIDsC(;#vQ=-h?1pyk%OC4YEZqGhr>se+w|B)3J193PNOx z!sky*^)~GEb*9^fYQtEC7f0pfoF7a@Xh~J5qQ$}FlN|p;Y@E2W|DAX~+67HyjYMaz zUKVTqEYLv@a#GxUo%lqm%%p}23M)#2;}tcpE+7(T1i($O-8x|TNGaqa%i z_2ZdD%d*){Lesc6E>}H|yjJ%6II4DiypLht%Yu>b>4O7}K^JCAnQ69XaNmBZ`DYux z4lG}&pna}pb%tcx*lKaNUhfTsv8j1pHT5NEGrqL@K-aSLYp-9)jC#A-gk9N~q{QFp zu8XvCN=uyH+YidxyL}|iy9|)tlXPYB)3~pK8%F)KN@A^7_8^$}AXPSm(I3jjdLEm4 z{l>_=!?GaIi`&_A%?$e`BW>H2c-wwPl-Cuab%o==fcMZk)0c$My?edb9e)i*aVI}_ zuiUW_qA&5i&MiON<@ebm@I9ur2o0x)5kk-FZ&NwuV8)yJD0nbIB%LBmrmwY8-Er?=WDe=6nhu+AUF2%9z~*Nu*ylJnJ?i@eBwe^xSoGb>*j(}yoqj!> z?>2<(wfOG7y_(8#Su0N(*Q8ADvrGp(w-n(> z^chvZd4h;Jhq%WH{r-i?V#g)x1dvMwlg1p5mF#$j$UIh(;3(~0`aP^^w>?LQQJl%6 zNMG1toupp;v-z>Mke`HZ>neZP_Thk-%R&n~4~QgDmbD3*>5Zz;53@Paaerihe`Fx> z$jLy+fC(07x*cn_9k+vqvmlz{hf^&mT|DL8`l|lAaO(0IDF_ z)dz9{BpO@}TGg8qaFA__Bzh46psi3@5(elQU9Obkc?ygwpDNiv3iV1FR zNsuo<0sz0Q)d0v86UlTaRMz?~8K9E8<9nErNQ{JDjs?v$pml><4Z#`El}Pg+cw7E9 zgT4ZIF7ZM^f;*w?m7SxE#nZJQ+*=sYk z=V}*BH)@N5$A2s!lk{AcBe2rc$+T)}yxOMvur-b_=+85u7t`TcIX<6AwY=TM0Wbj{L5V&1v0r~)uSZh#@!lH)?CA|*k5oQ+{?hxr%5)>TmQKDX{{82A zfzl3Hc|zVTbmk-aoVIIa2C8my&}Do`^vXZzm;91&&Z)qhBx8q4smpcUyHowGBe|Kw zx6{tfZlUv#N$+O*$qu(ru+=pWlQoL|q4F{-rQH*_0$;jbLz(GwUUpp%>W|;=o^3I6 zs&Vyxz_RKvb1U-;BSa0<&lLsU2;*xl4I%q`Igyx$HwvOF#;W-3Um949YnES3L2bTb zOXA|!=BUa`A7bu(4)`pM;h7(;M85voH4iC2O`5yztrm%`;W!(IqyoW|mT=lQApC*_d5qt6)LTY3%{^R!u(F(Q%BTAX4iVX0vje{_T{R5#VxTrhr^&u|X>kb5EQ5`j&U7!AW1-H$IE%ih&#>(&&U ztrO(jcySrtxV{lqEIT{2-ZD{2<-M-1?!G!X{BrrPvG(lz_GQ^xM$5JFh;d5?y{k!k zNmgBbk^Pr-)LH;G#aAvBbAlV_jGSoi^rhX7X=<+B$KiV*Z!k1E%(!p6q;0=h#@xj7 zDs+pET=q?&H=3bhXSxn^8`l}S7H|<4iI1}2ybzi^;jA;BvhUsL$TVe^z3$TQG$eZA z-H$6&9C%Y^h77V0VTWu;`t`U4ANj@??2qO?DL+!?7Kw05Qr6}8kX_F86^i@cBg(`5 z@CT;QVhzF$ggnX=6e_Tu$+Wm1ed9Hv%z3@-h!ePJ2&$;ZJ{Wx2jJb%Ak1Gj%$Tb%2 z(GhdkxiIUla5c?+O!Chqg$;9O<8+4|dYymbFSgnz)xcMOSR$9B#M=M7qhdCmW-NzB zNo+~K#!C8zzpm}iInx(^d!qXrwP>*_Xw#R=bQ zbBJj}Ej!}_Njj&xkDkdhT1v#1Hi;M9yJr)}x-D}Dk{4iWV0y_GZY|jUMB$&!8}>oa zhlFC0{8@}p7Sk^LI1@4ei^f=6qHQcO`)C-voi)Y|hqXZC?9k}ke* U{{{AQ`WdJIfF!D`&?V&DzbsC~rT_o{ literal 0 HcmV?d00001 diff --git a/demo/tests/data/armors/a-5.png b/demo/tests/data/armors/a-5.png new file mode 100644 index 0000000000000000000000000000000000000000..8bcb1135746da507fd7bf27fae2827fdc2b4f1a0 GIT binary patch literal 1627 zcmZ{kdotF<(V(8mcvRw5Eir>UD1sPikOv~c5X!_Oi5P>1xTv~1hUn6k5U;AL zD%I3uw53L;rK7Ejwu)P76ibb^xTE!$b{Wy!U;n&+%vtMu_THbf_F8A1KhEjkAb%aL z16lw89XgH5fz%zEP=q?P>$Rm4A%O{f0(}7JD%DoT!lA5|&he*!j;H7qC|JhRIDr7< z90nl&M*#kUQ2tv0Bsc(8c>s`V05DFw(8uFnT zNI+7ptl<0hH#IfUzP1(dyxsAbA*My0hsgmH;xV*tOWbvIYD%J`*v|9w^S`tvOY=gz zj+)Iq$h&?%UbS>(YilbjmCiCSz}p$ARI2-G75kuj{3C-C6aqkI#S=Fusl_qwMC5w<@wm;mx5i@zm5t0UR9mFDVLJBsl$tg+u43i zvZGaV?iwF|b=t9DxS;2-LqCtat0EaE6GXP$eiT{K zKWD=XBeW;c{}bVlQbZ+0i~AzIC;p4|zm+LaDi3qRVDLJBJ5l3n)_=dGM+zbe00`1X=A8lh}PBhQw$NFxFYm@ez_9kaqsuCbCZqV<*?Y< zNs6E)GhK!zyU;D1M6s>qI*z}r$t-oAzPgRbiMd>A@&W!1E$&$8RPuE!bux2=wM z_5?R)`d3k#6oG&3xq~M3Dys$c@ZFP_r#G?mvPzGy2@gJu*ty}0Ij>S7BnC{u$H6HHp z7RV>)pQuM?d!%#r8PQp`4b%h0v!))4=&6WAz0^C;#nY0?r(`)6E%tgcJ|S~n)c;ld zajNhmVbsxP#4k-2^7>ZsjQCHZdELelvg~*&!W!Lab4bsMmgBVbST3& zA|oL-gHMVV^C1BQ9NyUh=i-2O4aK{Wobe(^b literal 0 HcmV?d00001 diff --git a/demo/tests/data/armors/a-6.png b/demo/tests/data/armors/a-6.png new file mode 100644 index 0000000000000000000000000000000000000000..d1f628001d6693fca22f59eda8c624987924c6e1 GIT binary patch literal 1430 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 U8XiT~05vdpy85}Sb4q9e0Owx*bN~PV literal 0 HcmV?d00001 diff --git a/demo/tests/data/armors/a-8.png b/demo/tests/data/armors/a-8.png new file mode 100644 index 0000000000000000000000000000000000000000..83499556bcba5292370ca0f61dde479275deb605 GIT binary patch literal 3144 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/armors/a-9.png b/demo/tests/data/armors/a-9.png new file mode 100644 index 0000000000000000000000000000000000000000..cb8d65a36223e7fd9495506113440fe216b1ef57 GIT binary patch literal 2064 zcmZ`)c|6nqAOHA%ha9U2HGF4Sj~rYbyf)045UfUNW?k z6=lnxvc9b$8Y2TxIMy8t00N%MzajE6Ef??Q;si84)18qC7?t4V4giTp0Khp10Ka4w zXBq%lC;*rZ1_1ja0N5E*+Un^bdpPakMsX&Fg~{mt{rl;3x|^FD5{ZODq4DwYTrSt& z-#~q*8=+5j6n;?|M_~i>arhiJ~UfZZm9MZ0zRdre!qwfNb;+rWeT@01_@e zwUsHk(8DfxW5l*PLzz&DK6EHvHX$eD0FXYzboy<^5d3AP%8uV92Naj?`fVn}V8dmH zVahlKxc!q<1^@~qA|6XQ(o*!-0&RXWOO8nbvSS^Q3raLb?2cmuq@@emsddh2#4Q<7eXv&MNr%S$PTxso3mC z#It7x?5?tw4%n~)L>Kh&> z8QekXlo2v1r2@I|8=xXHX}1MYwD{(_U!wu|pmKNeXFO)w>1+7`960r`0vTV^1G+2deLTx_%~e6T zOu^a1v^6wGnAAn>%@Z{%dPtD54Iom zL>@NX3hF!7Leq9#fmb7D{Na}9yFrM7c|`7+FJ@X56NxI^36aMbIyAUH%lTiu+qlvR zRW_l0pwyY`&mm;mD6YDu9(26HkHBbHd17N4_G!hh{IMY*yC5^E@1iw%szn^wT!-Vb zVEdc;wq0u-y!;fgXGL+NKm$gu{r2;fUe)VY0>?t~FnW(pUX&Fm`b7vM-gc$-+tkwP z>GqWM#E!s5AVbdDJFt7gz2F*Yc)VEIX}0y+9Vuq|o90UT_7{;Fk(T$|{NT`0a3bx? zK`3PExc>Lrp=HXF@<@Tw>sK>+{US-2sHXn@y+LW^iY53*gW8FyqEpS*^rnkrvoJz} z1Cd*OE|H$GJ3W>V3VxwjNW(tjP&-f75B!Y}+VMbn_CSM>_NoOz2&QB_u-qU{*bJ?6q9P7 zWJcK7*q!RhY!YPf!LpwSHh$sr&p6hb;q%aaU-#hB+Q$XqaK2XE;A=t|F@eqVd3qRa zgLDAnMmHVftmps>zG4>E0i9qP5g@jj?VjX!)d7A#C^6 z`;ARG=KDW92~S!d%Yyc6>!8Zh|1o(-NY~8D9}@Jao)r-nrmdE(l+`4o8e0=R`7nAhchBrA+3oFbq18D+!>rHfo@S%RD7CKG1zJ7~lLZV%f zjQ%wrT*4l~*<9i^o!VS_{`|`Mh=x~^>mNux1XmB3cw;5yAw<$ScV!>#&XU&IU(n4q zO}TNeKuA%AB26cfM|hHTyi%uH{#bZ2$JB0>2!3O?>4jO<_F zKjB%ywQ@{IeX$0yd(q3CxCCymf!2udK@qz>oa}#f+bNV*33qQ3(eN+x?4UwNgu`CD zB33-xlUpILHA#P=2`1#uA_XL4h);g{!d^x)Ao!q(o>!XAS*Lt*SusKw4t eUH=n^jHWT@?EfF&Nc@v!0f6XC!Z$hvr~MZk^p42@ literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/body_1.png b/demo/tests/data/battlelord/body_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f797fe86e26d18ff86539153c3321333512fc7f3 GIT binary patch literal 11142 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 VnE3UC-z3*?N^)wlb<&?h{|}g0)#(5L literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/body_3.png b/demo/tests/data/battlelord/body_3.png new file mode 100644 index 0000000000000000000000000000000000000000..342ae1675f18e674b59c76c4515d917970d812fe GIT binary patch literal 11035 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/body_4.png b/demo/tests/data/battlelord/body_4.png new file mode 100644 index 0000000000000000000000000000000000000000..5251ed32de508f94ea501d194338b5113df013db GIT binary patch literal 11592 zcmb7qRZtvE6D@AR-8Hy>xJ!Zt2@V^4aR_dUC%6Z9XYs`smjn$i3yXWm1_&11FaOJZ zzPF~jr)s9AYG$fuy8HBr{ivmaheM5ngoK2rruts@wGaEBU}3!KL0PMb*ABz_gUWlP zm;bfm-paJs5o~u=6E7sBHzfZPWTf1D%GW_mZ#7LN%uRF>LIFMxYVl?yBt|5)_X_&{ ztH-?-38qU0h@0w(!Fi9nDxY<)4KK~D67F?CsbQ4?S8md*05wLF6^3cJYJ?dxA;tht zlK`>I9|eMdvq9!s?B73BX}|x#L6yTLA6J%72s0)$ww8D4P#&BRl-x|xC3K3Uu8?21 zJ-J*z=;UL_NFJBVz^}beQeQnn%L+hto@v9Dt?;9y{31us=CJ`SEJ`in>^#I6Bgw<8FdI2Y9n`D4Y_)pRY|FA`KdUdrm~S_&Bfh267+BapDLVeeHLxUwoP9p$vAdERx&vwx-70ST;`f zX?WQ@5XdV)VXi0f{NZozyR8JT*) zrmSqD8f|*=ARay4>e&d~iW*SEIt|i9@yOn=Ej-zZ`F~}XObHcFfrOm!4p_#HbYilVwU*<7=Z>~ce?Xv>% zNiF@{+%iYb?Z?IMf@s(JeeUMLFCz|5eql3#DKJ|Tt$5~_Si?h9$N=U@HiJFrxsSVr z!KnGa zXnszYvY6SkXbPowp0{VnMX?5)4 zg#7{d*c4tfNgD)ITR5;D{$@=6H@}$g6@#Ug+q`lx&(M?DMqZ0LVr=c)=%Mby{h`qo z7im`p%uR)h`S;}b>8>HbjDZGyR`PvPc@kgY9C6?F@QYTR1ZvQ97MOG5U-~rJ$nrZ# zHmjN>_XmowQ<`bC~8nFg3U1vCPEpHibKB%oRUCs@ohKXOoH^KEkrsckZ%y680m!frQ*XxSzVxvX zb1_wQw%A$!vnIsD*speV%7}2Mo-KGQTCgzkv>rSrfk@Dm!zkZcdqc50R+llf&P6*V zyyI&!KVb$T%hQV$k@Wl5Dso8Wd`Vp#4K|XEa9Ca|z>A#$`KH1A53LiV3GVJyslwgV z(+O)po?C>pt*#$BkgUxhX4a`T)abU!1~Y0En8sqciYV8(yY5nVOuEh#HJ#2Kgl-H|Jdps(bZCQ zNhOd#2buA%!oRef3O-OcX^vA920#4XJQ&Iync(mB4($j$dY)1c4D{&^UUq56ht3JF z(fzAq)Z%F{4=Yg6>E4_uUC!0ZGVd#mdJ0*f`IQ2#fM4Y5GU8u&_3@~tMZ8su-OFAc zu>nQ-u@aMRW-Y%3=alzAvyd^sA__Q))v6>PYI6j5T#)d?Nu$--Tb2cA>`Z|4#4jIB zC64i0_@(D!i&r!(4dw8b2`lWs^uN=WBgoIu+HaxpsAbgc8q%y0Wvb>xHK8qgxZtuJQviN#q+@q+4(A^)yY%WGov?VIZs@tRW|fCkRI7JY4?85@ex(uX8?+S9RuK}Mddu2IeoCiQ z$lHIRZS?HEyQK*0xy=>4Ka0IVZWWEWH90W->8S;-HprVgskTd1mWRmEZujy4U9dlP z5kutHvYGjpSJ!OBsOy7U&9Uqy|yx`ACW$*ehG_{rB&B zIqX=M99?YdnN2d?0sQAG0Jk~+%^Jn)O4Fco+xm@FrFA61Z^nr@g~cT4*h8Wf-mJ%l zfz`zz(V;*KlZxni6W+)dSi0iOi_t1Qh6j}05Lq3wNhI3Q+ForHSNZ4xke5RtAq?0v zQ_Hj;g3}Wqo79=5zBLU#u;sJp9DvY>-TuyVBOXtniO+v1CI}<3nmuJ?Oio^?ZGvBZhkRG@L+n9cVdSj zqvm=c_&=b?hSt`HZ z%-rUtP5P-2ePYgkWv)CQ+57#XyXGSVz&F!U2?c}MBc?=TFh|RmV#|IG@w`HCJ?SP{ zI&cP1M!dJIt!3(mC8Q``gUm_BM2uzSt4LL|#R*^96KfNNiEYw=?w_8LKNHDbfx;kD znyv5{RqCM^#CLR+iwVhJh}4huCS_W9y)|S?_-y6?q#mG`SNz+izkl(@ek0tSMCcO} zN%&maI(pXz(X>}L>>Aq#!M<^GadMq9+rzFT2y|!RW5c)@cVIgg69M{Hw6Ef=y6Mm5 zoubsct%-seEZG&BqTOZ-(t5_^=v%jNv6_v~mf}2FQqKy={Jz01A^;k7L{jkdZpTN5 zGS0YNiqwP3O_XJ*4;zV9vz$Iq?0&#OKctE2!J=;F5pj~KwZuXu({0}1Xkagl{hmwF zG`4z4g5&ybb2G3*Cw8vUN?0qRiK1)9uk&8c98p*3@$?(7zRx|XcSm+w+i@g{p{dCa!#xYVG_-?+Hv^owiB?m^DmyixjoPQ={G)7 z!P|;7Kt6>!k*>2ApX(p1bX&IuZCTpcIJ{~R+=5DXMZP%UHV3m~7ygsEu}0S{qxz6U zyIK<^hH$f>lT4;&(Wp`m>|Gsox+p@~HnQ7==r8=PZ5^H^gNE%_DUN=p?ZiUy(86H= zgA*7Z0>AWBIYDDU(Xu%ZK9KMLp0Ce0<>wu_g+6==y0|i0{_CvHYvaW&MUovIg-)uyf-O5~Xv@+Xcw^0Q}Ffj z1CsrcaFb&(DfE5xmTdN+T@ag0pkefkT=&(wz0{0c;COt^#@O`=|EPwoMlhQT$LIz5wlY?2N0|>-T_re{;KeLa@w_b3Ixp zVm2yFI@O`j1^-Sxl_N5^;xoANo605kqnpESi+#+@5NQkEHLJC5P!XbTKhj=rx{gW_ zD}wOPKJbvulKRL2{4<^y%xvx4g!d+eIgU{Sb#E-fI+TI`D?_rDc=#v_23AZ^4{*DQ z1G9E~oh~khG<;Jx$H*oh^CHnU{V@-*PMNfrfZUim$7!_HIr z+ywq~ftg#7BM+=R)XfIosyidLx7u=0TFy18Se!w5Kb*cjI*H|v%wC9!sEQvY5yaLz zw4*!piHZaoYjLcj&Eeq(ZGTVfl!}6`M0AM^PF((>_E*(LHhOY?5nNei8M z$Q?n4P|w814&g?XPyse9hY=?DAKjiZ@Ns#MwOBtwckUlnOevOK;g#cd!ObS!?~;p}vrCpHki72@o9xVE5GcSn$=K^WsE09}w7@1PC%mhRF_nI7Jkrzn z7HqvdWl?1S@1Ojv4B0hIp3`d7J0{V2{)>FWnjP~kkxg5fi&9=mNO@Qmw!%Yw=Qy#j zxaCwY)@Pisf8ZB4ciFAYcz#>h~|IaaMmB2wTDj@^IzrnTrToct~h)5Dos4?GA-#GG>3Ax^I$Yl_X^ zF$^lPKq{Dtr7+P5j1yrUKNpumvB|yuSS2XDgx6HQA88;C03D0<>e=E!gB^ z($J|%B1tS&r&%)aR>V%C{Xx}26?!|wA-`U=$ELVb0bMw}Xo=}RW(_)Dk1}y~t1FNN zQbQFaDnhsY-HgLz20M*OIEPyfs0Vc^lVvzGci1BYSm57`!6q~n;U-`aB{ zT%@hd&xGnC^!@g@I-7=x5~1Tn>-Y=m4r#c>z6n$ zP=h*?t1#|5#Mic>I+Iqe31AbTqdRjIG!NPI=E`_=+Ia<{ zGlgdFdStY`G_UXmxYFvo|@DUm2{a>gA-wIDK5S7Ja%R1$h)emu|x+AHL+ z(H(wB1CwF#7%OP&vo-#gcZhZ{5PfC^t9hA-)d!pN|2;lou8y4goU5kT4MK;AbW6E0 z)th==N^#zT@XdO@W#v9I1{N1Le+-j1B>iirnESST)xbuZE(W47n+`5R2vf{+oopSp zHL9U}-wsG-reS6qDbEvzT^bi{U(XTQm{zm;@smcL2d6FPGuz161$4t%qmjk#1y2cXATVR+btag@a)vCam z81s#S)thHGvQ>{ru0I%}qLUdTO2{?r*uJ(bt~}6V1G)U?rJY_ok?Jo{>}{LDj9(n1 zrZ?Pp7A%PBT5kb5VxFv-4!yJzQN*?cKNw5I$SxGh1hlb)HSB(4)IQy127IYW~}+ z7fr=`xU2yY+jPsg;(N9x5@9-gT-{c3SNbxa+w+qMk%eNha5vFB6wkPsMh3cSp+Jde zd6PcRk*8?F>1J?|#cqU5OC8M?5lvQnwo^n^_Ch#-AUFIzF__8HCK$eh#8j+E01;Mp zPB2Wi+(p9}L{`uWDU`FbPJ0WM`;$f?@hNXDUH0s_eN*=SlRhi&=h=*J%WE4}Zhn|7 z!=``UM83Ht6i`o*N;Zr$)YX}=W;CB&NB2BebuUiU=9_wUGztUpKWS@|aGPQmeKP(6 z{#K{3f@Yx~jQZvael%-C&%H=%wXf*MCXa+10xy9fj|Bfv;pXAM^156}pfhJ&&;gHO zA}1@oQVm%rNkV|*poKeCwIvnRj&bu8o* zD96!U6H)yxxGw4xQG1mC4(rdI>&?Y=4IzqpHS3dPTjnxg!Sr_Ot&Cv9X#93>L;BFj z>r;~Z1N=?h?ti)mamXOU@)}Sh8>Xe%NVj-xyVS%_;|&xi(C#bdUK?%lBW{(mlr*oizIf)_=eZ?8dUo8_&+S16vdpiZVW_sNf*`fZQ zbo%0(O|^*3jPY8POvg$^n~DRA8g-Qm9Oz&*IBzI&ehk~kHR4iGgeYX}KknZmX_up5 zeeqwB^wBUx;}a$kFeZ+aVFXLi;1buM=v`FtAY2M02=o+2mG27Hz(08?k^y#K{ue7}IfA4=GI~_zzQzo_5nTvYx@F?et zYAZ7{{{dA|(Ikq*S?w5+Z&PUE^C~tBxaB0eki`>1uLx6SC0c=xUD~n{)Uz7?KZ0=RKXFdA5nG+bg1AoDbypCSp9DKvF;y|96Kl4$2RMS{w#CRf}f{+ zsUm8r|5mvhQf;Z+EV`9ja^_QUvA>v30bP4Jut(WzzQhYL$fIL=$CxSa6!RlDpt|+k zV@w&Q)mn6`o2Pq!(ril|Uw9zYT0mAO0$g~>`4#qLU!Z@MAEvW5$fp#*Gx%J+(i)93 zAu!>@jqdM#9hEu9z-o8{(RooHdUWOd+KlZ%yZ2jzao_9yDb>)uwN)_)oewj|-siSWY{@zFVlUv0&{( zXGhdUk4#ISP)X~57ww1t2y;HdTX)bnpxtXKPOsR+x>bwF!I4DCQIO92habmW6W&xu z6}gmKYGuWhz+zl9l?gPszxW9GkzoG`ApygR`QCjOvu=P#8@sqr=D>N2j{X<{D#B1U zH-_PyO5>HS%;s8$7D)}uGHGC2jeAQnePoxS47R4Z8S8Ld;Az~Pt>RFu5b~BO?U#!? z$xM5Zgx)7iasjU2qm_}h93%v=SPMHAvn91i?)q-H+mH9KTfP>#UfSO~)6`Y+c5P^G z9zP*rf4N`3>_+mdH0Wb$ib}jsx7vA4T9zHA>zrN6`X-;`I*zpSO?{MPuhY#t?oMQ` zqaNNfodpT~){-qHeP^b5PE47&&h7+d2t*f9*D=yB5ChJ9DH13|8*uRr6)x~)vFoR? z`5H?zS&@PGtbw}Ls4*mzXy?6r(( zyodDz>hz9|xvz%E479tN zjfO8*U&-{z7xOK^yn{b9^S#I-HJm+(a=Rq^TfS6o9nBs1c6NHbfruQtMsJ?bKRwd} zI3=rL`(MQxOBvA20fD!F3mvqBtGvYLw&# zea{LXEEAMVs`ZPhpR5xwf`e{M!a_fi?!WxacP{jQ>cJ|@C}kXp`dW+O>inS#P9 zVyrLCj4y6gKxf*ivRPNFdHk^{I1Uf@d9gJQEmVnt)*rrjVO)fJ3o@V#&cpa=n+*HY zA76l0$oT{xxE4LoKdxFsnHl44T$PR`*@BdC(b7egR)r~xSca{O%Vn5I>1-s799yVh zz5XeA?XD@d?G9pkF8T8`e~B?8p%{Blv2=xR$$#UVS$6n6dcCiCxd2`Y)rx={{yn`> ztkPMen+WKvC6j%eU%JyfKr=t6i1?UubKo-4+3}+w+^Jnm*ukK(UPOKI71Ic@+_2Zk zo<vQ@_@-$W<@ ze2<^l#T?;8sC*JZb9($T&T~;YkMdL6$0;3fQV1&SuUUz&1=ReOc;>>cqUXBi_$-UH z>(_hpGW*7--{zS9*c!Z;x+b=MT$U!sT;PRq8ARJlkhCFPf%VM^%0nx`z>ywWKG-gB z7e9YmN^Y45=p(P$uz1?!&$Foah7CG1c&$H>9HE*XRD38MI_`|sOg{fLfa)VIVt+#4 zj^QP@?IqiBTJfbmf~DEkMfk2K-e@g56Jz6$c&#R~?x#>(^H2u*|U+rT$)d4g|q1 zYKmd%?y>@=sWPNBK3_^hkL=m}$Q28?2d#oG+oR)mwGPnPbw8!&Lv)~#%#Sr^)leiO zivUo4>ATH^AJDHB$58?LP)SXK7;&{Owrf6{g>CT3hMIN z)#Ks%v;JB6D=zhJQ>n$t&;Sik*g4rx;>`d8GF))n)Lb%v98W2gr$OR8y|gH=RU_p> zcZ!a(jQbDHiYy-0{0&F=_U6lG$8z#qKy(i`YjC&Ddu8u z!223dr;ptvDdneVlMI@VK4-ugi85oD&&Yo=E(>M+1zW}s{7G33G@~^>$<*7eSUbDQ z1-cb~AF!FwMBO#6B=;PDNE*oP%81$ZmW-*SaltK?T7=pJSNziYb2aSWZEtB;v?!Q) z_-QVkYF1cnX;+4t+<&YSD@8ndUnBYtuYz4D72JX@XnLLxoqvIn1S_n!gx4-HgVm8W zjoY-a1vP04##?0BR9`kQyS=lz1N#D>n%bI_vJEAoqL{g{zW{!t={&RaeB+3G=hS&2 zQtPA1ZE#fXdq)LU)l_5@J?t}dVrELvb$(XoX4U#d_)+;npR?ro$arZqmB{;*j^^Y& zF0BKj!A%}sBD;EZ`6ZcuH|ic=WA!aDbrFX3on&iN{>jcscF%R%^cKQ_>LT6lTeUhL z;r1G6BmpDSt<}y;c*I#KYA8le8sOr^5!^G$E}dy!T5_R-6&kL?@RAZkuY%s;altl? z@Het{(QpxAiYVfIT*q#jle;%L?<%6OcWD{^I$%`O!9^8)+n7_)QgmN%KWwi~gs9bF zvrf-d$6|uthj0r04I+-jovMw2zLv`+bY|s=>8;Vkc(Q$r;YgZ3!3+0d7oSB z*#f|9XBeJ-mWMatqnwPUc-KOs1 z_&E2ImD3b~7hWs%9P7_%=$Yo|NruMkKKlyw1xj(xJkcsSK!F#bBg#e8nbUzx zA0W@6P~8XOfrsx4v9#o}w9j2jf&r#v#oqOYGeS{D7NG^xk0X=G);r=B85Ysg43Z4b z8*>*bEgo2RKU48fDGr;mroB_o_v##WHilAqAt6jq%&SCJ0L-RE+ix|MfN>b@D znCeVs5IrJ%hI~Jmk0tZf9dPz7W!gOytvstisQmT=4>586W&lVXp)}JxLW8UWj3y@MqmjRxvlT zhTo_d!Pc~sTR-n9gDt*33&c2|W$!h);!pj{e+?L!XU=}4ymibtUt0s4{cZ)AxwxDS z5Ep=7X_4$ZKRje zyAvDlVC#kjg)$^!$V46_tavBnX<+YRGbR*_W;`UYr)8WKy=T}K&oxX7RL~=mCa3Kw z$tqekYaIa6qD%iG5SI`PcT<}-9`pbI;s5?$vao;Y`3q|3Z`f1^TV=p2=NU;&N$Y*R IqUG2B1EO<>WdHyG literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/body_5.png b/demo/tests/data/battlelord/body_5.png new file mode 100644 index 0000000000000000000000000000000000000000..6509e4ff7136481ae87784598c699ae3713a48ab GIT binary patch literal 13518 zcmbVzQ*{r{I?p})%kLBoIF0{XX%q!`%O|6*=eN#b|Q4|^#s zConL0^#5gWu=Grv??xDBpqx0&78E)P3m&lPLjnwp1Pmx9tm?jY(d8FLV3vOTGFG~L zx_r3IalJHX{@ZfDk%fb&T`ctkO({%dA-rG1%u;Sv17~+0cecc4kOaEU4390X@4o$M zBGV2f+F~LTH%fuM7*);?P9;rSxpR> zs#mRF+hn`!UfoJ=?~YrTo`~|!IrhoE2Av~v_oK$x2a^-*!b<-CRlmAxTWjqbVS8*_ zJx}jyWN(rS4nL7YU)tKnU!*Snz4C`hjiTkawun}2ekT7Kh=+Lh5)pu-1Ix1qD-7ua z^z6O)no!zf&gwoiE+ubRUz-U$b^!HkuP?lBE4ru1p`N`&FrYEP%zi=LWHQi-oJG{A zQNnsN!Ja46AkYa5{Ec%}q5zV4I(YRL*R?DGzwU$Oz8nME(Tk4t=rzJJpPIUUP$uH9o zt>@Nf5kKNFDn!}iLYyeAeOY(;D_|70IX!<+6aU+w>ZPK;t!Gu@{Xn}!XKUuR+geQX z?~YZpa6HwoyZl^yJHyD%xrt~P{yGQ+h&%pKnZIRvdZlt0!}8X{WvM1FVpYSz333Xs zETl!5uz|UFA@RD}+Ma8?e94aq+hP0esG3wvJ+3Qt*?6O<(u3g}s|v97OC;^`A0b&u%J0ogCYxBR zKT6)WA^C&Ym#{+mKlrS&w49^-nQSp^{d`JB*5qT=aiWq*WB`>==geW!q-pN!N>JJD zunKnY*{oAzw%Yu4toj+uQyx_da7LGq%)2uCN*A&V_z%>a&72kZ=jRGd9a$ytiGqmy zMZqc3Wz>z^7{e<+02{$Bzx(68v=~E`H5JZTVCIL_E7dTq#3*4uBCg-elQsOm1r30? z`X^m<5`@{|r>1*CKSn6l?woF8PogLjkT$jgzO>LokTlp`TKZO}4WmIM;)`DOJqASt zOz4ra_{b^|>&T81?ky3KCIF_8d2+OYAX5|¨IEA`Ev;%O8*XL~)bk$j?J9&at4J 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 W52!zb{l0%5fdR$k#i~UN0{;(bqnqmh literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/body_6.png b/demo/tests/data/battlelord/body_6.png new file mode 100644 index 0000000000000000000000000000000000000000..36fbd5fe8b987fea0e0e0ccc8cf1b2a2fe8661ea GIT binary patch literal 10357 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 CpKFc) literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/head_1.png b/demo/tests/data/battlelord/head_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9d96d53b54e86e45ec6b6e9bdf4b7e8bbe43db0e GIT binary patch literal 4480 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/head_3.png b/demo/tests/data/battlelord/head_3.png new file mode 100644 index 0000000000000000000000000000000000000000..d7b35d6bdae76da1d83ba0e8e90ec3d6a0c856fd GIT binary patch literal 5291 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/head_4.png b/demo/tests/data/battlelord/head_4.png new file mode 100644 index 0000000000000000000000000000000000000000..856903c331f22340ddb0db92838e791d6f76d020 GIT binary patch literal 4732 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/head_5.png b/demo/tests/data/battlelord/head_5.png new file mode 100644 index 0000000000000000000000000000000000000000..c583bc9a35a6ccb18b010234ebc7ccafb2eea978 GIT binary patch literal 5518 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 v^qtUdq&LRxhwo*#B&65R@R$>1K`ksyX literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/head_6.png b/demo/tests/data/battlelord/head_6.png new file mode 100644 index 0000000000000000000000000000000000000000..8b218c42cc3a00010eb03c8d1bcf3b97b614b5c7 GIT binary patch literal 3205 zcmcJS`!~~%AIIOW6El}eNSor5JCk7|x8xGdwcH|?k6h-mnNi4Ps0itzT;@*nK@vi! z&9X$6#6rw{D{_muk8hvz{o(r;e9w73p3mob{QlP!OP3e?>1xN|KTzfIGHT^UwNC#{JxmB)XAHVZc-K`9Gr_B zE%fXT&xf%UaPL*e9aGj>+sUZU|?%jcFJ~LBRN_0npKo3*NV27aUQ|K`j z`wI`_11Z;CGZn!~JT`=iuC9w1NC@XC^!P;#O$WtCQrL{4@Z>k5-$GPFEDvw7LD5 ztI*6|(gXuJeIxfDceq<-zeib{ga}2;{CHr6lM`UnmhfBf?5Vxye4} zPMo#8a}FGH!t$u`#Z=jJyIHApP0I$ElG!Xm2^`W|uYgauqa|(d4@K`DH#Y$%n4loc zno;_0ibj@k(Y$Jsj>tUM0p#-%%|d0)y7G5Py-DKYem+^i1xT{`tz_O??Ye=IA5xHa zO8W&&K{UP^TuxYXFRED|pU3SrtwD7asugyUEP+c9HOo^jc%O3!c{%tQu8L6C(81os zL-9%&zowMl>a`iwQ+%P(_tA99S(3MbO)&3_?8jF!1e{`psN&@^@CvUOQBEZs9!AbF zYl9lYZ+kxbKp|O9J;P15CT4M;SHJ|`gwSq+3xF-83qAj&sZ#$Z1kyJkS)6)y_BO?h zvwd(j15e7eQV0C~<^I-}s!>_}L{?{h{yZ&3Tk%0Ay>r<){0p4~t85D}iic34#fY{5 zjn}IM%N^h%hDo4W+O2!`hg9R66G!}MahfprZ_L~G43pHY6iF>Dt(<}azKIk2efnMd z6At`a2XQ;LPl5|@-2=S#HL~Ri)8c0YWFMP(N4H?vr=s&uT>TF9LUWXzj+pxExd{nP z5`F!+S|V;8egn_B=E3Vfv&M8ytNx}_+(KFTTi!dZTv@i-Toq=OxjRmVZ}lzzl|p0^ zU`H?5+XJz}HJs9f>SpP?(!$6P47*4BllHQvAB>%H<$bC$?&8JF^^{#F~;u!Xjm=a`ReO~Ix1m4HU+Rha%~ z!$$Q9-Nx@sp1yU0S!4b0%G4=I}L*zAnC+%?OcdVM43+a0CyVY9QW6 z3gK5cHTGszqEYj%7u@I@iG=BvHK(_xpd6g|octm-+{gXoLidtzI#XBoWQ>Dq_jyU@ zS--F)YJLfI)7K~-tEE#ipefUpt^;&fwe2B31T1b239QTz87jusa zMVm~d=lkE&2Bl1HMtcjlud4c6Y{=NTh}YGF<=GC?-=0Wab9LMDKTT+#`f50HrZ=2Z zQoqzNHuDmC_jh!2PL3G@1dVJ5Eqk%UY4 zj-=%6zCH*;6ff`I{3V!QF+J(f=+P*SAY_icpxe{cwe1`7X)3m@K%H;j+53n*b-2jo z(bD=rJ5Zd#e)jYy4;d@ZmtUncqxEQPC8NcDF?YOo;(&4L#omzk;I`k7D4mtB?BhB1 zj@|rGq}WV`?UEN&iWn9T`?(Q9^xb_q0_<)sk;|j9B=`?r?d#+-(T-R~naL3-=g`+@l@OuA9`?Pv>iHOT` zFy`kXYI+f8divB7dL76of>=<=1;cDYzR**3BL@@so8LPr=YXiMo%=SJy;8BNn37o$ zX?sjLx9ba!?|I!_rK#YA6v?5;Gy6-r8tPC5)Ri!Xi+`UTREQen00*juvd!AYWj66d z$`QU~nL3Gi(=K6@W2acXB`8 z<9HhBNi&~~q3)%6o-Vu#xKx1xefAoi$c~c(;5F{_-Wb5#)RN^fRj|1&t7|Ki*&y-j z7hI*V5KVV|$aKV>BS!Bvu6;o75y`EqjD$z;RDchGPhj*JI>$i8Fp&BMB|4pSBXp^R z7H%}m*q{zm+`lKC2Q2V^osPRtGUFvhx(#v_k5nCG9ivpH)4l^F$^8ti&?H$5hMDef z1E*c*ZkY%%BR9~8!$feDGCNIL*JB)n3Mg-}Q>A@_bIZ5uy?((lT|6H0MOd-eyz3*C zg0Z&#+ezNdG2r5$Mt47=uyxptn+-*OPE5h8&V3gAo7(uC>-;Wj5MB-3*LyS^tsb-#%F9j4C}yi28wdqf6ThZ zAtcK|?@7uxP)g_eu!OHNZM!a?F~&@^ulm z&Nd1WiM-Rw;JesI2++v8MYFk7&yiAE(m2>20mFp2SueArtF ze*N^d*q7rfrX#wUbx`I7``6#-wu`+dZU5$%%rG#Q6G4YGRYz5Obh!T>$o7fe*{ZO7 z(tusNk!K4lDqyHxi>-I%%uO7i^)?5tvd2D+{MN@hp{%EpMpzbpKOq+S+hwo_kjU+> z5!*hRe$mR0xmZM3WaQ=pzYD9qeTyiE+2sy>aaP<2=jXV{5~HCgVql!p!NDyNXFurb zzDBY0O)5k0IWn%*api>5P}UW1@w@X){u*^rg>w$KVqR!(BGxw2ac{%ZVOC67pf40& zvQevEqsf#FMOXl_brUKL?MSx9omXEYO}x=fJ-Z7PPC<{?qvx7JvBNOrLEC;HDkq$Ia6(-`1PF j6EgeX!~B0tTq_gZrg~KCXQkLb6#}rjfHHew>P7euERzMQ literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/lfoot_1.png b/demo/tests/data/battlelord/lfoot_1.png new file mode 100644 index 0000000000000000000000000000000000000000..45bf66d679800b363a6aced6bfa1c74c97367aa1 GIT binary patch literal 942 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9;-0Frh3bsv(5|*%)Xv3jv*Dd-rii;_c%=C*hl@#+B z_tJ6iE8185rdpX1Xf2h&hfh8~IPLboUbbh#m)6z~Pw(#f{dvxHzCVAShadfLcZ<%y zNhKHgUS@mV_dER~+4@Jc=Y0dlxQ(lK{csNRuv=mB`;^ap|I<$MHvf7uX~})Dw=E2N zg6z*ck2apXTf5py_PAJTTGpPc>*t#ZGkuU!KM=Y%R?pgVl4qBh-1}H9?#pXtW}VpU z)c0#kj4#Il?V{q^y|(ZEBm~}^+;r4XAg#+#>+9Tt>zZ==In!-5#hzMl22HZj zoHq4d{SO002K^heXWuk?vO?hW#toA$UC`crx>)YBK$A^6tM-(u+HH>tU#@U`KmG3J z>)o{t#*z6}zRjAeuRd5O(bOf7@-3p`cIe?^{c_LB8?yXTWr~SRd(LeAzs+Rw+j&1u z|LvYz_F?jOSDvniTg-#ceVSvsWKFxTJiX=R<& zU!P)lDmWFSR&d z9A^Ea!uvz-t}OwdjwVWGrfs@8C-lJcFW=5uoB9@OoXXl8+FBsPq^qMRW5e>+u~=_!ylKft@>2{Px^sZbf)34 R&*woY-qY33Wt~$(69D?mr49f9 literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/lfoot_2.png b/demo/tests/data/battlelord/lfoot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..61c88dc1b837d2b7b40241021addf74d094f5d41 GIT binary patch literal 925 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9;-0Fh|)Z}!XgF+W*biz$B>F!Z*Q#bQ!$rldzi1{{j;&L(J?)=i_0X#AmKm* zBQH}C=g#GKoYpB=h;K-6Y-VL@$FvxT~T*;OpxdQ zgJs@8>!=O>Y;P^MU;F#TzN7iOm2B2eVyK@{ym(3ArRk4r#P@h*+uQm4G#7dx%e`^F z^KH*d@sswI96WtzpW>Bkb~(qs9FDG?t!$(J`uglVzkQQ6S6%z2I92WW+%vON9M`F2 z`s6Uazk2uW+dZ{+UIo0HB&)UG>}%}u2fpX_*xkP$Kat`6ne(r|u8ErBHF@W^D`jW3 zuddJ&nYpUy?)m+$LK7JDWB#rc`zi3%g2yZK{;RWdmMoC?_WD{#y0Z);c-qEZ}Md;R2@knE{5GndY-yU(*;NSd!vf6066sX5R@)rn`H zwm){ZeAU(riR0Q<2g)<<9=H7Q_vE=JDd$dFe_!7)|9q_7>04KSY1uaLedwu+)O!}Z zb+(??ee2~RtBZE7DJ%9n_-SOT(bBEK3;HiF-&kx^ zeT%OsbJf~R!8am59*Y&m2=58jd+R!>k>$s!?0diRYNejvU0{~y|M+FaLHm%>5AD?KV-G6S6hV>85-}-0bd&{@EMsHTp-W8YbKK#Cn`*YULp!=o2UoTu@zddlH z->IdU9+A)HWMxYQS>|y21x~80|9Eft**3lp*SyxAvdo^NmfP;`d-==$@a>P9-pRk~ zzwWYhPHI|}PuaJ)%N5&7Jtj}9wJ(n?uX=C!m)Ep8@Zk4ieM3+}_jL7hS?83{1OVwq BpXvYr literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/lfoot_3.png b/demo/tests/data/battlelord/lfoot_3.png new file mode 100644 index 0000000000000000000000000000000000000000..731c14952402abfa29ea9c07b62966a26bd512b2 GIT binary patch literal 932 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9;-0F7H6^hWPb(*W@k?q$B>F!Z*Q#6f8r)_>|^@sz~4=b%2y9`iAhN4a73)+ zX5y3K;Lvz8|3dwe|LzAH4;^Y~YG`O^VrFDy<>t9_>cD}71JRjFbPLMNZ#(DepN;+U z*Wf?H?kaivQom2(~?1i0w7_rp;owPskpv1g**~67(e_v`%QVE{0WW9>%#V=s;w^FT3xZ@x`l67zjwo#DSI`d0xqw4l6v89?S2J@^%st&Z8jF&+0>O@$+;;& zE) z{`Jzszv?aKxm9v@T}(-vl-~Mc*UrDWjtp_0U(?GgIk{A`i>CiHWXTIO4AYVlbq?~G z>a%V_%=PR1+)N)Nt1pLGb33L@+P%f6tmc!q<<9a`uKz0X&ggB|(7$BBbKXwgj(L9J z2eGC-B1?u%A`D`|TJZ<`cXzj(IzPy2p`Q%@a5JegydK}p@y)z4*}Q$iB} Dcj1np literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/lfoot_4.png b/demo/tests/data/battlelord/lfoot_4.png new file mode 100644 index 0000000000000000000000000000000000000000..010f01c778d37a13c3b9c618f41c1369c392c605 GIT binary patch literal 999 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9;-0FmWEPuqw0-|`$8_65JbTIKiK?`Bhs zW>MLjf0;p|+D9c+J-6R}+r&_lelO2#b5YQ#$ek8bZ8VqG@Hz5)zg@5Ax4Ue+0>k|d zdGqO?iz*d8R~=jXZ%>`gvHN*u#j}om{=V(Ks%L4>s#k8OJa2Ea_2rz|wP{Y1r@8#T zetDkxqx*Zj` zQZ~12_u4s?GjIM~c(FS6{+*huQXj=Ww6-k_znxlXe6@7(u63qUxc{o1T`3Y;dF6uY z)1W0LC(mf^TwvJOWw`3C)zdjwb}ad8vC4arvHEkLqf%?bU;lhKt>EkH^PBhYxpb=Z z*8A_j9KyPg?M@9UOzSa zS?dD+Ojpu&~53X)Vo`QVpqSlQaj-Ny8Z8>vebJ|7wzgQ z`t9GHbS`toq($~U-)FF^hIW-I=P$E~$@XgB`e1I+#G+}_riR<(an{u;evW%=kyX7t z^!C;{jB&Glh0}}u__uxBtSMUhc*)ad?)_RfHr{?;U(D65a`mA059j`<^y zJ2A?DG47*@#Ih2-1v4k>cvSvUVc}<1;_f=tuXgyjVrADM;fC~pO7s4mC!Rd< literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/lfoot_5.png b/demo/tests/data/battlelord/lfoot_5.png new file mode 100644 index 0000000000000000000000000000000000000000..0259745b1acc3e10f30418d3b1567c5b8d4fad0d GIT binary patch literal 1058 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/lleg_2.png b/demo/tests/data/battlelord/lleg_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9aae410a2670dded809b9f6d02b536725c70c3fa GIT binary patch literal 1614 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 OfP<}z%?r$hgnt1pWy~@F literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/lleg_4.png b/demo/tests/data/battlelord/lleg_4.png new file mode 100644 index 0000000000000000000000000000000000000000..b590fb903567ae6da6bba0c05828b66fbd2e984e GIT binary patch literal 1242 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9;-0FBE!r4PYMhSER~)vjv*Dd-rn5bFYPMA{^9+)`>o~W#Rlc(Cvzw5J<`g$ zJfZ7=DCZoP2^tHRFIli)`J?>{7c6)#&k@AcCG6GOQ}FPRN0^C6w~5o?mx94Rt{JMI zx}kRM`{jsRSzF(q{cXtBL2YpD?HcK>{_4=5^%c{b9!AUsG8c9+IV|_wCK{~AZn(5` z-(&-w)trBxCcb{sqsw4@@8rBLYnA|}ADIG^H!|hSSa;pYm5X8SgA(ooW(~Fs?F@Ox zro2{rZmlJh^?qNSQP=+Uzhu4JGA-@w-->A|F^C+9^Z9Aju-ouyHN(AbP5U!x@+(d- zi&jQd)=t(`o2ESiE!-~x}=N3+W$FyUulKa7z`^q=XKC3r_VRo|h zOxe&l=7zP=-7f_1{{Lnu2>Z^HVnmxpq1FsA?ZbD>&>~Wp45Io7VNviP6s&SI8caW++QG z;^kvnz`Wo@nyXLSsgos>)+8|Pc@**_ZU49T))SK%LeEs%&wk6MzJ6s#%H~bq)&)#l zbh2`qA=i;T({v|re%N$1?mlCI{Y=@Ibv3U-RcBAVxh5iK_udDL42G#k_RRaOu&z-* z(&#o@!5bI8%{TJ`_Fh{Z^ZZk^IDNsj1xVm$?)K$hL}$SZ=ui~6N{q;W*(9&_MY>v{(al-eJG#rrmZRr z(FZ1(Oy3*p8c^+OHk-Zv zNSt90r~h%^gIpiDq)m4Q2(qYmoP4%?AMd|MFY~V-{1zE-bn)iRn!*o4^O-HrH}AFh zqZ`(|`gKC_&o$BIAD@c%Pn*Y*!{{AmIdd5gi@EmC@aGK=QsyxnzHw$7bK#2S_Rox# z>3=Hf_HD8FsFZPXk5-kVVV=+?$*lJVd6)K>#+Y`jWDruD%-Mdxx9}QoFvI^{>v;Ib(`Gg zdwI-n|LxaX!=P=F_vsIl#%x6k*QcUdM)QRu7|mvU?z&~2VjL3p@D{hC>6(}K6Vwi@ zvaztW&*%z*LS*=LM_{DBOMcYON(NNj`B-^u^lGmZXet^OZ!M#0LudShll zE0-b*L&U44=j&e@n5-^bU;WzrX5s$0-Ou`#Y}x*4zPQHHBYj$Yape_x;y~2T&$nv# z`A3`Of%ad>{J%t|$IX^u{#C`AkgIpMPrUs7dGo>Z40SK(f0?iGrvLbJ|K&anXXmk> zntabwy(NI<{eL;0_VfFHzPqitpGOcC?B)5-5HoA}vXg>7a=>zl!PC{xWt~$(69B9K BC&~Z- literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/lleg_5.png b/demo/tests/data/battlelord/lleg_5.png new file mode 100644 index 0000000000000000000000000000000000000000..39f9cde15a32444bcb8f2aa90b9d81dda76ae41a GIT binary patch literal 1542 zcmcJP`8yPN9LK*iW6ZekVvMU@n=?m}TNpViW`*2zV2NQ?uB67eipp-aj+iw$Ryi^z zXCua%S+((G7S)(xM8cF2mSG$0^vnJS`+A=D`~5th=lMME-`+Q{J|1$?C}{wIoR=rY zPn?9WLQ0B#(CO?;aY!Y52B!cZqw-Y{aKB1jd_-LGI^~X-hN~#(?bD)p-~oWwdtqGs zGbWcg50b*zYLcHu$xjDrs7onZec&NMaabqnX7anELCUi3FIrx4ZRGiiQhV(vL zA@_?FQ2HNW?G^DH*{x~JTfez9xnE6UhVD)Aou(d9YwipL_F4AF#H=ybYr7w==(I`j z5?4=jvbg-Vi5ejIBjN6jwdkJK42qNFw(*Jlhw_zi{6r*#xJiX19KjsG0zUSu@ z$>^{to#O~!4EY+RYWP+{^n*7lGf~m`S+wqz9VTU`zSX9&;3%KX#CKDn>eVj5MG7ejMF@3P@ixZoQOxY zdmFZ*GZy%yrLDI|=Fo+!w1S2V3aF?q?8g&7)a(dw}Vc|IIzw=<~&XE*q5V{~x zfl~p)I%eVhwbEe)P{}B^O`*li)dw{k_@)y9G4Mr*!F!N+i-lJm7`-7)p%oG<@n**0 zxJ&dn4Xah1wpfT%bN@3=uj8F;a=!O~b3D`6vKdY}lE|U)bB{hr1x-$i2H$DQ_4u=t zLv}LZWLGG$*HL6lVdj@c(?T=^9`aOEKWj)rIlDV3&8OXO!C3cq+cQ$2M4(yiKXcBJ za)3^BrGqew!!)zm{%X^y=lU(Lm5-;jjoYz`eZG$ph+a1-@U{{p84&m<@X{NzEB`Ho zGAWFEKVhWQBa0yJzhL|Ws^n?hD>q%@*x23TH}a(#1brN2K1p!_+#L2kBI`Jrw)SDU zlXM`DFasO5#Hhw-Sm<9js8V56?Mv&qg36faH(({i)UM-Z6i>VQtWxcD^8l+07I{*s zaD8xnQ$cqDi7(cK_Q;6>U1$0O3t974t+S)!a#aS0%5oKin@Z;yWv})`0>!xb14svC zNPOz(ldhDUn#Y07DP{>cGA+Y3IBdQqz z=orJkZ0-sO${E)Vr{+hhlo8)}Zht83vzUY+1BuYXJY ze9Cd>Qu;N|XvdF&cR{1@;BtEvD1 literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/lleg_6.png b/demo/tests/data/battlelord/lleg_6.png new file mode 100644 index 0000000000000000000000000000000000000000..01603da8a289795594782e6c28777bb23ae0bb9f GIT binary patch literal 1926 zcmb`I`#;l*AICqNUBq0bjSU_(-77HcLBm$>p7ndO6A6+fb_0?zsp} z#F-oJ9ZL`mK2~kO(P0&@KTmA7Jn0*W;+z55%eaLE^H3shLa!s0Yw#g-v zh|w+4x2TP1OTWuM3&Q@N#4DKVxo|3!WO7QZ4vOuCGa*MINUWI5`cDAfOB zL7Jtga4F~X08#+Y@7b7$R4hK1?$Ar9L$E%33xv|4fck-pXv(kE>l14P#WMDCF^DOw zBb0;1zLr_=b~5k~^nI3hxfH})6A=9@i-Bwg!U{mMu0ZFg{tKlx;D=&#jOY(=q4C@c zs>qzc01b)OVbc*uZxg0Zxm!U7R z^)p*Lf#w;_rKu7lvfB>IU>veOWKafbroOv5UY~F&-A{*ZKsyWq)&#Ci&y)5RoGN#S ze{427*;Ew;$8*1@hfu1)8^a74Z*dRM+Tv-3^J06fBE9!S{{^rjpj@}HeaB!n9sx%9rBDdR6lu}#T)gNNF~{Mj{fNHDRgHo*i!>K`FlNj|(>r16ebeK`=VVtu ze03S^YLGpRNJ|+<4eb=g+H+{Pt?E)$4KP4ye^p!ms|U+OJDgZb zF+uMJpOyl8yRe0BQ>mg2`T+4L2jOJ8K{G3!arL?fIejHv6pW$o)8qp5uZ z2al=dOH4^Ng-Fh!kbshezCsYQ$0oKQ=g6ODHg69L)TLx$5T)>BUXv9haBeqbi<-M= zb^e> z(@#HVr#L;D8nn}J09x0G$I={(YVYLjf!%6kWRj-Ef%03Mc=KEY%YJA*t3+qWdjF*; zp6s%pLpE((e&W^!(KpVK`=bR~8S1eSU@O~XX`{n2W;rA2UH_#Qb?_D@Hpdn+%0Rdb zzp`LzvGX;nx<)3o5AJ!-_j8MC7e>^|5^8~T4o~Sekhi-M!@{9IbFRtxeS>VR!5sD; z*z}vI;77Yu=%bG=45}q&vK!|d{M-+pzmk~9O1ZxW4=B(525#)p-XNpwIqduab}bu6 zN~3THGAKlau3qVeOrhy5EfQ-Xck`1eI}ox?VJJ~WQt7%sy*%tg-&Yon!?l-joopx6C9QS-?9I;pYoG=VsKljB zaYAk@tZQYx#VK2+vbreYtDid+%DUh0pAVE0DG$K;7S_U$!HCKaEcNI$uH2(%Q$WrvchUB?6^uWOfEL}(d!Z;i~ga@&Y| zTpq4nP#+0U%iHObF|Zx?XjyBI&8qe3Z{_WijIcS)p|FjKPOtEB=;Pgpz#~ulouf1w zJOVH4yg6Wk=iLtLa1ZU(pr8W! e`9Jl;6nf8p?wh*!Z~?CTp@5HP0IB`}{ro?*Ct=?J literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/rarm_1.png b/demo/tests/data/battlelord/rarm_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ebf12feb85c3df75b0a33d31c125f99b707b0859 GIT binary patch literal 3258 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/rarm_2.png b/demo/tests/data/battlelord/rarm_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c8e3739a76d7dd6490138f0219fd6bb13af62ce0 GIT binary patch literal 3107 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 AF8}}l literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/rarm_3.png b/demo/tests/data/battlelord/rarm_3.png new file mode 100644 index 0000000000000000000000000000000000000000..113c118eb51132f1d4078e965686964e91b9aadd GIT binary patch literal 3127 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 EU!7Y2ZvX%Q literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/rarm_4.png b/demo/tests/data/battlelord/rarm_4.png new file mode 100644 index 0000000000000000000000000000000000000000..fdbe970e694fb64f4e05af748695cb40fe8c1be9 GIT binary patch literal 3171 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 Cx?))X literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/rfoot_1.png b/demo/tests/data/battlelord/rfoot_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d68bbb502ab795d1852022c84a84cc23a012d10b GIT binary patch literal 2680 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/rfoot_2.png b/demo/tests/data/battlelord/rfoot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a9111294648c9b86512cfbeacff978337d86a09e GIT binary patch literal 2364 zcmcJR`#;l<9>+h}Y`M#d z0D$%paF%DIKF=3CWhnLSOEa(Mr}}H*)Wi(T@`y5wQNJ4)nY1Lyl$RC?V0oh#PKhEA zDP^xf(kjI01y49_7g_McVOnmPlA5D_s7_S-S|HOJ_9&b24FzkFYAmVOm{)#fo42^( zcfL4Q;o{Wl>~L(g&oJ$g*7g6le(hwU{4(C_PLO^v;@1$x+*+hW5A2yvMz6*KS5nDN zx(uo7I(h%W=%loO)$Qgu_%$?pA+b)B@U^}-OQo#eyuGp@Y?UM8cY_x2<8uq|O5|G; zz<&t1d8_nuQxL#bNC{5y^m)6C>1#v@(>}(64Qa|~TDk$Q&ux&&;{-$EtEl(jky-ef zoo?D`Ca3K>-pw?vKNv&Ju&q01E46f>%8}%Fbfsnp$|4DeSZGhQ`D{BN;Z}<#I#*bJy<3D`KNXD;$sh58u7}o*gsJFOU?vSC^WGxc|G* zn~rkPxf3w6aMhYR4AtfzuUXz&=tw(;kh>SR0wU|EC)G1AxH=EZk|igLethe*0`j<8 z4kVJPd3>hE8N-v5RLD?U9lr93z(Yc&8IeMxhiNp+N7H|Y8bEbxm9^o*qevN;@>bJ~ z&_4r*QPwWHRdr06j)OuEoko@^CwfLn!r3Wm=Z(r0UE}VUT3~h#;`EogS-casTm<_% zZjNKWrx~>?Se;7ObhSdg&R*nP;~C105~KkN8e4d*Bt^zn-H7~>8fOPhoGDV8NM;$- zt)GD>8m4MF#SA2ui6|}Qo?Z4Ph>Y#O{;1pKr+%egG4Cf&g-CX9&{4gudM#>|Hr8-; zRi%@%J^>yW61Y81so4A7xxMeJ??l1mfMEZVHDnC%@Th>zCefiowMCiPg~?W39=D*k z_Ewo_pwmBiR{R@ZV07dJw~Rk-EV4E?(c%6I5xHmTU}vbAiJ9l;0K z&k_VxL4C{qnXdZaMT3g^t&yn@#4Vc)!JG2}-=`H!E6d)r zHbj=HT>fh~NNHQgxtd|_Y3;%;V!40JTbU1#i3+0_nfeS)eRRd|eOSdDg{i%0_(Fw! zYi84R?v9QguvV4U!d?W_K>itSQ?}Z&L_}b}q#TK>xTQ_PwYeqR(AXC6PW8)sq7Zz5 z6RysdXPC`1M&aHISA9yNv`MqprFqAXt-*!V3i;;P%fP@B|5v$nUhGBonY@g`@)ZL6 zBPcUVg=h7k?8t|iq2N=~L=m$7fc5bBCljD;E-qC%bHgSLmt8seWr<HBx+4&1H(;1Kvi8nhV$<1m`T@o`Fo9YOOi|1%=5W4U zqJ7cyh4JG_Y;4%b(b}qwovh{tvXJhqYSdk18PeAoRz3F8cUh(Fi(gawf#5M&{xi)g z&XWbCqfi}V-ShOz5&6}W=6d{`iO2ew$ZoqyUV4qii?1#6#U=2q?nPgJfp$yDcsB7k zaJyAL9EeSZ$o%p|wWa3j?~w$p_5f(v9ed-go~_nP5>m=ru|y!e-&88NHY{x~+{--AA(u>+2KOGRc30?DQ@l43YPp@@uhdD~}eymORD4=q+lsqtJ~lWr(&V(tWM; z$t!^hFAD)Vw-R;zcALC!d_2E+o$GiiN$@2m66w_CKCt*6mD2~JO_h{*c@0v`!h9_B z-FnpweeWStSK~vdG2P!l0_C#jam!gHvufPO5W3u3D=MyIY5l&c_i(sX1#f1l&J%D} zf3tT#OJmOhB)Mp?Ba8$zCDcJ_cT!Cv+8=`R8vPT0t_6k+=hBw%!jzDzeusyY;>1i{ zC&wQP<$Bcy9qIwInRbX?JA@u;p!`eN%vXFpE~NOk6e(zG@=eORKeszE-js4Src_;i ziQd5E9piekP)gCS)3WHO+6pFain2&{-BJ`3?aeLP9$*aQ`5*6S8heJf%s=9z(`2w| zjTeGtYy{sNZtTt!v*xFAGO~wHe<|gy3diBl8U)Lu7u~D4U9<4 z(or>U%hCh)umO5ZtpjA8_6L07ra)liT923I$h2(5jA^?hJwQ?RmPNli{u~VN{6DP| aw#CbAWL#h%!Orf^0SI^pT-8axr2hiNn{c=Q literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/rfoot_3.png b/demo/tests/data/battlelord/rfoot_3.png new file mode 100644 index 0000000000000000000000000000000000000000..3019e73777ff9123fbb692d78f4be81eeec09775 GIT binary patch literal 2290 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/rhand_4.png b/demo/tests/data/battlelord/rhand_4.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd519f0699014a529d5fd059684b7b670169afc GIT binary patch literal 4049 zcmcIn=Q|sY8cpn&Y3)*)pC~DzTD67RiK6yi)vA%&VsDCCt=ZPBP-<^QtXj2KZHdw1 zXT~12uKV%+0r$f>=Xu@_=Y8JioG)+mb4^t`>O0f`0DumurlfPD!T$vn#SM2Ltov^S ze5{=RLcf`80}i#-}G} zJaEp(!=ih*!$#*5lOm5)?ybSEGtW}nsd!>tJU)hj{y|$YaO`%ySEQ#8&+zzZ&4BpB z zf9)!>GR(4^_P2)NP?yd{#hZ7Cvu;LYBOxSP4RYm%#wRS>2Vv}PTy_dRE2-D~Jwqfa zTxbhVlye^@W_r(NhjHdO{&Fkk-HV}y$W!fd+3D4ECcXW5c2BiuoF=W#v%b2t<;h75 zcM3v@e5e@stk?$&yA!2Cx<;x;msfIa037Vbc6Ip+zS4%8(FqRMcO!Ur#_D>bh)X&+X`kM1#5&n)L^Z#liuNfv6(;|LlV zJJ>%BxlT3J8zoy4p_E`=*vuFSV@OCn!W}+C``GgGqbS?>1u(&_H&-B&mpFGwN)Fg~ zD~HCBOsA^%s;nX zd_HaKDS#Z05R0Nw)Uv<4eZG2p4}~w;D-ZNT>xakzrBHk6b|^(AlnVAiClUI#J793|wkje7a2}+&#nZ7sHsz2R24#i3G{u+sn}bO(sXcJn-h%=N3|K+`Dqv(o`)suU8a@(9D?_79C_g4o+@a7ynCrHTI5#2no)4=$cz`k2DUDL=B|e=Qf-domVrZ1+SQ zV2Vb3AyQAQ@Qk0Xh2I$@j`_5RM$L7&e;~En=yVRyHmw&T&5l2jqr*Z8k)Hb60>Gii zf_;TUJ|bjuG9k#Ntm&&1p+yhMylx*YDqs?ntyH8t=UEk(=!Cr71OxWjO`8EaeG^I} zJU3x~%xIMDJoi0tj=hgel+revphvO(3w?Lx;0<*fqFwALT60z}Iq`h@Q*jqaR7R9-MC(SoZaG~sF%=*rf&Z_iFSUY{p8NSgBqAb zvgU?fe?$*k*g=*?zS=kwgiJc^SX{_M=osUbST2x{4)o_FLZuiezVAh}8lfsX!q$_O zsYDHrf?xWjgGs8Z{G&mo2n>lTb1%^jIWeR*9#b$WV4?AI@={xKIO~9<;VRcc$?u^Uj_6btymgQ z(X@8Bl6s7CmUaJa(^PLuh7h*WQ3_mfacG@?^6wOkTB^q6*MBih62#sEe?{2DF5%jw z34hsXCo@}-C6^qoZgeu(S!f#Jxez^u=mNVydYuYa#nMqptUdG1=kzBrq4w+G+z>F` zm>$;jvq8VrfEcg`y}F0Erxf;w0L1a6t!Q|>->B3By zS=ukY);k?lB(C2#dmMl^KM(mG{IpuTFQZDRb+eWq$ri3f^s$FTezwo z9ZTR)?!G8T;@3jEcNE*0G|d9_>X{$2Hhp7{(o@VX4_{LSwo9K-a0nLB=dcf&C!=MNw0ndxk=fW61$;b7cRT>UO#@3@}OE-cd|-NZ>pSnXR8@OL9p+xCw% zj{xt4kF-U?s*UfeBs(pmdN7GqR3UF{yjNam9bH<&e=zD_8 zcDPFtvcG;FE0c=-(kUG&Lg5J4iOScbW>rwWjLJ3Q|654+zLzNtud=K*_a-lSUJ@5~ z65soBAVpw`jh0^W4yT*TcJ-ENlM@BAk4nKfZ~x={A1`X4{dY4l@jBFKbJpE5dPT=(3gEFjFKeHacQ!%yBAzkmpI;ETkLQP(Vh80f@aT51e z`sW)1nyT`Tl(URk`zj6AZ|xrC{%lQM>C(!@wf^k8{IY#n9T(WD`r&n~iefy4D%+dM zWzwVRw9@pa_KAs5n2KW+I@FRbBA(9%=T)roz9ZGsXWA#hogTaC>h^8IO@=)ZDdx{m z5xqW7#568A7Oab7Pqn_$S6q*&ixYgCgf0;kyvnW#>a2be#HsDYPXeGA@;X7#z{f$E zZA|2Lsjsb-Hu+8DH`T}q`ljV4zLL*s`C?~nUM?^aj~9Z^DAenvu=Wravj6D*S>}q_ zkSp%mvRt@W3py+3-_$K4J62HnKFPx&ZN|S|b3Ts?NP;3~HYX-zv2!r zm~2U{`aSQop}6i<$VFS@u0Ct-sn!#aOf}E@cLHhU&u25lom$$LtOgbW&(w_^*)_Ux zt_K3NDjl^jzz!$Dc;UgSf7_Y7_1)jS-|3n00m;egtlbRFUPM1)U`gJE_49R8q44V{ z9R!a6Kpsq@6pw|GHf+a8tquVmP(r#9U$7p3Z*T6>Gj{o^r-k3Pq8 zb8}nHju{M9@xNOdSd6JWxqjH!FOH2JeopW5S=eI1(zZy|;Lm1bTV{ter&)8ii@#D< z8b7Qee{Ev3+(i@@=jCahlUX;l^mJ0CkRnVvrq}M!2Kz@mSWa$W%L^MmTmj4~WO>j) zHki`yspEZctbsO8U+h~c=A?_Sc-0V?YgeECOXD6<0DiVOxg<|=sN4Kxz^3$io;@cJ zhra7s#?5Kv5x@|95-%ND4=eH8x+KA_RE;BlERE)|ulOR2vM#6~si@u+hbfoUwO^Y{ zDZ_zc2<2TLBcLYjJuRvSXO^#@eF1=~=7^f{R-7x}~+g-hVsAPyo`I zyP!q6Hz3RB(bQWtr;(}<#ivw|wNf06qT<>)YUJkUwJ{|6^aC65FF}HaC*(qg3%oAf zw3+eWg1fxU{AEyw7rY^d=j)V&DMlP&Z-kNy)vg#`USp8LvKl5Gw&bkplch_V;nJKP wxIlf-lDvG`IoFj&F+)^F{_jH@_~b%(%;1Y##pY`0%{vZ2Dr+j0DOiR62b9mhlK=n! literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/rhand_5.png b/demo/tests/data/battlelord/rhand_5.png new file mode 100644 index 0000000000000000000000000000000000000000..13d851773b5ab8a399eae111295005f9791f7add GIT binary patch literal 4451 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/rhand_6.png b/demo/tests/data/battlelord/rhand_6.png new file mode 100644 index 0000000000000000000000000000000000000000..7bd494420da13a5caf7cff66b53296a7508d832e GIT binary patch literal 4508 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/rleg_1.png b/demo/tests/data/battlelord/rleg_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d6b1d3ea542edc3f696d40dd5269a48ddbd57bfd GIT binary patch literal 2903 zcmcIm_ct4gAB~_jDp8~Mh@$o=N{!ewY86HB&{|Py6!kP#Yp)l3uQpoG2-+8`5~KE` zcC~0wD@Ki4k%r{!{Sn{uIrrXk?hp5K&i(18SX-L1vGB71001`FJtLb-jr|WyS1!31 z`e@`*t~|bPY6PJDca`|+oJ)r}=pH--0AS_(4|IUyQr=7RYADRY`064fC%Xptr1s4k z0Kl>aGt#&FbAFd#l`J?H)%`25pd4ATFkW_8B{u)&gKudIBHvpc$LU-MG0%q;_Oj*5?iw9D^W2yeQ`7PG57FNnD)z-X+QOyRH;6X z^QnmKsO_lQ)7LLdoQ8MSG<1$AdMZj6Ne$$SZIbJS>q9msNIbj2|AmsLYf84?opV!Z zW2IFYTRt1N2+gM=<$gQk&2}Grd_oiN+ z(Gs`33~!?+`LQ-@HTtqA6zIW;r8gAv2>OG&vZAQp>AnXRSm~kqe#QJQ8$KdAgU3yS zhDVZ~<_1+vuw?SF=_QAyN2Md)4y9|dMq&!nX`Ue-tE(J)oQ`zAi{RMe)Ov!E1ha|s zo)s~k*LO#9T{ZHtF!}q8b6(4Q$Ml@JOb;i2T_>H{`?f+KfTIZ1j`iWLg zwgAuJvErWP&#N52xf=my?-3H)B{i0R?u#xH!!jRcS7tNlR^${*PQyJd)O~B>?N#70 zP(KM0=u_8dU2XP3BLXPZZ-Ca5Ew)qTmMWVvt3}`K>5)4?KO0arns>Th$AZZXsPXO! z`X{d0{sWPiO)pyjFsqI!Y5w9vtYSmooUf81Jmz<8!*tc7%3FP`jBy)l|VA2-&&Uk zSY?v6^)Wb?e;3(QotJtOsrfa-UX1R8s*VajN`Rn^a@t8!9so<`q_oTeCx$y5TS=po zbTj7pAA-lv49lNPd3|Lsq^ITbUts)thgYy5I@v6M@dI&qzOmnKuXAgl4#Sv>OV`lG zfFy-NF>Pc$?myBKHZh6}u^X=*2m*D|R;&L%%z=+xkvbMmdj7yT2zooL1qZFQWFd3QNa1JZZ5 zb;8V{0Xykb0vz58y2o^VpI$xSk46-wd7w(VWMRRD*Tvmmh||U{JeJR28PcCW{xK-in-7xMFS0uQjQ_i5Hka|Q z_dlqM;M=&PwFsFwSf&eDA6^z;^%pf zfBT#cqKVIwdfn7aRQL%PBtwaF{Cc6Ta0YLNiD1L^Gj@I1P<#<9GbvS4&v!5-yrsRp zogkcXDx5nzJ$x?l4b2cGz; zKg>)^GCnz4Y?DPk%XOUrkgRO!k*>Sz=^dUoDTQ!?E_F?Q1ZF;8X; zm)ol=z(xk~!l@~JBpUVuGWo%F)LH*vctkB9ToFlwX(na?IIg z0z{k}4ucDsp3hz6j4k=z17P?~LfU51OtO5#92xh*Z7)nY7CAMT8I(*+(cCO?lXM1s z><=`JeG?LWnW*~`xLZxYP}>Ve|*$f7mK3C}>Y|amYd$j#Uhkv!YvfqC%H~XK8z!B?s0!X9|d1 zd)jrwa|JyY*Q0}XX8anwF2z0!C=Ltbazwwb**0~Sb^5%v zNq)Cd#Q4TL+ggGf22?B+30hh#7!o0}G^uPVDd;4yipNM8@koPT=?IFB@X7rBm-}p}UbUxh)P=jQx*j-_LF0~L zcSdWY3YgAMKJT{UHNV&54^FtDPYG4+xXD%A+y!DF-N#0w7_6RA}Y{WBN zwH=qUi+6lku|mA=cOQFa^Auh?r?VFw<0jJ`OcraAE8=48#Y2oAD3zN-51a7~k7Be9 z1PmJ&7`Ku1=5M@jM?`|Gw{!#vw8nb3j!3uGR*;MC3G+e7c-=)@pZ*K>%LxpC8Cx1P I7`VUsADVQAdjJ3c literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/rleg_2.png b/demo/tests/data/battlelord/rleg_2.png new file mode 100644 index 0000000000000000000000000000000000000000..63be968ab9444be753d02404beedbfbfe027b3f0 GIT binary patch literal 2446 zcmcIm`#aN%AOEnJ%Q~A}qAj-*4y_`&S`+45a>#pk=%x<}TasUAAb~=f6 z+wr*nC?mb2EjAbb*)i!$r!Z(h{NLm=UZw9OvSBB^i2xw4_#Y*J>|E8I5PZW4>j)l^ zQiPfR+8)jZ@2tU{(00F*2N&{OlKs7ulb9v%tJ_6KM-mU}H#^9O1gJ2AFFsU=>Ty=7 zQq@XD1|GLpq0|x|r>zd77hNev*W&=<40_8le0s^f1Ow1kKuJjKu1(D#Yt#2!bD*Bs?#yitD4FhcAF+f=#+6Q* zjKPo3gVHxza{ZEWzC}fD<}2;O6ksIe##+ZO5JWOD3G)07pU+{|u9MH_t$8__AZAaL zu?7|^Qe5JU>!y?V)N2d001=)ePMVSB+bLfU&6N7-30tfFz__E9o8R-yHsi;rC zZ#Dx*Fd@ksN)=&->-43}qPlP28=0DD>VaeWX5qSP**Agd83rz=&Dl) zPwK8YDe|wJw`@ z_YO2HDU*^J&OYGR0x_ih;pRM%Rf9`Z{VMBFd|EfXZ8>8P4iT*VwWCJ-&8$qn;fz}T zym&wDb`Kd1k@$EsQ`w?`=vgn{b&Ep0pKBZvs?w(EqLnP32z(fc{ch3)02?j0Xjg61 z9+jr-9sj;!YIH(+>*_evSs#L-_dxgvrvka=C-F?^_SV_XqV?K)l2ayec?Z2}YI*Os z-b0hMN;#0h%mhn%@L(DnB3=xnj!jyk-kYswIW^o-vz_g%Ye~?eb>`Eay=di3>HMBp znlhC}SaAv|lB39^>1CA}!0PLzH(3+7LZD`Q^9S?UvE|glKTmV)Ih4Ka{=J4-$BF~p zuBt%{OyBAT>42J0+2G(?O_2kQX7T>v6^~?*e^rrF36>OdZnPe?esI6y|7azkht0_4Tk$36wfO(fepNbam3-Sk;IM_j;Z(YN zy2WJ3E-pfy%03G792I|p1Tr8Vu@`H}kds z`Ag)`)(6d*N{2{BfuZvk$e0DV@gTE)E$lHXHgwSAN2J^4lffn==;XWF?m=*)Fzi?e zYZkxegUjyTAjE&FHWfvxSOK`2SpMQT7Xg4%qqpkW$Dn$ChvRETY&&Gr8A{J&SL*F2`pTl7o_SIQ&DH({X zUD&levY*P~Kee{Kf!8T8?w86Hg5;YfGip3Kwa=v)s{#?Pr)ioGSnGOLwo1maLA@Yk z-|C`ya{kNGE^yb>R@pMu5gPV*?KHLK^pbt2bDzPNA+fl1Eu!|zLJ)Pkz&uGNS|8_s zxv;%W{=Qq$&wC^8Wto<`vuYm!OWyfWB0E6DKc(OA(`XlKh_C8ZDW1115@#&|bx-Mb zo73^5p!Q(tV3;^9pCBPPt`YmqF(zt$zzaK2r36@dnd<8Rxd*eE5QKy{oUf5`QetH9 zQm*!#!^UD}^FNVL?3W0EB<|19R0j!x>Gae4Rde$=|5>F^YcVd+;|?XNU><0_H7JfC zxTehmp?^IxS|8yP>oVij3KLZ=jFw=@3h(IeW>+_WAs+9mFf19WU|07;vW<9G7Bvb# zVk2NpN?e#zr0BUM<}hnRI#F!M!}a*#H;%f(-qnhuS=BG3Lq~Z692b4Qc1W^0$c@QGjBPechTBUP5>d)c7Q&_I3t~ zT%x)}S6eC&Ty;J;;bwmAYPAw=OmwCeDOgWq6_)?(Q?q+V1F-zC3>j_okwi`M^k+HO z!@fI@ez^aDKs1|KvRyL|chSOeA3tXUWBVXQBmR40Sj|-TQ%gC)jH1ONHSf%#a2bVM6%M z<*cOGtekCRYihI4+EXPC&9<(^(2y#WP}Tr3E|Uws5pdD>nv8c0_QeKbS>eOoy30JB z?bh8O`s+8Jm$a%v{D=zEaBK8XC+nf3t~U;8Ar4Z|BS}xXsRT)>x`ge=2f>~`xKWT7 zkQgJ>tb*h(*k4nihu`WAtRx*wc&kK_AsraXR;EbX1y`1Lt#-q!(=o%gJtWakVJhCq z2d3~mVbD{$!Vf?iyR12DrOY2~(l1u=@u(~($^Ng9u&zV{yGpDh8YU7)cbXI6M IZjYz@3khGH%m4rY literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/rleg_3.png b/demo/tests/data/battlelord/rleg_3.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3bb455bdfa4e21861405ec5bc523689044fb8b GIT binary patch literal 2347 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 D(7AA- literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord/rleg_4.png b/demo/tests/data/battlelord/rleg_4.png new file mode 100644 index 0000000000000000000000000000000000000000..b186288a84ca2f159639642642dce12b9bea9804 GIT binary patch literal 2777 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 f9SO|1oHO(f4TOk0#mFhL=xqh!?vn5n=ZM(e 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 RzQ3di1CUjfsgg1a`G232T-yKu literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord_2.png b/demo/tests/data/battlelord_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a06c5d451f18b980b78f19112cd75cee1ad1ecec GIT binary patch literal 15072 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

q{xx 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/battlelord_6.png b/demo/tests/data/battlelord_6.png new file mode 100644 index 0000000000000000000000000000000000000000..62c6517c6c51c88b5df081df9c9fe1768402ed43 GIT binary patch literal 14525 zcmW+-1ymbN7e$K~cM1fGySux)1uO3E8XStdyB2r%QXB#lhvF0{!QJ`!{$wV5&Ya!z zUUuI+yLZ29|N9p9R-}Ba zAUVtGxj{jpVE;Fvp|W!cJ{A$&<&>llHc(-4sQIg>+QOiq$f4vU#WcOwPJ2O7hBE1g zkK@#+CWvALKb_H*o#ESe2=o6NxTOFzy+nBWF%yefGFxpl#}Qb^5j0Zg<_NBuj7u`3 zrRfe)B|kzmCIYT9krqwyzp9;@A#Pa+d7)$ru>D2M56pd`EW88IpMO9h^t@7@^=8qH z-DRR(P>m>Jf88n1p3eLZ8bL<)%*Crxz7{`1;QoZZeRM;KqbtW!F&6YG7Rip z>q3(jj3Qq=2x ze$MxM`t$Unq4K6Yxa1*`beO<2FytKgQbJanma0nzI=nvs0>U5iw(hG{K&^BAcO^AY zyK3Ip(!?Q7NZ_m8>zP_VXwb`eJ@^+ai{SGD5Gh#A^?rtNDU{KP#JG(`vu1TH@u~ZZdT~R8QoG4;&5*D49CFTER_ufkaz7JA% z(_j{hA|oR9+{aE}N+pT3L7^YhUBOUMi4zu5e~L^bqD#h;g<0Fjkxo80kff6`T!zzW zw(r7E!a8RJY(DZzTGKVj=s=S`5eyK7w&D@OiX(?D$T_R4?ep!8QIGq2reLBTq&^BhTcD5Tny4Mk^{>p_KtC@ z_aw9zZ6DqUQnY4)X0;YtwJTfQVl8MuBzj2F=5DVP9jqt>o}z`ofwVga0rMeA-XyQg zfvGbp3^7tmp$<1IU2~Fe@)59RZe2Tm71CDe0#;i@>rA(%vNkMq>5GA-7}PUY!wRX8 zDk}A_fkIzPVi#+xZH2QEL(WCFrmC!g?qWrUyVm*PoW1X9h?@#CZMz_9%Ynka_I^T z4)bDmP_rHG&M5D3vtiJ~tnI*~BzuZN$A}`JBD9i|JMI#b`_2|I^+$l`;vRH6bi4IV z25JwqhkgqxDJ^v*mb^hMT4m%&#h9`~8K_}3K!IN6P1R-$-HqEI1W2Zf1uIUtnkA>$ z4VSjb0tgO?4q@X`yqzKoZbyGXtK|9FqG9k25{su|e38fh(-oN3+xz-q(&$J~W$L8{ zMgW7!nkhPt>A!m8-Svj#^U+ne_GyIGT~td76aO+#88R}D2b678vFIULu_&GuRC@*m z<^=Ls0;*#2qf2P>rw*m527e-W>ds8` zN0-XJl*-nxFW{boyiq7&Cz(^6Powds|1yAF32aegRQ>5)rbUUfVIyMOMo8pwW zI1CNCOjheKJNw%uFf?O6$7H*zH~YBY>+>v3Mo$W0JCZW56p*?2UEKeEtXQr9?BW-I z9KRHc5<44Vg;GIXrEaT)EH@Vrj}uxz4PvX<*I0Fm;YE~t_&@!_|JZfhq~WUrhxx+o zn}ml1RGkk`)reG`u8&O2j`0^@j_!u=_IP_wc;k&?5~s!{n16O5^c`<=2)c)~&i2zI zjJc9ll*dC5k~$y|)i~gB^$U#mTj$|2-~mAVZ!df{%a=?Uw?do*N6Z6+yq}dh5V=A( zpl9*;1lh6|Y=i3mt7+6=PjYV5JGl9Vmc1vz&g9ayzf0_NF;e!0*|76xc&*Z=|2-FT zZ?A$4J#d+o=(M4`S&D7-pm&*NH}~+iT}1J0=OSoAi@>c-;)o^iWvEq^P-g@gz~y14 zF-uT1g%d}s9Ic>^DL(KRu`TfT2xEk{Q$np2$11gOOyO->0o3QHIX)Bkb{+TOBQvl= z&6=)1S)38{zY3G}y$feh^8w)#lYJZrYm>=DYJhDJGd$&ncCWGZD)UxQ%J|n359kaB ziXk?*4&Pf!PtUdn@a2D=gT*|lXKZC^pgYX!H!J^5Qh`sC1lCAEoSQm2 zjOKyaqn20!aokpxfH6$)3qzDF6y$4|B^Ot}2@1)Ph(We9MJEqxD=p5i3&jr7iYc z-{~VRvxB*$aKX*s`SYG~&~lBCq+DmUQvY zR6|m{xA*<8r+J7IaG@S1@n`B2dc_|iRD|Dc_dqZ0ARz3YF0Mo8bITA{So=73=@iU1 zC2{%@s@o=tu%IR6JPWu(4E3wC)__DJiGc`K^62{B%g@x4-uJc3$=x59t!g)n$(b42C=9lMFmR>u(#XKxIOsmJ)&h@`wqWE0&z(gG1|VzX`K&s zwj*a8YCxAZ@+oig#_!g>$l0KG^mm^Ur-xa3p@HAl+&nbn%W~iC^i$8mEf7F<>_fJV zrv2ZK7%TXNe^MfJ@J_lOy$RNxMoC+ z>_y|;CkUg3hFL&_gSIBv%}%XZ%hKDyI!_4lEHH3%^SB#xj)(3|i?fa2uk7?R%JTk= zX`SlB6+B8OWXb`?n@~e2k%JRMVh1|LF2K$9BvOuv0sIF8=2i;bV4n|pSRsrpE1uz+ zgj$AXi67edxThKn9HgrCe&v^o8(9xZ{A7kIFE3xoYB(pmg9zA`kj0adoS=|-j8Y5f zaUzgg3|DjrcggRa#?B^hOS3@-W>eN4i`IPOri587DwoP`sx|8y4>;K5N-Ms#Yv~ct^GIFn(b;FBPT2qb@r#t!!+{TlNW$F!P&uOnl{)dmZVt)GQAa zKNpEjr`b@Wf8Y_ltx$r-9pBsVNbU9`9e zsMxXy8I{RM_zTpPf=1xOz}ET-W=uKZCO`s5_b=5#(#|ZbP~JfkgVGFdPb_bXPcO|g zH8XjBt^sF%QXp3OK9;X9ZZq`-ptDC0?62qNWNra-?(pew6Fq$bCX8KyqGq$wW=$k{ zRycdf?ZRsnl?=?M9|;w01s&7W1Pos`m87!r!_ktU)WcFEZ)OU_EV`%gUsy#dpenho z^Rh73sBB7PiI9a+(`tG}S5D9}?3DcFfPHQ8L=SyMmWZnDhfvv`qv z;7r)NXh)D0Sg7$1n%fF{z${NfK`K4#>{F>H3mqI#zC2tU-z@iDQmx{}sCH}tJ~myp z2t%Gd8*B~1?M?}))^Sp2oS)HeiO7u8<5q2F^3xHK#EQ}z_gg;P&oa>xC?#N{|H2&& zFw|6U($!LI6@<2N96EDi*$>l5>X~xa!AFGErRo+-TSEw2h}zENNw+as8K?4_?#Aua#Im({7eyNL&v1+F08K*o;ZHrCd|t9ttrMwzD+!)?}hh z(D$;tsr+?=2maw7O@UL-)kF-0?EOdvGE^dwn!Ybd5+XR6ME{$UCRiE5n1z!{J@f!m6@`Ia;~N6Pl=wOyVLle+J`sIDhdhbz#n zf07C>Z`b1{OZTHjd_2l7`}4nMlFdJ(1WM&_;5@GBMhzH6&)?e8r4Gk+?<#w1pYs0d z9*#{+hr!xA{5I-l8<>18U<*^;u3#F}+c}@k(5w{+E=(i&1`$gtCC>;^>3?~egCJh@ z&0lC(s>ud>kOBlcwBzjU-7Vo>@k2hYPJ2_V3{5F0bK+V$1XPW}rO3r<_chOlep*2^`762#aLkA}rbos9 z(x61KGp)z1Q&SRT7`5Af)L6N&R^-MeR+RhZbcquSN!~cR#Oi!n=YCki3@c?F_+kD& zwrl#%A&AKLaNc%34nUR!Rd>ge)^e2?%(qm^E_A2wZ@og%nOh|NiBwvmMW8nOp~DsD zVbIkBJ8(JZFN;!(KGpIqt88R(wlf^#X8_vI^B5Sx+ndMMR97f2Uk=cdBuwx^(WL*d zc0#tzc;GlBt*r=h!$`tx3@jziu76c)kmK2`|1 z2A!%pdEy3n1woh!Vn^cCHwz&ibo>W`NZU2-tVRy-oP3i#2~ZAiGTW3>ntoi7ir}Hc z7D-qYd8VqWt56w`dWO-;YK}I(%n&PoDeAP=+Z=}Roh_M=6*ymG8-l(t2|v8AiT8~Y zyf#>DQ{tkeATi?Ymoels*@L`5uwP0Z?@4gl2QF(D+5f#xmW*!}f@t-pIMp_ag;XBp z;y21nJ%<@@Hrd=$lmiU2Hx6bn5#vB1oLGn=S~5UdzT|=}*-mO5V3KyLD1eXA1(+G} z$?g)Dl`}F|<~IYmaoc!FH2QUno)sBrRj>&ROf-t z*rvZcF@;3+%t@y3X&oBCd)X1?da63OF;Jl@)?^c{g}+ZWhgG^+%-Zg$&nIOmR8o*6@mH5EdSv8)fZ1g5&{Yl*&j3Zb-Jdfccd)#ecsvuG64VDPme zkwS*4XS%58gJ_|o`sJ#Xv5aSGpHg1ueb@`( z1gF@A-$ zNzFgwtQ3=&Jm-!)aCL;p);Z?tljlqLUEIyvJt#f-dxT5Id?W^ek~D1z-yeb9-cUFd z6zFT>^RM@92{<#cd_^XF)KO95q&rtB3op1~5O%z;`VdPzOVg_cj z%e>zww7aBu(5(#zM#sL+SEf4(X+hZX8b-4S;R+bVO23DkuHqaDW?0%NJNvYdv#{@< zu=6RTvU7S!H5&lRN^_M|CkkW5=)W_wY*z`bX@zrU>&rZ!Y}7b|cf_}E^^$-+Wu=wt za9S+HM2A^;5hYc_5o6C8+*yuJpC4Zl$TmN`zbQ}X4@F;6@Y5jH9|z=rJ44XL0zQxP zKSj7GJl0?^D1h|Lr}lFTXb3ULba2AbnqEURorI17Ge|XB?91|qAG`je4Ut)IZ~8ul zx*Tuo$!!(OLz6mBw}$vFIf4g*yk0)%V)bR%JA|1fcL93>Wq|Y}gy+r04%tgVVC$8e z#2&=u70ZzTSA%JW_9XWKM}@33Ot&T_K>zt#T`SB;MrKo+Zj9q`w5x72y=6b3(sUMlsBSgYh}P zoZGP-U803JrkR%FZayx!YH^V)bN}6)$2v}*@O5R1gqfVSu*FRQ?$wqUX)$V}WiX$s zeqkAp_CKN;i($u&cia@Wkzym#aO}UUJs-vKL!_&W&#+SM@+S5q%Pq-f!N^mODgMeb z0o`yszpb@_CH@(%uP^e8$d(-wIlM3ol}4CT%dvX-iqt?zn^Jj)Y6BNIQrU2^$U{id zH+%EeSqnX>KPlN&)7k7C5&vbj>>0eMPtN6Z5{seEzL~2YOLMc22JjZQdXk8WI=eM& z^`idFi@o%R`osv+mtig;%jZya1#y)!%@CSCVu5G&o;$GMF#p}XRt2dK8+frX zgqkj1b^vZdsY=z}PQJSNrius+fdwMf;BzvwGN4XU#{oa`Pu?nEi{RoF1DB2^Uo#4R zvI_VbfB`wYm$*SncVN18{m#9`{IZT)#PhnzhiB+E@s(#^DqVG)`MNPKJhqguppADkQl)xNNN2dKsp*{>J2iXHMf^zM4UTX$4; zX&eMDT^#Jd9BRNXOgdz>J^S;kS>x{EazWzAt$`?E4f9 zH6wUE^%TR>x5E3rkOCQ@@nQwzSjcqDR(J_ZQ~Mm}_8MMP%xwC9ha7ErN>{RX^xHcd zIuzBjf3k`MZT-nbmH5);c(IA)KfuitiQpz}p{%_RcWAA@e*5rUBLLy_!tb_hd-Koz zpaJM}yv9JM&=)i}C^{`AjHdHcZ#RQn8#>5_(J=?&%R1=gVa^)y-{Fez^Dz%GOV7p0 z)72fkV0O6?JH2c6o~B`U1E1VCC0ITtK(6~*zGI>+^Ved5-;oA1D7%qFX6HFv+@&Ww z$8i$&c61|uq2}&j##@RBGV&G^_oX&FW5ST*d3ZWm<=>51@JY_eiWHGqo$&h{n3~x~ z&9jG_%9|Wzjr}s$9>>6?M{uMnm}0r8_5Aly!%$F%1p$_?o5b}W)flJ4@TKdpd6!fY z%Q(Bl0+rvW0^VXW<8n`1@Azh1K=cbEi?J~&xV6|t7#EbwtHFmd$Z?h~PO_Xnxo-2h zu-10sUl`9;V8D+(JG0rp@E)$@YE&oZYqF_FDxR@`+Z#@eoGivULcnycezh9bEb0n7E{z_n?A3|S;!~L z!SDbf!P?c$p0OqE!78~>-1eODK`RC}+E4*4!;|+^_N*O68aJa@g{w>Js6QV01vYY% z)cBnjOEOcQUTV^2`jdBQzj$}6gmPPt1O>1k3-I2mY{%H+yz+fE%BQ|6gfjI0BRk9< z@8IQ-O#Y+P^vO?V@|pR?uNVq+kIzyIx=PVmYEAFC_}L5rUF)#avlw=bMJ_uvf_jQ= z^lPpcJct6i0#7sbWst}*ZKVM7*30a)J)~^e@hUG)I-PF96jc5%s~N=HRnX?qgTabp zJ5{!s`w_h*e+e5#{9@WY$KaF;>|HjOCTqs!>3{2x$oN!Q~eCHOACJ?5U#3gWL`ZR$pONe$JJoi;O>_v zI1G&`-sK`Bmx2`nA=@DOVKAcKEcRn7{pzojbgwR87~!K6cpSYwM99!`67*xJ%A$IT zmSfsp-7_8V8Cx`9+bh86@?S=QptI!s{a2KS%Y*`Bt0wZ9soB`Mdc#V{Ck3TSnyHbE zZ7J*y7YI}l=RCVYfd3;w8P4c+fMklJnZ-up^F8v#R42_+=!Km9R*K;5=Y46)(n80R zAPQxaA-j4*Nn$1KSl;RDcK-Zk-pqDt8+qe z@!0?FJ^I(l2d^q9(7TR^0ZV9cTkucWwIww?!u9!BQ$b4*XnfOz0_Y5Ic=o=&g1-`X z?ZG1X@})>p{94Y-Z@AWoQ-BfU&2lu|m)Bkt^6k z&c?W*Y_r^21j})pO}K?q-rHZ#m*^zVjePH2vbjoKOvpRDF=o8*U|)>ipSSAln0`2H zUs#JJS)ABUujDEbDp^UAtq2I3HUf8GJ`j>i7xjoESY!q5m7DhrE`iWWWsT;gSnJ|} z4QhYcQ>*_nZZu+ww(EK!t@VvC^zSSeCB1vUjx9D=2lXd&bK?FUU0}@jE>+n&gV96I zIwO=(M8a5OgYWmYn&l`80?+=rp)+F6f2hOh5R(KSZqw;{3FBiqru54^*)|O-ouONx z$7}KT0#}O5xV}!?Ed4BS+*ZrQ4z!qM96p+hl#cPebN$KbJLNw_VMo{ z4cw!s+h7}$OeGnTR#xMh#7$S1+!UvH1dyZtq`#V)CCz)k?fk&#zZO;bK~p`N9ehG{ zWN8a84{R?+e>N`ek5_y zHknHX%P{ z!rgGM_xRYnfm?5blHd0XXc}b2%dxG3nAJ;}uS0+b{@#0dQr6yw6Wqg<{2&nCBvH`h zI(ADkNjvI|TZyA+X#!alH?%0-mdGi3g0Dc9AY|^yHMt2Z573OciJ+}D4QUQR5oi{G19iDb$cyoPNgUJ|y6EHr~pwHA@#)+?w9|8W6T{ zq6pV1FPrzGB}V)S$RU8lrjZa2WZkZP1)jx&$*)2CqMNz60mMqB^4Z z`n>|TsB--r{$F=JGKS&M&$4iYlqAbe;G8Cx&vK5)7nMvhvPRtv)9TeClC&13F22E` zw;eI@{ifJGU$ARdRQ{EqnIQO$Tw$RioHV!{vz}-qYiD=q0kw9r%9hrZqahrOzo;s8 zv&5FIJT7ek6XI_BmfN2GckzB)z{}KdAiO2OeYGwKw=6w1ivmu!EuE$B?I2hYzF!0W z;VH+7`{T1DE}7jn2vjiC*|%Uzq~UguSid`gLnwmEJ+s91~Fu58ShK*BwID)L1RH`qnQ)5bzKllySGqu2t$esD6w7 zKw-=nWyHsh9oJ>Xn@UJ%sN0+L`n=v2OM|UljSKEHxs9PHj83j~m0Vwdy^Wcf*n0Nz z@n|NwdNZgPsIkK7)UR9>P|32nxMfYh zN-qO$h*wAP9^fZ>eLPcy1sIQ?Kjs4UW?KW zd8NbmTz$lKMTJxhf?C2jcJ>nGwV!1JdI`-)$8m!+G2ggKOeeer#bm|QQgQT@FG$HU zHr~@Dl*GO#_xoSIJhi`)RuId!CX+1F+^|eoUr`Wah|~RMLI>QQ!XH{gB8U-i+rkAW zf0z%-L@Ed$1yy}PlBU{W&KTuX+R$T;NlLVeXc}V!Rurc!(Nbh#5zsZTDJkD#+)?hp zh{wV%%HbfFq0!GHR%XW2#7a|sJQ(4x%jBh|Zf)c4?1OxxrXDDEZb1DcLbvEj1_}8{ zbZ7_#xQ(|@h%$5kKyiNf#}r=;FuSWPH+H4xN?2*0Rb+E`l$Si@RW3);_D(0hhad$~ z>i-i5PQO6%UR~mbQF~F;C4(W0I-PyEl%%4LER9V>*i_3;)7d(ukz-w6o=Ncku*>%B z=DknQxdC+GT{X*ZUhgPtG-3YKS>CO0hU}w0`SYA;^2EnordqX#o0Mtdzp%`Rj``{2 zY$=o`bHXva*PE=nM$~uu7jN!wYK0i>Qq7aglyhfq_0vkQ^psU&_&T*omho!U3xY+A z*qmT$n@L#k&DRA89LAMGarwe87#SaycFiOa6A`I9%Q=y`vRUbo1%0E~CR`;obiNpo zh-uO$v6twvm4QEhK!_Df_okF%0q`MDx0Y-jCdXPxN_I?}&ytYOI6l7DuQmP`ebq43 z!22pARUR%6jd`F#Y-2Oj=Q1>hJ@0?vhs*6bZ}S5&4qw{wxULUimq7)DDPi0{mg8@7Ou2}K_6m0oT$)@0uRqh1zW zctRbH#iub~EhLzT0W(6-gFr>8Ca)diGjZB`82&*CxsRhTtNkQCJ{vJuW1JbsrU$%a zr+2F(W9(?-`n%D-DJehr)&x!0akYd%Th`&SCry#28ojqinW}Ek)1a_P=YWl~SF7aS z8Po5RlGA?I05GM*VXh6)QV+^6%vBJSSjE%YXwZEGSbTtsji^ya-6m@?qR`4Z2o6@R zaZ3-5qslYmC0fdfrx%YwTPmFLv1&if@+xe<$kPEcr~_e>nmFk|G%lCF2=v;}^h;1v z2tUW`{BYFBNHzU-7Lsn$KDakjtuvp|M5uw?>2p1j=n6dKPd*ykd>5f>F5_u6^n z`z2=3V4=%jK#%6vf1ah0_O(=#?9!dP);5U1Gig85g+XR#2T_(Xuxd*)Q) zA$iG(V{9?wm1fXY(%&lSIM1xgh~X;J(uBE^FB9W>h_g_kY_sIQ-7oP!`ztd0PVyNVZ$*#LJHZJN!#JOHWN3423!B=hq9m6Lq8a^9KfpbZnq<7 z$689-sU3^S6qC+i6GLFHZBuTWhwh=S2c~B$F!^ug?NglBCKa*quJ<|7=`K{B)qYMr zTXyWYrOe5hVBihMIDl^qYQCKM;4mby+8=~O-6vHw)o3$S zhi~r=GgLxL(lvp(G^=s_{GMy7a7$bz^~_I<1z_kt?V!-H@{>ho%*o32fp8(4SfUtMv#ed4;BO0;-va8Zz#;=8gxCggG2_|{kz z0TTlu5b;y~GM_bhLlmK9sIeaOoxxwzp!W_F(59I-{5)W?aRshr(_uE;-u=7W@v>Ge zspAG2Y5k=ZWEvU42UCVpXZ(!ez+TF2KIb|pn@%y>iYEM(ik3>T&1$8}vQ@XpJjs(J zm2iGM69Z;X9bIu(X3}>Be^W(X#$4tzm0Zrj@DLen<`v8eWvTm+17drvbOM{F@jY+- z*hhY{y)=!hs^$`QuFQOs5JyebtkT5*7mheRVsMje4H-9F%bYcb zN#hUaBC(uY!AXKR&fybz_Sb7W&Qmsz`PnuHnD&pnvP!`(G@Q34+P4FDpxqAm`UbCYw>%BEQz&9mhn`T-1!N2LNOy2X54pVQgGT2THK=>(~WyqfM+ zR?O5>QtyY$I@ z#Su1JElr)xWv^$3>niN6KJf_yCl!ey$4qfXR^yqtQuE?Dh<;)%-BpW`mY?~LqW6De zW1>@IFY^!3zMi{Qd%}a2-vX70* zFK;Db!kcnU$(HNJ^@yzQ8hYojZ$~P#HEgdHyd+)0h`hUtBtm>To}A$Z7l3RHGfB1v zyVXmH?a!0XtyejsysNszkfyEKOImUFC}ixWtLoHmNF?d2{xEAwwM+g)qq5$*M)vgX z{lI*W)er?uf0zi~y3=zU@@w5{&R+%pJ~CCr!zV99!&qw`{vmApKBvG^XBhO?^m|gs zh7F%PG1ta{bC6U@2b%9L(kblZ_N=;TDCog(fP4WFIyf=QnzGf?>Pr8=(5#<>sh$tMC|M@~$SC|XeBUy9GGIW!*c7P%CbyCILHaymPlN)wD# zDSjk~19%@Jf_TGuGydyt0?YIly^E!zN>xivLsL8~rx@WC!Qj$2yIj^S`WI+~4{lT( z0imOJ|Gc$TZiNFatLpxrK-b!{>c{>=yh0H9;fzRYI+pM8H!7*a3S4PBO&r;ziDF@3 z>a2u2=#WW-;bL87>GaOUBQ!S2K+e9sRscTAg`9!wZJ*1C|NW+`e!~`rU4De!J**;H znxLf?RDWNi{F)!IX9Ma^uoIZwx@(4$fId}gh6+u1IjN4rfDzBd5Qo)0L{!6Qd^q~_ z$$@Nx+&@?hDNg$_@zdvM=Nw#&Ov!(ws989$1|+&m=Lec3);;#hbbnNEIdK#!RMurFt4@Xl$MEGPQ~KQTRS>0{dmFJ|_r*}- zZIc{=9RaDNjZt;O3P=H?GUuO6dF7tPV=NnLE1YSLkumnE-lXlM=@Sh}`*uHdnzub%Kdwsbxli(e4G}22r_Qd<>7HdFcCg4%E zx35{a^ZDL)fhOPC3ZHJPNShR~hVr1I-kFrJcDPMx$td*Fu|v-b7d1^6fmlV8odG&? z8U&Z!)2Cj;8_Qc4`D;tvynh~qznpBPbj_$<1Zo88?Z=#GnHVX|*NKT?VKKDVfZ)ZEbQ=(0X zg@<|=uJ2#*KI^nv3gBjK@bD9mJcZ%Ne1#*agucR6FM`>~wg5}MiqjvL4|1imYwYv4 zhTijmvglZkQG?t>l(#TjwDMbupM(DzcvN5hCjDA+4szNq*f=M9`0ue;Q(}nc{~UPz zBK+QR5q^Tqwy}H$3}XLO0;f(~-mKI{V*#9H#I~BfEAK!5`CjloG{cj+#L0ci_oIev zswc^{uuG*I3!B2*w|pl_GYEU9oKrPFyHpNPWvc~SXa^7QLmL-*HCo^%>uWXi+9YUEqVzY5a~ep&;7axT##Xf zGui8Xv~%_g|HIhV|^mHAB{ zbTl#oL`q6$K~thcTcd56KoHwHJ-8n;nP*kpCE7?)i>JNH9kx~eXxf+~b2X%c3Jwe2 zHu`}Q6k(gj+@bK9=Dq~qzS!c}+~pcb23|r~xX=Cy2cKI|(`mpEn@+%mN!kqk$iY83 zd;^n%-b$MeBUj%vN>RVysV-N>{Ag!J3`a%(B&EN;7W@LNPK95=h(IrFhTHv2`pd6V zao4XAYBq^lRxY0=w}0%KQ{qV7a9}lst*ZNQ`4Y9Jrj!?!8R@I+Yp>GA=IP7yww z$|o%cyGCL6)*#+LZ_i3}&%Jb_=g8{Y44=gA%KjYa!?cqMTmZQIZA;En@cmDx_9nR;x7Ta0kT3q{4_(Z_3e)D z3N!v{Y|KrP>N_u49-LbUB}ezR(4QE{xk@NxHX=e=9YQ?{_cw5N-0iaFupDq|)6n;) zMFRfM5f1RZw(j?-X^J0#|8V(lXiR^OjNkKWBrqpK8)#@cUuLACLXQ9zVZ7I3-{YT4iuJ8GFD}nAOH4q zn_?j&8t|`G-<$Ern>%D<+fL6DRBKhHi(jkTs&XVFHrm24vSQ`M5jl&*Q?C2pBHueM zD=MHqSp4($Z*sQFJpO-_pr0Opk_se>UtH4k`)=cGf2i<&e(S20WHaNx<9#2BKL5ug zea|0OY&(E_5>?033(C28g!3&Q7>b|_4VCYAmL(8a$vF!0T{b#==ioR&0bhlb8wNUs z7i{6(WQ}uMFxxoTVl{%*4w9>oT55+oe}$EoN_w5sghA;^EFr&Dyq}6Vy^Pa}*2BSY za7LH^oEdMj@IZ!E)C;1XMCrNj@bxjK{I})t!LfU;xNTCC>@Id-(&8EK0Wu?=mD-dU zH`KODXPuaDsS}O?K`PwQ!imVvXWwa-s)z|iHe`t?Box{;X_{}R-I$1j?P*7v(?4ku4!8H)p43DL020-Y05T`gOS6TTZ{gRzMBmHE2K=ic(kz z>U~~So4Mm56U7E|YCaM4>o8m#9?sPBC;^E)d~rXhV)?=qy$+JhOx^OQCueP&1A+Zl ztz~=51p!{XqxV%GSl|aZ?mjYfQ5a}kq)yE( zncHZPU*NOg8{}80Nl+6<-C9?{xaA0kYFv?|Pdl<(ME2|0eSi5|@xFWSxn&0};(a-M zYi@h?RG2F4bN#wK`VT?N9bFzY8OqP}qHB+pR-BluUi*-fQK0|M_92$eJ^#>N$xBUs zXB}7mKzC#7YhHv#FL*V}!OJ`|A6~SXm*dFxX58+)RbVt8b(&tnP?2T%RxoCURHpbLOmnnG1^H%AGH6-i9|vPtHnH9AAv413tm>#=30gz7T8kZlj>g7^asg0r*92w} zfnsF~tQ>QmwR;X2-gzANHu}EvZT~#hB?P~Bt2VyMyq?`J!n`~+&u|+(?o2}F(W`8< zy_Z8gtnQv}(W_*h9Y5r?A(VN5|45MP``gNxlHk|^bm>A7jj2K3tHULc+0D=Q(3;@%z>&*d84Hy|% z8^+y*Fy5^`?En)S;I+&U02?whNC9As#~F7k%pEU-JAedO9ALA6={#V7efe7_QE~wy z0>m)D5d4t9++}3~5JC>K2f%rNGyo9*023E5ek}kzfVm1RKqMZ7GT@C3Xhj5AHJuOO z1YkUTx5jrqfb#&~yY}mr50FO+O#~?Wc;EuYyYY>?W&=V7NAK<2P0IyH2Z)e(T|0KtxPJve%LYt#kfyf)69VINY(e<7a~$W6dVrWY0Qc1=Asm4G z2`B<4KP-fh0+0hxp?GfroYQy`X7VYhhMz-xr;DG0;+*0>pCnn8rL(Y`0J_x0iLnsgJ?bw0KT}mzRaI40^{?~__29@}5oc#;00000NkvXXu0mjf Dq8J(x literal 0 HcmV?d00001 diff --git a/demo/tests/data/cat_2.png b/demo/tests/data/cat_2.png new file mode 100644 index 0000000000000000000000000000000000000000..de486c58e7a334abd817785d704eb6bc933060a3 GIT binary patch literal 730 zcmV<00ww*4P)NEaIEV&5hr$WwZM7o+OB~N;Ne#H8uT*f?B|6z6|I_tOnFs z=%5~e-vubBZ9+ZZAL!y(5BPEu;BPd+e7y;x41|XO(ID@%)MYpZ2nR{W0NFAU(Oi?^ zPA3G(9LVcr4n|<$5YUw^&?%s7!5LWWt3PgIVGyn!@%6xC3#TER0YtR4m@^CJG=K-t zq(0~)h4*I>{Zi#V{%kgF0QR7Y7Q(#dyq*J0;0UuiwSZ~h5wTt{0D68MOAi)vr%iLZ za2*_Ucn5VJ!Y=ei&Hw`do~lT|cL44o=)O?y2!l?51|;(pQu)YZ zpWO1{!fX5iVCcbbw@)(&6XXC!M1ash2G9%`9`ORC0KEa6`t<^ymjOcnjMo5M^>`0Z z9|A%brwa*E2G@f)$7#3@m>|dlq~u0HA-aH9LT}BL#qZ z2jI{1h!z4uQTln_zjO{TRRBKjn$$Sjdg$VG7XfN(LIjMW@1L9RbP@__M5p;ZfHTZ{ zl;|{{1MHlI0T=~YHDg~YHBL$H{#sHi)>clr2qf` M07*qoM6N<$f{-OA>Hq)$ literal 0 HcmV?d00001 diff --git a/demo/tests/data/cat_3.png b/demo/tests/data/cat_3.png new file mode 100644 index 0000000000000000000000000000000000000000..17673a53062c73d16dda78ebea2c96915f517bc1 GIT binary patch literal 710 zcmV;%0y+JOP)3K<-1U3q2@36_v5oDF88r6u^~{lEO6>|>V|Ms3IK5zAP)fQZ#Cy@)tn%7M0^MEON2Qh$IBG}E?h8oM1BIX zmyO2IUe_IwA9r{R5ZldhC%)h3-1Kw{AU8l%RdNw*0nM^`@Z5N!A|?Q$Jy@1LCpA$X z_w2Z}hkOm7Yp;J#A^>xM@z7W|3;7hnl5YUhzB8S$-;x3BkS*}Q)p-ZwDPT!VWfK@Y zpgje!>@>o%4L{gz7QmR@cPwX|0|*$rBvj6}907*qoM6N<$g3Qkvy#N3J literal 0 HcmV?d00001 diff --git a/demo/tests/data/cat_4.png b/demo/tests/data/cat_4.png new file mode 100644 index 0000000000000000000000000000000000000000..a45c7b442f72eee43d778d55fa3f72234664034b GIT binary patch literal 725 zcmV;`0xJE9P)a4o z8z6T}$UOqE*;n&N^2f{^zHe%GO_SFLx7~hmzVhj!>Mk%xLCIu{E9>9J$ z_aUxv>?d2ofi%10nn9QeWeXM|8z2lDn zi(c4F9}O5J{VjNE0lo8jj2UbZV2-nE)GbU0*bHV|)%9J+%^@Tg!5YBo`Mz}ks)gRQ zKy2I59zruEs0Q?lCm8T!L=UQsX23j|M9g3a?2TkVoE{5Z808386o7EIocILjcj`s} zxceah;#JraiV!N@`5X=aM#v%jI~p%2aC8v)B%2-q%cK6c5y09#s5ZdgcxZbiivaL2O#lwo5FW0x$k#>y zGy|-)R2DA*)>4G)EItCj+y_`oF5xl>G5-55AQ%9N_(&w zV3#`pivX7JpmD_S4ggr(uHpKb+EnzrlE*uM{RlGT-VFJHiI8s`Kq&GIi)Y*skF|LR zVkB$DcEa0u-va@lrptqN{jdO7gNGKEDum(y52X1$WgB8!Y|iQj%72?dOQ044|P|AScrzihUAs{+s@&%yF05~dN4&{IqeaKofT;xlp8Ys68NCN256KEpA1f4qsazpb vlf)wlFI`GD(rH#9{_N`N>gww1>iVP~)u_)H6KhA400000NkvXXu0mjf((4(F literal 0 HcmV?d00001 diff --git a/demo/tests/data/cat_6.png b/demo/tests/data/cat_6.png new file mode 100644 index 0000000000000000000000000000000000000000..59af76ec934bf201bc80f4132459ca5698dc17b1 GIT binary patch literal 704 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/cd_4.png b/demo/tests/data/cd_4.png new file mode 100644 index 0000000000000000000000000000000000000000..0d61991c8b92e2f8f5a550daef357008a425123e GIT binary patch literal 5636 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 eZ`>Pq-S|I(c*w>Ll0)YJ0000{XE z)7O>#9xFGWfrRbW7)1sK#wbr0$B>F!Z)d*EZ8i{b?O)CJK+uLsxukhhpxa4~OtTYg zi7aLu(s%x?P~O=w?VqN~H(Md61mz0x{rU~ZIIHi3XfSbh{Jg@_(`XQ?-w?pQhxx8g z1EU4|p@6qV!mnEToXi!^Zi|+C9c8jFPq1atg~U7?g#^zQ=RV>8=T5sxEtz@#zuTGO z%VPZBc1>j1XkvFJ>HXh`jKVrz?FWfBvsis9e}7vhe(%qtKT=@_W_1+K5M&FvIr z>(@1xoLRR~GTPiZbLrVw>2mWQZICHJfEEiY)?I8)+-hvNl_{XE z)7O>#9xFGWzQyUrqH+cX#$-F!Z?EqyJZ!+j`hY!ND@>+Qxq>BEA$O9XjkB4c z`3DZEM&%7j-6jkA7wVo~IVIx#?$1Ac99bFuNh&BIfE7pO=_Ok#7#JJ2FXT~Jx#Q0_ zRsr2~2IYq0@CH_gkiygZwHm}YulX`~JTl2u`OleFn{%%P-e@j^YE$XiL3kM<(ltGonNFHb?2>0#LGW9;)~973#>o% g$Jhl4l*rsawr9@lwe?$~fHA<}>FVdQ&MBb@07_%EH2?qr literal 0 HcmV?d00001 diff --git a/demo/tests/data/dots_3.png b/demo/tests/data/dots_3.png new file mode 100644 index 0000000000000000000000000000000000000000..842b2f9701e0c0253fa198a6fa48b492bacf572c GIT binary patch literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9xFGWzGz>Z9uortW3{J?V@SoVw=)ms9yZ`{weOx&@`*$4pmIrb#o=`V`4e~_ z32t#Lc{FwJg@)C;N-s9Ic>HH{5(sQiel=N1wn4y&L$L*!uyR;s8dvw94=~(PQN%Ag=N1hDv13$ z!Kh}%Q1Lyx;LM~)u{vAka{H8+U2N}+GLuuYGLL27@n${4GUm@L4_;-@(rx)x_+Q>y z`(SvvgU!kx=iaP;%dr2|H2GQcL=Oc0vRZSI`_A9bAEZ(gT|9m(E>Mfsw)qjlB+wj@ zb&oO2=C+pKfHGk8MIW~9AzV7&$<+nqm=jU794{Fsc8_(|Z z&0T+b@hp*(oJ+M18g~D@FH!UMMh{a>@O{63E}YJt^2h$Oa@nf?{84m?UA=zCK2}zj z{m(DU&)qsLtGnCcz~-M!52k4=TK|2LJxwY!ae8aO_oW5j&jx(2VVceKrhnVjLxsSY OVeoYIb6Mw<&;$T^pTu$i literal 0 HcmV?d00001 diff --git a/demo/tests/data/dots_4.png b/demo/tests/data/dots_4.png new file mode 100644 index 0000000000000000000000000000000000000000..363bf8c07a7c99eb216544f4bd3e14cae100afb7 GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9xFGWo|?wgx=;oN##~Pq$B>F!Z?9j>Z8i{Kd+=Y2&EXSM&ji663}!DmW-grl zfY*pgxq{I_L@!-LWR#iKV)!00^*9Zo28-{WE-xvi7|Mp>gUgA zxLCk!z_25fa|WZ!RGa;|OgcaO85VQP>2V4-tlz7WG2z@Qc7{nQzWLAIW})$ zs9HVGl#xNHp*`jAJ z>=OOHR37Ms|5j(TyandQoSc7+MSAv2R}+`$*{^3mIC;i@o8l_@ABo4$UQhVzEcW5$ qY^}VO9isbw%vV%GfJLW&uwCn!b=A^(w>vN{7(8A5T-G@yGywoJMzU)F literal 0 HcmV?d00001 diff --git a/demo/tests/data/empty.png b/demo/tests/data/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..64d75fc3992e6171f6fde27f6481053b5ee4c411 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9xErev=k@jDHfoRx~Gd{NX4zU2N`*Ryh97V`{(kRF90%;K|?vSg98KO`YOH` OAYo5eKbLh*2~7Z@)f+4T literal 0 HcmV?d00001 diff --git a/demo/tests/data/flowers.png b/demo/tests/data/flowers.png new file mode 100644 index 0000000000000000000000000000000000000000..397da83d1c22c8483ffbf113bff950881a0514d4 GIT binary patch literal 131985 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

EY93Zuvj@8|zV6`oe=JZ-RIbW{rv% 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�DswT$vppGbdto^K7FccBPe*JLB4#?tQUo7M74w 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μ-C|-)iV$hKvgl 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 GBmW2YV3Jq> literal 0 HcmV?d00001 diff --git a/demo/tests/data/food/berry_5.png b/demo/tests/data/food/berry_5.png new file mode 100644 index 0000000000000000000000000000000000000000..68d2c878a67262d24bd63ab78aa8e3157a8d31d6 GIT binary patch literal 31380 zcmbSxWm8;D*YyBH7@Wa^GYkX4CAho0!{Dw7PH=a33+@C7PH@)*4estv2wdo!`@{1G z-sSxt#u)iIui2QESw4__;L9-NHT?SbxkuoCzo-1|f)}{m1to8@YI3 z=wC4mDmU>M_VwYwAe>zzn4b2njkM+Cuk-u4`}H1?$uz{E#65Jmz+c`JA`5FXWVr&? zn_Y`WKIiXshd-v*$67L(6aW1Gd+cfWVK>pTZ`}XUzwJkRz{{A3@mURB&ckgQwf@zw zv~s4m;Ph+C5rq+DYJfrG@h_bo&)>>k8;`&D#*;KwrVQHlqnUoZx&~Ql+Q&v92$sl3XIBjqtUKLH=J5ZuCgJoiWG%l%C4Hs5}`)5uZDq3s`~ ze1GBYMR9!1bKSA$C;1L<4f)XRzZPYp_{+uQMTN?)zIkLtQww9R*W!LvfHSuoyk9c< zCK@A(Bs;bfa9|{IE%O$k&%)p1xvRhVBEx}w;b*vF)4E1->&DE(YR20PG3)De$H+1N&!D@_C_Drj=%lgG?zcr|ay}QsFO`u6D@+p#^C7J!T1bB6G^MtGyd3u6Ss?{2nf9o!3t)~T18W4M|X%8orz3{S2^&5k<#*RB7#i@3LJ zU;RNOsaf(W_w?=WtkPkQ-}(%${>m%cU-!C*?GXYz|BgNeq(B0k9w9~@7Z{;x z4}&MO$xM@z&bH1;=e*i5;m74&?Dan>0V3Qt8X|9pRjn31qA$OD#OKGjVa}Tqn{8#y zb%7?P;FftaL4gqqQw09_T2NXc?Bc;(Bp~RuJ?IKtC#b5+wJ2qe%^!4HDc@P(H*P!(^U@DMW zx{}rJ=1Ah6a``sVsN-cWCF$7qb*C2^C~VfSF!?lTAg+T5t14SAw&wN8A(y3Dc|ais;QWWlHbkv`QK+g zyYK3{aT?X%#kTH~AHv^@&N@(GNt6JR&zSv$)qKZB5`@+s9`)bUjbE(;`W;{ApIXU1 zO)@$UQUW^A0kuZW#Q8%00B)u0Z%P8!K?5BDw2YI&zMkhgZ;wcCUoNH}_M69wo12UR zP@4P^$gDYP$nTXN3p=-RyHAU(cZqV6z+_*uyC3d0|2x4}HaL{BS9w_vUZ6ZhbP$$H z3)e;ZI8CC?psp8$il}Q(Lqi;t|I)jcci8E2#@QL*yZA5izU&eU4d~1B1sEGu%Emmz zd#KV84my)bnvSx8Rxk5OSfgc+cUgV^`|_lXk>`3==(p5(Df&az(csTe)^$f-n;l+w zd;3*T#03H%laBs%=y&a!uiO2`(aD$Y|F#1j=MFzib?w+n^gSb9ygsoO3H1bu2T(>M zA>p>dF%AyYBB`C5!!;NR&!2KWHxJyC|6s)iu#yU325@wvvl_O({O%rg?Ns)vTbO(= zqmA{~Q8$4%wvJ6WsK7|Ztn?-*YTd7gUOoQRy<@uyWpM{xVdT9E^Sv-rFNYNU@iBw> z-N`(WUJsTmZi(q$?lytP`hP>DMj|biw=@Fzk1%t4u3tjFOO+AZTwUu(j{hxOhqxT} za{{&ozCZ8E_&z-*Y~+V;SJ6Zp*FSyTd=)C?waHe}#8QD~=HgjmqDad)zg`NXWN*zT z6`K`D;;_kUa2LrUny=LeNl^M0@Go|Ee2lSQxZH~P@ORD0>M}Zk`07=+QUxY2(#6S{ z88A0Lm8u>fl0eBH>wzP0_UW~Hqwr7O$(cyE+nL*%MwTJ%fMYaUPM<;HGeQ^bdP)Lro*MN8cl9!Bw-UJ1W0RzfPYKU72PIIpe}F1PyYcV%nX zO2ifDIi+y)3XxSqY5~15+&MwmlpD-b`hF*mp^p(!J0Ebbh9yf{=N-m!jXRdY#L#!bHPS83eo7kG7iV5I=G9|&OyS-C~Ff8+Ki!(Q8*S0S;D-FjX0k8Wil(b&S z`mgvA$8P!K?pJO0#tBs$ufvw{cRvTU7#F(=e!9PXw(JI}FrpSkisAU)uWRgPJa3HZ zl8fpg;Na3n;Y(uRi@2YekOGX_T?X*l$qvg9Mv`1uBGgr|*TpHCv-E5i>_C!4DYzku zpg}~r)S|?lWKAgIbo6K(C2zxhbbe=RMzzSx{(fIK_J!}Wqnx{ckdI>rl3Ep}m7Xl5 zU%fIk&0a_0UX=0>TSdNE-Lkuf(q9McHz1Mm_A0aSHi5VJltONOo7-`jtds9D+|u0_ zG_l{;R~+Cuu(|o72{6`U3F{Gjo*eb||LnbEe#hB$q+9%&FjCdrVOO)jb(u%f0|apA z`7IC(8BnmGVu}YjN#^~nG)GzeE^rz=V$`vlbNS_qdzVBM1XV(uDV);z9k-!Bee}BF zRdYCcZ(^h@Y6XrxGCByL3kE^t2Okr^zFnot>>+Hu<+vQ|f7k1IaqUjVZZ9bj3#^;L zM-&&urw0~@rTSriof0HJG`@Djz``s#d-~{cVwH2B`qRPE?!>;M=Sx)pO(0L6PvO(# z`j;{LFFEe!0XkkP0mhe@mYY4NtgLO%;okwCEP^c7)yA}0#?5*E@b$qua#C1fk7+x)+)9OH zhnv3VADp2TMw}nRCk}JsM7pkTJ#W3<_p}{7eHS{+Qfb6)&yI_tUXZ^23K=s-5}jN* zeY!=i-t(5yf+*UDHg@JtWl*o1bZfcZ z-Yle_|2LJ<`d*N(!|^{B3y-`Sm^AK4WDNl*ss3Z&s8zCaS5Vtageq~q=o(gH89m8J zxvFuFj2W}R&?m>PEB2sbt@vR?XP9z!#dydQ4h3J?dI9DKn;u~A<{QHVQ9vo;sU$$E zre*g%`f=1^UV{sHH^0y|dcfaeja|>XTC)5Njy;*?M|+138dsnDdM+-dT-c~B{|diK zmxslG7>`mC3)ASvR6vv|QL-A7w0#o@rUpW`y6w(MV3Pw&m@rkOhBYAS7P2u$U@?#5 z>RRt91`+U z`bzLZw=Y;yL!0c4Bvvyt)P)_5NK?U6A<58Vm$s)vTL)7@sG+LVlasmkeJRc->fCm$ zRe8OrUG;ySKSmYw^29g(n)MvE=wujCrCohQtLSVxMPW-JIJ)qhTw*HAfQj4z#d%5V zECJcOOUKd17U{|iF!ZbT(G?jm6!_SH7!J*yJt*SZyhNku&>28Xk|xNoZA2%zdfVug zL0G*1?bjkf6h7GOq84y~s1~4{3fc(;(m?6!6cN+_T#X0fYLJrX zm>N3PuJiyTtH-dm#$o;SyKs6wdfZiM$H#_`Kd#CDBL8x;`Tj%5Nhk&a;QL0CVVBnc zcemefkGnjMsi)0lg1>PXt*tbRJ?9v-Enp|gyMpH+Q#%06J$oIZNX40!jCt6>5% z;;Y||(VHX?MJK-)V@+u!-`cuRAO>sG%LS^Sdg?GqrpS}P3k&fPlTlH54x{p2<1TF> zabPCqS#U^ac~*1~7|9-!iMd+0#0-oWDJLx|5Y$ zn$~8zCP9J#XS6N!5k4VH0};@Tfy#C!C+CkR=Yf= zy7K*B%099F`23`I|2%}3?>+V5?fH%sKWVKk*ZQlvduvS&q0Gz{<=T_E?_TmxPqT|h z(s_c{pOgEN?m-R4-@t`nO z+$>fz8{xe@rYi9wcd|;EcAlX@vpl!)jc$X%;8~KnqyLP+rpNkEZpQ#~BPT-<0<>DB zk$aJwZ$1IO6IFn29(Hk^H!EOz$-7muxURSH`+N?;c77F#^BH)1btxf)*3yWHp>{x$ z9<|0Yxx|%6MFqpK+a>pP_|M?jzm)OwitwT5MZu+y6TR#Xehnm)3(+2Sq*+T~jP=~*Bdrc}TJS`kbNL%w=6@tF*$gMdgShDH|}ULaWzBl%r@RDh(mcze&c_X~my zRkX%jk?zi%YUu&3+^m9zs`v21ZqB9`_W-Ofq5Edu>G*0-p}*jz(ukqMY6z`%qXn~O zND98_H!+|8-;$4i@u*Kiu^Q6V<7W5C*>MErYi8W;C%Izcz7;;C&ePu`*gcn})TaqC z%~g^R2t9Nz??Y*A^4{ZPJzEdt+{%0?C48~#>hw2W0180ouI6lcY5pbtwfkQhf@%KI z=MUYX_2FO{Jr#~r5o3OYJo65nBwetTb}B%%LY6vF^GvJ0enpERj0kLAqg$2Qyn}Ov zUm1#17zv=~D4j!teI!IhpeZ1X4ig0y5RovN;hQ212S$!+z2*FS3q*w<9f?qlTLOqf zXo{3vm=1+wAW$zG#(>n#Dd~rya?B@u)aoOON1_AliK7Wv% zT=?4F>^D7$12?OCzajkiJEpR!nU&psTPM~LhFrgw9BACPxtSDCFj#-3hHaPE!r09*&^50Bx75_#ThbV$zh)vZ&1Y$<$ z^dy?}VZW^AmtUYCt)yem3DE5384kWGwGf!r2<; zagdKK*i_wpT*ACaPr>a2Jf>Q)?}D38Mm+bSv!z?d5kz_Hkq-}y-})OKU%VU@ku*f7acLwIT#{0BdejA zjPGvW06{isTnaq#_2vTT1R?^AfpCCb+(z2K(&G{OOlH>5pwNAx_IGMcfUKuH^`+H> zSdyesV5djJJuwisR6E;D3sdx~(F*qk`lytFSLvmO+sO}tG;{}>~4#v2a z6n{VYZIyTPcngl*YlAb3Tm+r5W{{R)&S23)QFa(20u&AlHJ2nCaTn1$I}h>@3ccgs z(XP6sFGy{YR<`wqie{q~+CXqqKv|Y#$Uz^VZk$~%da1k6Ppv~Oa9jzu6j4&WRx8=4 zIMD(@nq_8^e!Kly5H$+FL=RVg=Qr_Cvt{uaUID+avM8uwIZUnbL@RVKbo$V>=?fM;d#R2eaU! zgr6DW{4!tZZ+x^|<-&n&-+kFjQISHrIB#=zoOi}kckV*3%sPUnomMq}I}7H~NYYC0 z{Vb-CzC6DYTW=%XZ@%C)F8^|S$k#d#I4->kRi=SHvRmi*jTZ{}yjB`8!3V*q?9)IE zldQ+e6z-Lo&ne47_c4Z|3`K7^|s7au$0x}n}^URc!zLG>fT=@J4eGM2t% zVpU-+pp|4xJES0PLi>@0-CqhU+eh^JiJYW1b9P1QGrrf8 z-LKc!=WPKx5w6#mj-E(q+M`N}I~^Sq4{fNsagN@<-xP-*QLh^r<#rB@{qGvt1NK0d zoyWAHuINn=^`xLWgOyJMILX<+Ld!*IaB3obSt2l3TN|p%-_v3^AJuk%k(@+5Yh$+S z-80b;CGUpE8d8b|Y#U0DCD4O<2f@km1hi2c{R~k4lz0?(sofl1FfWcDE(<7u%JOq4Fd(ZfpEYPQ6t#B1y0xpxS48yk|HusRidTSk z`Elw4#~KPGiq_`Cln(PSM{aoo9@wlB$kOn)darO6KCRN;MtrCfm9oDcdwY5ccqp}U zzh)KjUngyqGQCoP-V9G3lCo}kEev-jZFgJ0UfbX2TxZ6ttjxS!5bp(8>Qu<@vy^u? zg?bdrrNHGRMeC0)&y}=m44?F-oGlNgsW?yEL7buD@R-N7PT!}Ld@+`cl$Adizoj`k z)WDMGErNfFS4Za{?9%GVm60Vd2Ud@hKJJ8YtLE1ojgJ5>ZD%!%}s@(kXdn!@rw?jjv4QTI{)CPk;3zA*hJ3 zBb*nk??4D!_(YqR;MM$hh5DZSdGiruQy`VoL!OVN|E2JXJi)%S0)F4i+rz-$lk?TO zyPQVnkqI7=1Fb{j2PVK*<4*UHb${VE(1`Q({{1u8#$E7xp_c@azcZw7T{Ou(zW!;! z@kn6j%l11Iec?ahJeTp=n4E`)L&K;y^4F;~`ivRfTmMWxUNpzXIvXqod;_Pkkly*6}0FIgqVg%*+Nm&8fvy^C(f}vUom-k4hOE%PaNwEu)*Y}5*U2OnS9KPf?R5k zOeTC>D&0`VMf=E#KV5RzgaxFRU>+JJ_LFFu$g?u7bN1}w5`_!gw1V3NXM;5tm+H&1 zMgtf@_-bQ^iq7YDLJiI#zbJ&Fm&fF2P3K0vK6?#ia~)LwWG!|fTYHUjte813Pc#10 z!o&4uEnm26arizFHBd-p!}A2$wD{HV(~yo{;M!wRYv-{$_GZ9aLij>$^N@HDJZaqO zW3&3VX3LRy?6S0zuX^7(YBWvL#H%^52*4OaqDci%j-ZdONUA{jKyj*wpjup);a+YM zQ8J0tVB|z79#0yGTwaD8u}0ej*Y$Oa3MP|Km><0!J?g~*pWsIS586J-izH)h#g_uB zkOoVbPs^Ln{l@1?>5nW`LC(l(oNJauz)_(`w*Q2o*6cxg7wa>FGrESk{8R^HmXr)# zAsVcd#UH^pSN%eM0K%`>O2nv^;*!ImeOEvB`ddEgl%Z@GIN!!+%s3m3BQF-!^pA$q zz`Welk1T-U`dTu9_~A9OT}~+y89E~RCpD-M(XojKR%zM*B6#g7*U=bt>#~9Pd(g=* zl7NebkpL-7-~YlAq^9k5ckeg+Z<7Z(~#ZS7F~S^!Au1u4Xq9@9OWY zhFiK6E?fWI@%8y<-qKp#`CR>r@k^QFrXTjd6Dy(!qX1Cb@)b3DaH6U_J^)_0FgVUt zbsdRLflMBn`LK-*W?}A!P@g76W=?(#<$9N-D~-sWJj1aG@?$)5Cp*6P+Y?Oq^%VRn zT(%FjQy{3Ev%_#;h~u@Sj-Hmsg~_44Pb3=^q!aG-KOZ&G!8TkJ!;x06TAVH_P?}9N zLssPQrz--X7nXh;pIJblTTqRi=d0PWk29!`?B1rrkD+0jm>i!yBV!KY<#KZIa>K@w zr_V5N_<;{oP>9!cel|-osy8vHxo^o}5a@(R)($L4B%{OSFxUvtXVBt7(S$qEmbJR6 z2F8@;i%DV9xf9YaUX(sZeJU@VqK_Hh`QBzeU%pT4!OIkJ!8gtpjI3%oU)%G!_)WGL z^~K<-BH^XaxU13MyIv;YQpCxx^|a_~HWq*`t@#IltF8a8lOUwH_#=m4sMk~&JAJBp zt|@bY9Nl6NKsIhd9gAaPbRO%*AB%CJR*IJ^EV$TIvqjbvGHU;RsN3lHz2p^ zUX;aOc}(}Ir;@uie?-Ym|C0!9>>*$=Z*f|Fc-f{JYd-@xsyb1b#|;9>;Wn&p+6Erfo#gRVm<9r&GL!U#;v% ze*J@8ZlQ_vW;OsK4k04qXqtl4jn|K1@p(JddZ}3ls6#W3?L<1_1w8vzQ9F%OQWAj< zX}WH3+$#qhPZ_4H;u4b>23ihMm(MTz3MvgbaP%e-WF^jZS@ zP?|fIKKYzgiDED%Vxf~n?N8peyGX=C=>K^EibpdPemv>(^c>1bRJD|={gG9GD#wLl z9W!DcyV(F?b}c^+Wm?B(A54cw%3<=jL^Y=Tux5j+X#qhX>mfCUIg?gZ1s5C#x1hHS zm4Sof$2~{B)J$1joVWC}Kv2fi6Oj>De_@SR7`sgGF&98*C6 zwCQ9L)sO%66NT`~6_R5*leuAILO17;JtUF3q1!J_l(iEHu7PAMKsVhIXfv9C&=Cb&N^Nu z3I3HZ{_C4*)`)QISdSMv5p*3osdpW8ujN|sR!i=F($~P-#7lw(YWQDa^BA??#|u1R zZ~D9?BwQ}vhHbq1H@+l~oLm%A{nsb52H}v2m#&n%&D$L{QDOBlz{ZdOib1G)GeeOJ z46*s9!ZKi2gTe9P2wRUVk1{&uHUsZ4KCMNrtdad)_hF4!o`7JO^8yU)3#*41N~g;k zvdq5WlZ>WbxKu*cg$$YYZxZPw=ROxx4D&A772|#Y#q~y8Xp`Ctq^0ZKqnJXWQ6RZU z+*zyd5|WAUWhpG)N0}C4s5VwrDKs56fJ1d17Suk}6-0_6ypt5~4R&fy?+)_cyY-rT zpP{M`4<`7@%O$JCeR51m(w~hW^?yy6hv`7sGydg)fc260GTL7iz{aP z;Y`hK%s%{nhj#7y`oQJWbHfwhW4t-Ot>D@nu<_^oi*Vz#-Rg#!*oV7!@#iAFkF&Tm z7|jZ1Lt79^=L@f;$I(X9Dy~d#B+m43e2Hl|qgr-ii6|oj!vnm~fXT#W!fyFG^n=s> z!GvtFDq%c@Y1MqXc8;i61%HT%J?0IpAQB)+ia6q$bSwA}?KWfq{SYMyteKOgmII4r zqQS!0E>cy@rEu+SY4Fqx6QvkDVFaj*fe=#qHVC=8Z(?5L5}O4Pa5i3?7Dxii#wSt@ zHL)h6=@RPVeVhHTrKaKw{e;uta>kp&8$R*sCmQHc6;;~C_lry@dSy15pdnuqF?j(V zT9dxy9rBGl5~ZIjJr+8M9y6PrD^~XdSf4(dW&aLm7-yQO9Z@rZOzLh_t?2|4DEDjd zzNFIwbE^GJJy<^eZ1r$(;^3#L!!pt`zl$OvHkpOJGwQjt>uJa3kMqXwOYP)eCZ=B8 z=zVwHJO+1kjo%FVmKxpzBZogsFMYX+UUXP{9P+?7O#1oW>4aE-<}o#g)0CotqD2A9Sm0A{hJP-}$qG^KfvfYcI8Bad6_Q0!@1JDK`I$H%prBs`t1#B{4 z1$3%yDvg60fSgsOSh5_>kpmw!7!t(R0;OFg9~_HM2__2^gtRFyqbJpb4+W=utVAHf zo0VSJpRtO;14sQBu%i=)?piFM86pY|;r{#kd!t|d>FGYcGp!u7J5KZy%Z8b7i)aDE za(x;DiR`n)O*rht(4naPCB#6M#y-xE6euKMqT{9rM9z%##5vL;$;7g7Z3HoVXAe6x zo`9R*pkVIRINIv^X_%$IQE(|kDyT_r==#q)K;6QtZ~R^R_8qHR-^Uc);7VKNN!Ehg zvgFV{f@w76Wcl4uwH3NhM=2K|t5C1{kew%$vlaM z`Cud@jIADV1m26rjEs!tmsWbfrUWKpjAzf?34>>5x6Y@yDR6MHq76a8VoXpfCKaa- zx#tM8?`6RjEE)?m0#}%_Qknm?J9q$K^ywCe9%s?Z%UIx~T=JyKyM6~A%4mFzO6RwK zY`aXk88m#x)CCcbM|+p9ZA*t1=jKr-m-s_2C4&L7D%qIzD<4r7IX39UQN-mcwY7TH zcaW8E@u4)C$Q) zk62==f=b@ff01}?hyKgb+Ya0B-n@>yu}qeo^oVdID?9l*0`UUA6gbk$X#iNZUQMz^gA|FJF&f~Z=g1SdjdiICMR z70+Qwq5uXM4(G}zZc=wneFV5%zc)TL7om1&JwYf`wpx_Gk^dhN>oE0yG2~swMUY^` zh@EKu{l|HpSJ<_XJW7LwYI9YAmt}x1xFua!45a|6K(wK{c@K0Tl_+tb#GVW`EexhP zO1dhnpi+$vRS(n-t!kWHnVF6cFD5XwSdkNMo>L%@94QAco>+`{yNc`S0LacQL{R!Q zzUe1%MVz^a+9dOnIyV0U!=F!Bl)P^V+6h9~aFHJS35Ml|2Zf4`ab37U$=LpMs|TjM zpkYcw} zi?t&v+=x#crcWL7l^?f4+81S7;a)9rZf|!!L4I#`z9hX@5M%}TjiqKEq3eL6>wvtI zE^p9miO$k?!jR)}K|N#0AQvycR&5|BW?y}F+;>t)pu4;pW3(xCZ4pIlfY|=K{R043 zo|f7MxgCpaD(ukfN(kF)Q)1&*^~N{VmlAm~tO{h61%g-NNlWv>3~+|T5s)M#bU8Y4 ztK?~jfhZ9LIf#jm5J9msP_6f?`*;2O{!B8~XcrH^22hmc zAgd>-0w;sl;r+~?N*^}@t_oLD^HcJx%)6ZTy*vF+u9&}55O=iEcm@X*Ad3mu$K=1X zRSsZ_`0XEMteUY-5}@&YSG|g{9oO!{l54OCeSlc3^kMEn}fhN$L*FJ;?1GuMr>c)vx5T!xwqqmkA9s)QpMI5=z( z@zUnUxSr_f&##9)fiMi4V$kP$5FDMxLX4h1Mdt@R-|uDS+8uDU)@=URFvITa z?(&>IQbT&~D&^Q>@kF|dGLql3jqks+?e_%8F;MsY**@WW_sBe2emvDW;oGB!3|O0~ z@bz|Wv;Kl!0fZVm3<&R1TE+hoHup?5&dYjUOYbYxu57)ROYq()9cRS1aQ48WjW0|q zLPC~EA~FFbwGh0+iK@Yn6zvf^cuaMGQ5WGirC8EeHAZ#QdW_luub=olBPrB*%{uRAojUP&LAjSlnJkmrdCa$&AI^utY8>S=j~Z0m3H+eiL0dlhl6zbN-0Eo*rps=40vwM z!H2wmd{u7NEitMMLtg*gO`F2y@l=^GIbwVBz zqE35sOAf`>PKgrw+@|xyjB_*VW8p^MH#7HB}=sl+$^+~@DKc;sjo)*Z4Fc_(t!iM-j-nRA|nET7WO1AK{ z!Lh(N#}{i}9&^65G-biT>K&hR!z4y6NIoy-H>)T9qjq(m;uKqM)&P_#J2ieJr+V>} zcL6OiaMU_nqX{$zv5_ExGv3J~r|I`#%h;CG5W11|Ar&?dkd&wmo+MH8dfqBk{PSth zMSm1%P{*mNpqCXW4^6~jn5G(<4?W~PIzBlV=J-tqDS>l zKcOQM(t+M@U}4WiA=!A!2-q@<>WYoirs0=japWFy@uZ!D+a=Gw|Bm2|?~eO%zmCL@ zsaK6vzM#MeOi85bLWvL%&Fi*1Ws0_*)?U)SQ?2z-dLh`xJ;<{+6EgQ5;7vW9rtJPO zo2TpM9eSW^Bp>S9L0E$a*E`78qa(TkjqU4&atj8b)D70>K zc1lL(z_3YF=IMB(AhvU07N9AMcq+N1nA}E-xsno>_!z#?-E(MBmoQBV@6K)gzzLntm);}1?LU9gx06V#rj zfzUL&Vf{0;L#s_(STQK~+KM0Mmfg$w)qx^kyhB}V2`iCq02VOpAv1Jkw@P(u_Y#laO>W9sY#uok{>CK7mYBirc6m>CSVIZN?<;{eQ>+F20zaGP z5e1B%Q%gMa;>g@*{?=~PGY=&%|E?hC{T_gGua)uYQ$3ak83!k7ld9p&&}`XbV)nzc zk`x(nWs#ou*%d$$1IPu??z zOm(fgqBuY&0mKsXBxZa!WheGDl5gjJ7_v*eV#-YNux}8K@0zqa7T89rGBTbgIgiP* zE$zr4vgGX0gAf7##2pdaRBS&dz6eg4eA08e!x&12?$rGsMK(w6Wx^S_)up#-@Odi34h>WN9&Ds5|$ zk$=TaMns)zPehL-x)k-f68l&-uEa^CXgZKw2~KFDBHGbXm;hg{G_Z1_1TiJIK}JT+ zAQw5KIL#AYc-yRtO#2}|8@7yFfXXK9oQV>s3#^}@vk0=tm`(nj%{N7$q&kaF8*lO( zzbLIFySfzhM2#tls~ROpQBiU0VGx!;kaYCC6I z1PsSXIsf?a*w=|klvzBDL<}FvSuxvT2S@LxEO5oO&F>d~H zs*j8u%}0>MGj}5;)Fw-9!j0|?4Vo(}-{!^YrwguvY>cS{^`cBGiSeMSSg!I-ho=0L zFi@F=nXcINHR}Oz6J>$y4N~vQsju4d5?sCz=bg$`&4^Ch_0KFvNZR)QMvI^PQ~WDg zg569H1+oxrp)~lWvi9|zp2xaYxBa=_B>ByOpq3TAeWLs=Q-&3Ga-D@jLzV;ER$Jfn zj9`06ADTWDaPdn-=zo zR|)uoK>rih>-+oIEZpIl1)m}pEq>H**Hq?2#Ei-NP0kpnWL@=$mmz)(N1VJuf=n76 zR)x)F$A4j$9?Lno!xxJ^V(|gzr?W!-WM1h|#nJ&WG^<%B2`Txpy**wd*QfKPE^F*~ z;oDZh+Z!r+L%Hvu(zH3Vp`=0*X;SthK@>fDTT|0*6PV3OjcDu_H?2?29Juv}v>OUv z)5q!YEyol!cD%d1`v}mi+tLn_)80+`MBf(Wnrpf@VVpOL3Z{B`QYjIf?@&*)DX=Cj z{AyyN5Du0UeB9{cHHA_jU3w#5rK4m_`4a>D5AMEn?PlvcBG>FQCWugl+{HP8=(nwY ze!N~#*XZL%r-r^OARv4F&>V2SMe?@pvk~y$O(lnj5Fa&at`=KU7y9TRhT$U{A^r z-L~812JJ~iyyxq)H`EiS(rr)x&;zl*=RAcx9o|dk>+@N^$zd&E_1AaRdoA9zZbsW1 zxgvF6&7fE`Z$^x{M!r{^_+{p6hqw$8^KnI5;GgSfkPa=eL8gnYjkYjnuD&n&vPKV0 z=8y4Bl-Ep;Yzn_aCEn~=fSb>fpffJR zWq$^iDjM}|2Ybgq6ILF7+~4u&5=$|pJ(~Zn!>^U06@qe3H)%RVGT@wMvs^rs3iUma zfLeadO@W@k9=M)l*5Ts4kD=hTHD!ngMToyK+NCLo7SWNahk4Nc1?w9?a!j>&U8v`9 zy#0qxcQMa`VWZFXplxE^&h?++2K%^p3SqB3Iy2BMCuWia)Q0P8=gs4()9#Do@baPY z-s0P%v%}|ViPR!Gf}C-jVdyLj!G23>0L^CLi3P)jn9d#?6F463&H~scDtx3aEqFoMAlRo&W`ez|zkap#C>AV1Zo)u~6N znx&VFJ_-?;>uI-z!tFt-^${L~wc?oC7~xJna#|fk-&H-Q*6cZ(WSHYsQR?o$RZSZj z^e@!!s+L-=d(Dw>U99(DfA<-|-daw0$>(is4ihtl6|QAQu|B#?CN2wxrK=Smw;OYO=>1hx-J@}huwZb*9 zIRS(4V*DUo<5F=GYmYElVCC(SfpNry`k?#(#=FsRT$)G>QCursS;^@;iv3A+DpQuy z$%IE>8J&sfoK~WUEDfLYLh-1p0~0fJ9UkEsvjK@fOQ5j{C8uEU@Qp)@10V%iC(aUq zc`vE{VO!kC8@f)JGp42Uo#hBhvDAIK-xy95T!01L)T&e7$E#wepNvFYSoP`-q9u$4 z+A|-7Te^L3u@$Gjb5&ST6O>5P?`7G8R9>vY?ymIt;^3}N~WXT)x$NNVr7kFpGMV$??1e07$mD=;u1$u zE2=0L%v4Ln?n1~R?2|AlDm0r=D);GHqU&k+&#OP2Wrv5;dYiomkNh>aMK}PGLjeio zA4L}GO(D%>1u|P|1kj_HI@aLs_hUmEqG~2Yo)hol$CA`+xw7frAvriYqK68YV?=)FaxpXHbqGiEuZput zG?nZfC6WYjlISw7Ym^tJYpXIUU}X@3(=@9nFGHUYwph7!JYIIRcm#F-qHN|K{-+(% zxqse4n0F!YL>=|xJmA_@M8|h)^Tok=_iBlzaTkv@K~Z_`!gmBa`uP5O{QVmVX}K~7 ztHO+%Q!@!14=*PxU#7i@$+k7ZU$3rgu8lQEpXv2a`>L}Z{`UMg31l`T6VZ>B_ur{8LB~ENFeL=-ADO z>DHl^i?1*2C+mP^>&EaX5kvubW4@-~!mnV*t1_FLHIfwbqV11*=PUEQ>nBU(ucu#s z#o%J)QE33TeKM!&Qqh#r>p~&O(|D#+=B_e=&Ggmgt&;>wLr*#9EnD@*se{}{@;+%BIc_lSGmiSfSV1Eol-eJNjXs2Remk(+zud6r zH%({E-?y%vdpj|OK0-x2km|G?q7EC2KQcWV$FF~NW+`5uzQ6nnpn$)Jl$&s)*CE!o z{c``SzX~jd&pWqM%`it_1rtJbn$tVIb^ z^~w)mg-pZWgWz>!fu#j*{Xz9)_*fycE{Xc|pG-z|4?~h?(MKZSKlWx7_KQeA_iml> zIpp$%RMQ>H(FcvQg1i~jsw+4MK9A}&XQn~GwM;e+I7L-h%-HCkt#Ej2NZyV`o}YJF zl>G1eNwMYc2kBG0gu8Bc@NMn6&boG7)}AK6n3`Fggr_wglIWF((2hEIg`GxVH}VXpAtH^9gt}c^O@!=oCEK-ntrO<%~2PL-)|pv2Bc9 z;FF$@E3F{H(yKE=u4FRBAEIM;PtQ$K&)H@EHi&xgm9#EIjIQLXl7ZLHPdV9{qTSt- zFjgA`UHdE;k^>Vf$MKzsQm+m#kf+FbV1@v`E@b|)@!gGcbA#NkD0eS`NI(dtONgky`PY~>{}DY>73JV9E7 z!2fvxZohw~$Xa>}V4`^YqjK4UAF#Uoco1@T1IcM2l^GVn_X+xc0rxow#+VW=&*3ZI zU}I>=$C0LWj#4d0b~c>`fFpv1Urxeh)59D{P`?BnrDOypWO?=$%_ak!8pM zIPtW`z?3DtvsJy#^PDN}&|9jaxr%cO>P+F1+{vViA{a zwYBvgK1g-~v7?%Vqmt$LN?-Mj`+Qb_TIU7M39R#U6^63zJ#;dF+1^Ih>%j)<4K0CO z07KA0prc5pXJ@hZ!V57qJc4FkATAB-46Uybq1OsgYY1!&Ay*0mYmj({z7i=FskDX| z^97TpcV^oi=1GdeIpm}a6p&fNPBOr$6DQ@>Lx(tMw-H;%Mie0u!BD-1y;oj={nuQB zvB^o;EMuAHFwW6eRKgr#Io}n}Ts)n~!z8a%z@>IDVA0+Nw%TYK%dz2M9Ju)=sn=q3 z*Vb>ip*8xo-#&Z%*#G0B@Zj+HFGs8-BO-uSXiZLH*S@{3(Hv4`SuisO9uTRd$s$5g zM4gmckj`?bQIjCeC9D8>n$sm2l5>mfE-oSK^^rS=EQ}H;ftwOscHF@UhgV(!h?GJM zN`qisfEpn>Xzav>W+3R~L@+Yk!d2H?i~HX7P9C`GN}APmm7YE;;w)XHp_GEs3X#^R zMOtF5NkD8BXj!FtK?|uXfvoca>jcg_Mhw4WT*-{JQt(=#R6(GZL!5;u1ECj4W2lKe z`!D2M-}O#Tj*hZ_`Yin*@mkRm&;=lDG%&qy9~Q2?hW#=}J4rBb7G7)WNP$Xw5_gGs zUpj{po*94vJW>&+-b<3_==6F>20cd3qZLJ{D}@>r=XURw>+Zgr*W7;}hQ>zGJ9V1n zAb}BK>K#f567lGXN9Mf*yPLlo;CDsjwGkgOPy%`(#5qLJDuPEO3Xb8iY4TiFPMvc3 z%Bm3J1KK2PQp7WY)@V*n;=sYzU}Iwgc6AlrD(DJn7oml~ z1t~f-h`J(&mBwfsp-D2<8iSP;BxldD?mdR1h`Ec9Sc^e*W2GX<;gu74>zCG6I=9Tu z|5U8hyRCSZiYTd2dM{a;(w;p_CqP~nu)yZGEZ$$J6r_8b<9}XLyw?y520)=Hs$PdR zhHH!Gu-)E9QWWCP-x4BTz#4$*v2oeGe;>xDr)i5)%5D#?Fhpr2Mwp%(@l379zZmB!w=IbL$$0QN2{NHfc+vrJ0wQHG~7wIY;rqSBQ4 z=`)g?IE8#^2{DPN7DG4dthHLG*J3E8B+?pGWa*qZ@2EVW326v145CGahSq_trIm^` zr5QzN#u1022*a_KmJWX>Rs;hZ0w(wqQF$fdih}E>&Y0fvvd`MvA`nHRMbX?0>q z>o-kDv5absF&(ohBE`lAx+hPuclxxXn_F<+q4b`KwJ5xk(tBjyu@HIeskN2={k6O1 z)idiW`M#my-`7-o0Lc{C6>wI(hcQkvXE*?mQhxCDqZ7Sn`<=f($9mt~etcy0vpv9t|Zc|Yb~u>gz;JpGovGH#W9fQlII0Fd4VVZ=1_=8A<}VP zKA8^&x3tsjvIKNPq(lsh zo<1$F965%x+Z7AALOh?@T>H(P_wnvsyWiac5ercFf~E+fqC~#5%xrZnsA2`QB2v1b zuGrc8TJK@K|1bbNwYK8#nY#dwtuCzr_~G+m5A%CJmy`Et1$rPUA#ZzN>GYX*?cV>b z2c#caJq-Z(;rade*z#$4^ZfqD33*?d=a8bNGo85itQ7@H4UC<{B8xwqEG16+;E+3g@H<)EnXv z!#al|9l(l+2?hJovm0v<-#$Kxr#9DvhClx1Vd$T(oW1|v-FruCg0Tme&zu8*_w3%! z|G9ix{=r@0$5u|`O>_IyBP*vr@}~KHAM)UI<*T#w-XhlSgj$?9s4AyyWZfzm!_eE1N3amwHuf)+qJP`QkVO8Qq zkQpnRE6X_a`A1Rn9{F~svUv$WvaS?L5ft$3i$^TNT9wfiD_}C#5=Sv25Xw2Ul;ZSo zOP1SR)U<*L(RQfOhxLsBCP`H^GUCJs{A8>Yn~|2WW)m|Lb;sQ1497XSLz6*)eb-#N)ZI%LQ?}Lp2iq# zFE7Jci><{)vDP7qW5fVdS<1}h)6Y(gjicPyLd}I9xAYFF1qDWO2#h9FtA*C| z6zBFVh&gf;X_~^O3BzbbEC4*+X`kN(1}Op0_sTyszlSlHG|0ibckj~=ET3`y8+z$~ zP~Gt8YLKK_U_k^Qc91uV$dQrpi4T$T8Aa79lSF(`fDF!*ZoiLwFo1@j0ivaqG*qyV zi$HXvfth`KarxbM!!U*)ojWV=zE8a!2o8EAg;y( z2?U*hO+24tV+CSFD9(!a8Y5n#=^c_JW#`Nppx+ail4X*JGo}*s5fK#}6@1WJVbJg4 z)u*0@Q7UQ=`t%TJtt6sCQ)|>9OwKKdHy$QU#akD~7b@5=DvHegZ=S#4fTFr)XlQ6( zBaX%9MJ>zxvf{!EYyZB-x zX^LoN6|?hmc-xQusGNBId4BbCpNG$KdJw6|BjVlTedGU&vn4EvSVx$gosp~G_(q7a zXfH0IZ=FQqsepYqOiV^~=SD8rzyBvLx$5fC!_R&FQzCMx>L2j&m2*;IU(bL2>GJ7s zUp901{C<34<#YkyC(obOy?dX%?Aoha<5QFJ(lcMd%83(D-tSD2A>xDeoWxGtZG@n3 zXi!OQY#h7x??e0OF-~ZWUZll(QY%WGU?C#PIf!!*3!2iR6b~&5gqJl33`o?frEwNI zne!$*D}r2nfQbnic?Wn0?=?0%U1_P?=#ZEsp)qDX6WNtIhujNnkk?+K1ec7Cjbi^r7s&++ zd$4lkD3;HhkzQHQ1Q|XE0X^c+E}nQ4z@zsq>|2LY(^SA#f55UdSZ{aWtw-s-?Ad=I z-twOJa{2giJo%Z2;Idr4_V^RrKDQ{&Iyyk$9i4Z-^Wo*QpZ&nX{{Iriu`tp!ro`Hb zlYH^BpOeiqXW@zhN`x^W5y;87wyEoSY=|0HU3n!AKlSv_KlK-X`6B>6_8rk)VpuL>)^FF-)yFL%|<6)dWBS4L_D1LAO$j*>7JU$&ntb{$OhbS)+9z!DH zoQHJ|##;39f=lgf=_VB-r37bBuQcc+ zDMyMz;JlR1NeY?WE=zQbLE@a0-Z40o_harWc;uTZ`yq!vX|T8IC(ast&(*T3!RgUJ^^^;eBJj$)uNEjO@;tbNTViWI$h4{}rwzm8t02E`R<=%rg;PyA(ji(-Z2uC+J z+1=h2RdwJtAS@A8fd@lW;=4Vb{L<3^fvn#j`JTz?@dw+Rop0-4dF$|Z4?ntt0E7qX z@4xVhv95Ey2Ukw!|8o8!1;9@uOu+i>?Vn2rgWm%QTNHtJt~Excr*Qi{_t2CjzWT+# z#^&-eU7)F8hs+W~A%>u1tA(_Rpobe6Yt(>9(~)ReN2ECh)>12lSSuKwzJ z4Z3_ zU-X-Quzd2De&)bc_|S<%0D#AqPyYU0yY?Dt{o9&o5fnvIM>UL1Pm78ouwJLrT8#76 zuN}OjRAKpAR|+W=CML%)F*}VYQm|v=t@m^fW>`_*H z1|S1K2YzIHZrAX{^vpYzQj!$~($a(-st8NcEAaaT9;FvC*1oWoKD4~ zk{O8)O!|-hqkM(G{J{_6gCG1Le&vVWdt0j(KXm;~2OGU3N1>85*5IA58J;-xTW62G z@QDxo7C!OF!_D^Je*KS>j{dhY%Sey9g0NB!U~_ei=Z+s|dt(zxn$eM!Jfq5$Q5sq+ zYE8uTIxaY{AJ^P*2gb)HS+1QTgI9HAa*#8HGuYt)sJ zR-|=PM{FpvQLAzH{5)R&mbb{{P>bogMS&@UpU?}D=h8cSj+?I@$6&jI)H?PmW2#dW z6~{_PI&)smmExCkYkp?o!i&;gXZ!8WSR8ro>+G(rhe^H{3^j&Sb9flmL$WNV6R;2; z;^CA+Esn_we%nwXozNgCT)W;&B2HC`3`8U^oSNpXZ@C{=y#BRVd-)agH#cCcgPd1h zguzz@0}RcI_ejIy7*2$(Rts~xcXMIS-bPF|%DmX)om(iARC?RnOa=p}YW-HR$%2$8 zXx@Ilu#0p$ItvUe)Z5Re|pDv-~at5j~vCmDVyfI*j4bQL$w? zmJE{Xw$lUyrB1x^wdWof85zd$=U)()q^yge?t~MKIxf2S61n*Guj8?=Jc~mwyeL^R zfCkWNHZeLo!=ZXZl5Q8hwROOUKm#M5J#o_W4rRy!1_9Ke;IkYjpMD0LCr_c*Zi_R9 zVOAJWThfaowY za3B%^e#8=Ad1&$U4&7twb-U(9zr42E+c_{lJiiAYTRHdb-B^2aheLx7uB^3wR`vR` zc4L#0CV}oo(2&K`{p}C^=O2FWM7Q1klk4B`IvE)o-OD-LNbEr3JbGe3P6onx;uYqx3goF*a%;?d6v=GM`PFov+H zG@Cl?=VGNWH#xzpFS}GOz4Q__9BI%PMi3}t5oHCFr6uI+n_>qEAVMQR=EEDB1MCCn zP(sQ*fm*%JnVA`0d(%xEuGL|CJyFiV3h2DM*5$c3X{NOEGNLrbKu$G=u=nb#c-4LP zI$Ebzj~?Y9%czv%@bnZ9-gzf(yZ24ZJ6)!oE|WZG3SkC8CX(gODI;FHaIjcc8nvQi zy19k5lPA&L+M)*mtypCSQMh9kk$&cVJriH1;#X6VQ2-K?9B(!;#Rv^!Se#v??RHUG z%OcD$gMwoR9SLX${M2X8p8WW+?soRQdoRM#ZeVzvO$G%3ylMUdoEY@aORK)E8|xDl zC0T&arDb_dEx2jO;9Q1-{2l;&<r1S`hE}p`YKm@a3!6%d zg@R#NPFLIs7yQcMQ>H|=>Vm1*c_bT~sPzZII%Tc6TEt8sd0x^PCu5_dR7ykT1$>r6 z=@9bWYSeMz+^k%4^G#g1@+vv@#V=5$iL{LoYn`%b0azze+UgPLodYBnFQtgKK|KoZ zDd!Ev1fT6XTrSH7C0!CfIE@!6ZRq3`*~X#1P2C*2_f{#F0`g0VEJ%GGL?>8uc1t9itYA z&{WR)PEjOI@XKG^T>VXq4QX^!ck#&RYlgJ`TEq}RRrC|~PoKt_bBltqM6EC!qLM@$ zj5sIciWh$Ypu1kFUwY)+nLmEZ-i!FzvnS=RzJ;s)(UqltJiFl?a~I*@$b@=e<>X^m zk50ZDz?1~=7YpFU-&{WV!vJtB8*J^3YQMa-zRtCCi(=9gv4BI~BRzSFc4ZA}5JY`t z(5UYOg=&Josvy@Ykw$}RXjE%yQel`x!&1gA*jyp-Ng22ZVMO(j|>YNZfq%|^YBT2zx-9I;-n zNpozB!=s~M97|f3V}pM8flK11UuX_RFZa4jGxf%uu~Pdrh?r#4SVVal5^N#tibqL` z(po!_TOM0m`PXx(|JTPimcMfEo_*@!bEoAy8r^$nu#Fc6+X4X3_qTuN%F&4zEb*ct zfBkosPyXzAz1DR%ecA(;7kLhE9W}`&h@sMOC{3ZW3{f~EEC{$tPAtT))48EIiten} zY7z_30ys>?Ap|YDc+b*#Cf2fN42{;9yX-RF_4c>%@`DGNudLE9Ewf=P8*zkMvyO%$ zeXob!nX@c99Ta&!D2;uzD9uBKG3Vg@e=nT7#|Y}V2>Jl~-b*fisDP}CQg4Xjcq&p# z07VaBBm!{`&KOpQ3Z?VZBHY;?gg^H?g)WUT>}MG}reGJr9R!lvd)j^vWxK<&)1f%W zcxZ@|yXQGEGYjV|`$?*7HKU42HltW-QN((rF%-vW)?!XH8kn4z;QYl0aM3L{LrN13 zdi{MvQT&Fd+nfJmxyU^LOf>3;6!{aZqVDwn+Rw5p4rM*&)XWSfXJ;5U8t? zT>Ufv9Pf3%V~6VR>9O9s`v6|(Z{zv?_K~mkx4-<={`UDh@t1z&y??mp(o5dSIFf#^ z4`(g35OoNffHXy@s~@ch2@W)sD8YNbcXVXzw!QoJ*Dt!{V$`FUuAiXhz0^qRAkJe( zk-h+Z=TKzL+eBaek;@nkzeb ze*8CHdHFrpj!*oN^)jD{mn0Yx#8$H)QRM6+YqQzJWjEc3D{i?3?Gq=N^tzG- z;I7o82t!fChK^(?j@XD|v}&;o$1$5jLo%^{AIA6X!^YAg+FP6K7y14Z{oV(6-lMIe zSe|S&?ghCgB4NZs8g;lfYDxnjL#|ZLRyymI=KR8%DBx|7-8!XaD@; z*jig>SrkpY@RsD(pos@SxAZ4 zX%Uhc1bs+|)b$?yb4$`Ww=81-TTz4}j;K9h;Ngn!qUV){$_mi47M-%x);dJMAB#Yo z_fP^_DilHNTqQXOvOLGJ!-tXfI!H|kQ+fH67kWB45$Nh>iU8C=%*@PSe14AYc3aj~ zSJ}yP2!y3~AhakIhMdj{dOj~3RNv>l|8x}mm*S0Oe)K3bh%C>coX6Dc3|{l5dw9{6 zSIX0${1nf<_!6?R1S(XLaUM~gqwI8$iJ+Zl7!-x5NQ+I#`=H#$o59>1N--FjgF5)8cmoyXZw}Ic<%IBBt=F&NTsec8{#Gb{PP{G zZ@jfumsdW!zPkD@@4fTJsJc>CX~sEuOS7ggR>CJ#6p0s6;+)jQlU9kNV`Lr5PFG%j z^s!Y6=lk6b@-z*p>ms1DU>rl5LsDAHw8+IfPemdL`#@On$gC9&0I{a?9(h?xgJc9s z2|+HxGH@P5IY$MeH8M&?Aj=DgHOK&nco^@{>-Eqd3_w7fwPeth1^t&mEPN2$i5C%Y za(EaEb8|TO_P62av(KW}Zljy$AqhfjG@4DsO2J#lvdG1Izi&C|@17qXo$BWKRs?Va zN}3?GgcubQVp62hXtL}NV2eVGbF?8u9ChbWYKH64$tj1|ObCg~sr)HXA3LGjQ;`Nh?> zQ<(d|IZnTmHP*NK`rv;GPS@j|%}?%ajsB2$KdTiPE2XvKj}F({iNhiQ02%#BL_t)d zOjCWKKHQ3jrY5Q4So{ubUMa+6D2U4v!55fWN8=pmg2Q-bVGs9Rc?G5y7GTN}gET|# zJxmoePj*wbcj(0{FxPG7gl~ruD+Z>byauGz$ zCZ=X*vFm~hSSE>hYw5zYeB-Z{&U|d4IrP@j``rRmd$;gGNW4R8Ew@)!arV$F=&h|G zPg0JKj$m$l9Aot+kcI4Q<2|f+3id(Uk$z}snjhM1>4x`q|{>d?{09@}5#7Cg_8csQJKIG$+RjfwwzYMQZ zWEoE#IU>hie2Hb63M<<^q+%KD-e5@WjU2E4NI~UZ@1WkU{nleEgZM z^1ivQ=U+#+hgn^S`@=yL~`P{GWythBTdjWs6y!ahY+5NT- z))!AK0xh6Xm+r_=t2R=vBX$C1jI`pIBlTEDl|r1Q&39wL8YN8h6(?k?8+-zXDHH3*>vuMrC z;Pk1pSUh(QWtPKLZs|17ar(%s=&WzTdyj6ngMLw*7a_*yCaL$9FG zXdp>b*zj0~6+x#cP&fx2z_2@kP7p7!S&p7_=yf{q#==;`ia7Hh0leq6GrREA#@cBB zANVE>oO8Drpp$~mDWw%4WtPdx$}*q%^N%4)GGs{#;{{d)$FvcTTD@Lea`n~q>u$OU zPcJSbUtEC=UQalBcz`Zg4`2WA^779E_>FJ%-u_b@s(%!N^zQlHzcJcs)ppNaAPWn7 z*;`shwy}W*1WghV0VN(v7@~Cv#8Cv*tf3J_$YcwtDMOc21*ja%w5tpvH|!c3(HW>!(s{ez#CWgh0eOx3=cpc2|vpP{zO# zejtz%@^B&YcgXS&9{$=_v3Tql(sPT*@(fx5Wgtb<(TfcagulW64`1K*!HSf+x)If| z|I*8N#r4M3NF&jjlm$x#fWffejcN{cVpvAUxFwFCly(^ zDq;ibRY6mrNh*XTBMCO^^|#fP^4eOpGn5>TBM!$g>LiNoEgpIDZ_r;|2`o$Zx7fTV%;TEQ6W(LKj$@2Bny68sEdHLlKG$@I;AjJh{EC$XkZwLB$Q=& zRYuGR78YW5a}&=fD;M#>K_o^-Jf{n0))*uW6On;Io){dacp}LxUHCLDw~b1{Ro)m* zf)UVs2!uj7@tkES2n5vDM}IA>OqMie2muHNYfvO1Sn;%WgJS8qnvtuRHI^iD$~r2i zEegf(X&Q6@C4nFoELsd*2n-!Kz&@o2t_w>k9RT_|yH5D(B`fcYhDScyR9uScKoDJT z?mM^Kb|EzlmgEgDN5-$3ZtrudYF9GULoP$}DTW|?>(?Vg--9Q!6m!9FOe<$eBwzz9 zNO{#ao=m~IE#dHWAFpp9$qv6TGX9qtSeEJBXjA4(qkV@dF*J-Bj-p`JfG)I?WGXxS zxz~1$PH(0LfEyPrVkrdqf&o^VPI_Swb}9*%$OMrqbRDHNH8|z$v)DCF?BB7ICkF<- z+Pz^oHUC}J^PPYx!Rrd?LOnV@85>FuXrL4uU>mU{$1ItfSs zej*N#fab}Dv!4VxMC>P`kl%loRI2TP+kWuc@+&S!?@KQu@!A_49~eT3?NAj6rqI|? za@ENdRoi|Snf%4sRke6wa_mt6`gt{Vv!5Cp8UTQcXExyR(P22Cn-zF932%?MmzVL1 z{z3TIv*F<_0C0YN1D**F^Pl66^}d`bE^3{HP5ohKVR7h3(sAoKYnp|Yv$at2xnJ$; z?s8oQQ7!-sk(J~82m-v$EYtEeD<*$fxDj#x5S_ zR8=Do3c;`~a$Gk|LWDFTp$noC-A5{wfiXEnj%~BdX>}Epm0Y{yx#w@HsIK}b9G9a9 z50N!AOe&RvvYlKG&huxML?uJn%)R~DG?rD>qCcBPZzh!hfD3Bs@Y}I4md&iki(}!$ ztfJ!QS%@zu!ld4ULb?S^ANc4Q+Gv(Zh#1w*6(u zbjB+yR?3?cfS{3J&k5QqXfqufuIs>`^B|mds3-{r(cCr{g#`hOc6K2Wk8xpvpArHu zCk$h$k{l|nsNi`^+Hw3Tr(kM)9M3=fG)BYWnTkEhVc{=;3IxD@KOED9lM~f7!AM1; z*QGi-7Dh%#QCbinUm}HqR0;*TwN}SlG9#Z5a9JJsfo`2VIt{*Q+{-g<9S!5m+B&>6 zHu4Jawp-UU=hfF^b2$8G4XO{+6+Y72|DMNh>g&W0THDW2y1qp(Du%EvXfi!t_o=Pf zXp%d&@8piX`zaQQGTVwmg+SbfLko zX>b6JWzs8`R8^y-qJpCn6OdqXlwy|w$5lj%U-fBPQX^jON|{qD@#;vtnH+l}l3*0T zt3hvSX+c$WHS9w@&y;)%D6RO<93X($qcONB;$A}ChU01Fr75|Pgb z?WgbOyLjo3Br`XM!}v=;KNc5BN%iBBP%&zcKMrCz%;~N}Bqi9EHqzlyvd48et_xCt z2Ca#K1C-nOs|*JPJ{@J1Rd8(!*;M+6Mk=vc_Z6%bg1jAxBw&+(P0F!#6t4=~ygR)K72-WJ|@4biC|22@trWs&(FvQ-=@!07^pFeLSbF6$?)~5oRWX zWIWbz^SZl@<&`rx65%qyb7CbD1R@!a#WcgRpy@hn+hQwc)j`a=ibI8=-CMVZPgr&q z8e5wAjpw#t|7))!Z5ou*-}1J1F*AY5^(qWFIywfM1WDInno&km;V{Ld%Z6cqSs|TD za$k2hM*8|Gn>CQmraghX-#qQp(+SDt&yqql<`{ZPSKDL|G!Z zd?YJK3d+9j=C9uP>9yC=oi}~+xL2O|?R`4-niCx3S5PcN&TwPxek z;K}D#)_qC$`F>8CPLlanfcGg94;qH)b!OAc)Sm9>{f=cn843hYUss3P+8V0x7hs0a zU@3l#1wKg(T{1&?t|V*{Qx-&V>9B+V5n!Z}usb^u?d(7_n?7Ph8A&D~NHFKrmR(Oh zZ{IsvH`w6;V+jD;S;K6&6lauq6 zWvWn7ktiuG<+1%86z%C{GZJf9TvV2&VBr@+C8gD&k`k88XSh%{j|=%9YlA z-3Qu6%xgnL>_(!L>^jKl!+kI#5%K}oJv27>#g?Md`z7H)#r*fV9s10k-w#Y;N&`qL zmnO4WM6(%W9NUxZW=$lG>Bo!d>bU4K0g(%==17 zaCLznr66L{gdruO8r9S*OnqatPXWMB{_R_(Pd%_9PL2y{n$Y1{q2$V0qyr|4r7)S< zRtgfBQo!W`_z?r841O(>ajqP;QfgjB#kCsfe}o`cc$E%10a1y9YMm{$dve^4!TN#Td{_9(a2G=LK!`cEex&P5 z?|%N0`US*9bZEFk9RTpF+kSXeLBNlx{=<;582c=X*f5Yvrl95YCrJozX@`kp8(9MdUX41K=!rYSeG^9| zd$Z;R$DevCCPzkisHc}q!^kBOnIu?AW}nQ-KX`sW?wP%bL>D{*1^_@?dAVpSDo1xD zvTi|TrA5H)L{vzimx$=Hx5fwMyW8SI@{9d1y;9MC;J|lJTd_iBBN5^A7eENXAZ!Al zeHelYxwik)XN3b2>qokd_y&hiq+dC6UhBo>r_f{JPWH1>2d2-B#%3obr;r#Nh82lH zlZyQePiT!mEHrXRz|pjXm&IW!J zC*nAuvV_}i9qqd~*A0o>-#~nP?5=YzT7kx5^78BFRa7=l|KEers5%&lq5?qY)YOCfCMRq6PK=lAnHXEa%oYGFt*(B@iZk#u z+v=WMZaH&&a0neQzbpp!?WasS1w|y3AhD{s?IRzSG1f5|yb}Xw0JI(8o7+#lJz-}5 zDQVe&7Q@Qmf`5HD+xC3Ckq8xXvV#UNvdQLYK0KAQ^V$vp@%A{YfgRXa^ zB9>m&0~nA>e(${pi;OCv_|f71RRC5^AMf0@U7LUA-xc=n+h2Fb4L8nQxv>43(ivsN zFFgDRj}M2zwhh0gK`BK5?R;@OJUuPDyJz2l(9NIw+_>Yq)sa{f$xQmk?N!xx?420D z0p8jXmbA{ti#=UO-p7*48h8q-z@CY>Zm^?rt7UrpSQ~m+8F6!ky1epLbQ`f>%ONrv;I#h6Gzs zXf%B@B0m|}b>z->O;h{*F7szt)0FP_3C-{O=XHB`+ztSj%~^zv{Re*UJzQSbjE6@K zzq2%je)Q$9{H(gMaqXc!dvN%z{m5oBEPOt4T^FwFdahhbWuG4%3SG7IqyNH|(`KZS zFVC3Oxc0S_p~eekoA;U)3}h8~P6AyTYUDi_Gi|i$8X@+pu6B7wQ^m#1Njj#PtBM zYSuykz=K1brz_GfR}gngh=2V4@S(u>M-EL+2h}xAUXO5J-&<7+ZU;s zb+!L>&7zaCE2`$qe6OGaa8ytMz!y$Eb5(!W!L{T#T+D=W5?t&^V$%dmnNxfwXoOeS zEIo0oxpCHQ^IKXzUq7Sb-jMB{ToeefG)xpga8L*e={~M5ufXE=c92xxI)BlkHSf25 zHuQ8$?+(xN03Ki=K%T+*8!`-=n+6w@x;QmH z8O#KN+X1w$oV`FiGSI31*n1is3I9WBNhw}`;x|-aI}q8dr-R_Rib)3R1hxuvUs-vu zu;$DQFJxs|wBw{=t&2QiX=tiw>orec{ zx_bf4xpv;dpwN8oJso=;0MPw@+}GWi53F}HI2GSM^~Rf*xGXtoSzyvwDNQib9n=;r<7vPr9^zwwsB?(6@UxYs}`q;dcXFE_wR}{wSM<`)_5&vj&JF1d0fz6ww`z5BEQC zX?@e%vlyX$*LEEw<8ewS60oF0E)fD1c1UVeE(oof5Z$^aNYe!QghrYWJD%?C{nm=s zR`EfC>TiK#IxD=YW(gh~-*?op%W4;6*yz{PEC`7i0i!c}wH^No-vPo6w^^5n^r zCr_R{dGh4RlP6D}JbCiu$&)8fo;-Q-gubjuBtN;%8F8G$b`sHP*7+x(&DP0b?W~L62j+J0NQEyvqCVDlM;ve_}`M> zQ@>K!~iX2KtTtwYt?X<_U zxmHhO^C`=wrtN8M!@aEM!I>4mn={oCxkwUcK~|K4oDn+)nIbb1mdi{nkuY`icX%mr zYO(<~mn;k*2)PgloR!v*tWqUZSopRN^Wc2(?|${Ht?&G7Nw?|UW6KwA06mcY+#*`= zp4Z~yhUHuynqwIezr7!x#W4^?e;eli=dO_XrRy@;v!MTbWY38|V_lSf2;?WC zk?+}nO`(sd@SErk;D*}b3e+4kW1OXDs(ZKEzz21U5mOUt4oRGZafGK{ z*42*0-W{a@O-t5a2Nq8*MD8t3y92~7{l11yEM^|#)wnbr z#G{lAhsMH$4%LF~wmrI*Fn*I6IqK=nP!AtSD&~doimIt; z!k0*R*k)oC?tj>P4n|DFj<61|goDev`z^(^Uxat4AyIyzEV0wB>!`^>?<0moMZc07 z`|VCiZ1fTsG`;$#17DqWbL}lvexgc}<)r2TajC-D>;!w-_b|^)hehbb=tEfeZLF^I zIysN8@>t8~qGqI0%fJ_T%Xd%EKmX{93Py}dCZL2{_j`LUd?l`i1ZMhw9Ey>=u4*D` zdr)LlBB()?l-Ma!tdS4G&>lNWq{5y*(v<$_r{O!CzuB_fFWRsW=o7?D&b!xMF5DS} zQ8*q&xF=E_7UWbF)eQWtJ3U;T_B%LuVa?Gf@x5BR?-}tPK407ttXFq{UwrV2Ss2)x z%l@^zFzW)!!>leUXEL!waVx@trLWx3e0+=}-V}QORU?N_a1zJww|j|>QDZlb2NX_^ zdYa%$`|FiCo~bY@W}N=e(d-fm@iwP(@91ox>t(d6yq;I~b+Mb6UgvyENxRU0VpR$| zo+VrByXq3slJHod@7o{Vw7AL5{W>+IMN_mHA56D7{Le=ehwyl28%%Aj*MK702J43s z5Uy`pE&Rn}DDwj-(QEt{dudMJ4H4Y>xgvliWn=}j*rhoTtRh(t7osX+4GLjx^0K0y zAmS5QIAFhLzvY)y){PDUgvaZxSwX+aMZ~91O{zNq^pa6HwRw<3lRediBrCC;m<5T~?4?d0zt);)MNeE-GVR8x<3~MPj>*5`SL*hk z>}&U?g6aP8!tU_QW>z=7zIHHz-i2W9vRr&Aj3j`ca5vOZbh57HUm;BV-qrUeCk)$< zZ+CGui0Cdv`LG|CQ+&fqv@TH9H^m?M@8YG)sM#fBOMk*+$+0_$@J4}&#Y}MAjOzqA z<+U#(n|r7}OdOL?EleKL?+hFs3BVwgXn^ciOMI*Bgi-gs?3yM-oj1x-+Pd$Zej1;j zzscVv+w^+PArmI<(cF<$MnHft1vfB6@zRQWEhVmp$fI_&Wa_jfYCo)2{I1Fs0&rp6 zKF58m?3@ipf!v>J4qoHrkvucb4?0-`@2O%M)D(dv0x8st|CVD0k} zM%lU?ba!xLy12$ag!DS`Uo<5>tRBa-cQ;Iq8Oxh|ee>z}0To=KF@_Bmtuv1Wd1}n$ zmjeg`o4JiG9tgQH99;HHjg+E>&m`srj_!W8UA+6%Jyfx5ePm=b2=}%$0&OE{Y=W`= zb6lc;C@0H_qAmcBC%B!p@raiX>NJ5qlX`LY{#P{X-rY}P6Qp@v9piej_nxDN=Ts5E z4{Ds7KYsx1VAm4i#ElpObj9Z7Ms4M) zNDj?lMhVMY9M0aS;dSq6|C@oFkH;syw8z=Ob^r2{`(2iD!{*+e9dSQO{F~$i7gXEA zLC&O_9b{Ob$6me4K>}i4Mc@0>2lLOHQ6p{1r-(GWQ=e-Ll0TU}K1axPXa60K$Q%1k zK|sQuKK-APFpLM>JnK(brWc!kJpoFqX1j7yV8(bVHs6;RnM~NE5`OgMKP#yw$Z4WV zio=H!(hU8!1r1kh+m4;y22|?LdBi=SDIjrDG`9o*$%Dcv8e+5DbB+0OFpKbKdFp@7 zLmT$`Ml6&5>BU#CTj{uViU8&@*INboS2oRHF<5ow|5Y}EkbO|5U1Mk;olh1@Obe7H6qR|6;3q z2x2^B0;Ez<_B2}#4WBl#EM+eON!T!2f%6gM5`ARpyn0}?{9C@YBX3jsiQ9R z7F=`1IOujk2Q|b3s1yuTlTk!3F$Ky^;_(7Lzw*$(^WE`1`i1npde!9FpP2YUSY3n0 z@`X(?WI|UVI%NSMp0d}a#7J4n$C)P@`!|?QLjelhn9tRCz$_-}(^5-+um2 z*wgvZ@8iC7udCYW~uD{U4=u-l{;DA9|Vq9QhpIZ0Evi* zZF3lPc;8L?+$3E*9k6coKpy05Ew(zj)>hV&_g8sy*FZ#t;c%!3fP9y;Q|Vh1MsBrmK4aQKZ|RrZN~`i? zLNZv0u6oM&GO2iU0XIPHC5+GOKQj?Hfh&AJSKv!VpVP;nUWIENfq9RE-Wdk>Smn3r zDF2WJU1xB~1$LNK*xno1@c5;@8;{Ut#qZqi*7}K zC*LG@e7Vh4gE}Q69d5Ga3yTXD6pYL0fxrH8p&u-GR1ruOa_!B&86y7Sz%Uhm@nh^# zx}OuJbVHab$p8%)?K-}fl&96{*W=eyumzLP``S{cSg#+==$zbJf+0!W==m4|Q7~3h z6V5efk@kcRi-k6LRhU1O)*UdnjT(Z(cksSaetiu+~XFl{WQcI_9vHp56BT1jr}$^XRh zuxrdvLHqyN+7U9byaSxiy3M^33aYo$p zxZ$4gU7@hAKC3|gcq{7_B)IkD=}(QIN{r5Q=k(g|=T+U!`9W$+!bL# za#LOj;E}1DEEbF%B|fUGxjfSap_R<5{daF5tAw=LOada zK$i6+p+h5bIJ#0Fvv7_RO~@k?a0zTCWeI@`#tYs0UiLKli58CF7n<;H74nAshz3&= z>6n2C^6&`4b@=~M8kyTY9iuwxr1A6m)t%JeAhZvF_Bgn1TCN^ybT7IUh) z-_KtxvM$=M&TBQe^B!BY$b4b~KP3-j26uBK`D61;;_;qNN#g`shGW4}Qnra988tL@ zzKb$lCok?GukX3WqF)#*X9KkpTKDF@X)JRBl^1AI>V9Waxx@~>(R~3bb8)3SBoC;$ z58!d`7LT`6+KAj`8M^*^PGJx6|A2LO5PB+{%u&+1eThlr!BU7$n9#3o4KrT@8bqskO=Db|)} z32S??mZCoKhEAYsGTSyvL)8s2Y0U}XNcD60rj|0a{UxZBk!QCl^6$slxO=VNna#!K z<2l!!VZo){)LP5}kEBdthl>d?hxO0rV?eo{4dOA%!(o&jqUyLMnvR9qq3Uo{Flz|u zIKdpLe@bp|gx)rxsKTm+3$>>hs)EX8GaqJaac+UefB$pQ>k>5IrrC1wIN7gquk+26 zW4{MI{P@^T{k*EDTgo5>E}1?kk^(6NGhGAzXW7V#hC~(uR~P_RVO&pz6RqXp5m1lh zdjhDgKK9|2OLKkdmb~-C+I*K-PxH&4dwk8WuF5wN&juDlX4_)@661+}&WuUKXpbqY zRh2mqe;J$M3p4rGl}tTefp4)ep!OIh3+sxiJG`<$=uf&m{!n}K=AQfb8-8irt?qKr zK;d@STT7UC(8t$gf(jjiF!#qiMua1(not=Q)myBi**#};ha~a-04t;Ef6}VvB|Q7epXe-YVq>% ze{bX&T>Pa!AgNT!#+jP3iD^S}^F$C;X{>`c;k(hByKRQ`HmY-32PO3iT^B^qj*7ZsWOnojTc8NSzbXJAUabo2;1;F zRWI&+;f7W4QK< }2*!-V3b4IF5NEQdNha1&pmAglU!Ba*fYma#2=3mL5hV@h2}P zBHo`D-Qpz;6G*73fpVZPH*FLEchA}vqjS;J2r@BZLsXH_@|cU|jHJO>(!=rTshjnL z1Qx!a+UlEJy^HUf%t(X`gc4n6_RWn`YsUyp^HhrX9I_WWkC_z?x6GW4s5?wsKODWE zur83dJRWHCntBhG8sFOly4|;y9|E=U1a26n;jk2sa7g`cmm5?fB#R?*w*}jUnoJB`pe5V>CtY;iVZW&tb-2B{bOnqILMX zO&!gtEDM)wS*;JA(oF$8iDl%n(o)EkK!yRG3yZz z@F85MNYaJ~vJ>l#Pe z%(Qc6X+fI#*SlS!%9+bg@$Ed`29z>diRL5cN?bA*rm=_hJ#+@IJ3KY!Ful%W6lLE) z2j0Pdx*`dK>(Pm)62a6@&p89gHZqla%=q)ows)&%bfcImIY|a!Dwv@hJ3u^H7FGiZm9NHyQ~$e#OIp$>Fl*1%d^l)` zFS@~lkTB-h_v^4v&;x1Q+>mt9bI9`JSsj1-o1jsr%hMpKIvJ+6u(Lmx2VBTbcnU=VeR84Ya>4dz|VogNm!Ao$!)`_>b|~PGm6FkMge=GZMon6l9Qk< z-{#voP4eX%?T=`$F8vm@=M?EZn`qaGNE(?$c0jGM#;WeRxm|bIe{x>IKnU+x6ICT3 z+~hAB!rTJh-VQQ`&;i!rJdT%@qVR=UL3*Vnmz2g>ZGhG{iAy9Ea_oq&7AV$88?Mq# zq$fpqiGbP4;$@=vVuq!)R3oM|W>IqP)B^27m1@~EmGuX&-W&oPl{DoAGp0-`&RI1t zB^)ZVTTUSTU!;Q$xfqA%tD>$8si59-s=r+yU>yt+Ae}^Er2aA=Fu-0WylLqmSwoq!ov26Jp86 zcmy)S$=XTdibfN2xOW{7YKXS|sg(+>|R zHtkIZenlaqxDy`h0sD!=s3o{;KwXcU0N^xtt%2a{(f~e6F#gl7xuy81Lu&uMw zgehhnL&XG=aAfOF&FmhL+ZCeZmZ#^qd11%@IcCLS3n9gouvo8qF1ijo^Mct7KONNY z0!a7(re3Qy9zJaFPWl3${AN+QV!hSa56ybiT=wSu{Pb2m7nz`wM!D4m@2Z4VdL##s$7(C!Q=>kvA(0a_c9)28iy*+s zj4}iv%M=x2!(56Zf64rx+SqV*rGB9%(!jjO)>^uRGP7iI=eYKiHZ~Y*9zG4C`KU<) zJii(VyjgYs5NY*clncLT*5B&sKF^Z8~n*%I}`9Tod~=pTLf4o^|hon z)^_gl)uRTM)Ll_1hke7NGSo{m6bCLTtHZUZ{S6q-PRzfk@W+@u4xF2cl6 zHQgJ!SLTR=C6Em0EQXC0su1+IdgX1c5j^9zi6Tt`wanP_oLkdX5tT^vU=|~{qpeom zz@tgY8fk3JUrMVKf?G+>c+pfi&t6b+zFNc|MZZv0meN-Gt@(O>!1MQ<=DqFiQ~Qh^ z6LODT7iBhV&RD+IQhGhaK6D#!zliCKzW}ysOKBgMN(k03c71Iw1T9K@`JqvbYrwvC zS+gE7NliGZ79+$gM;hULcx%L24blwi!>Go{FHd$iOwYXAlK2j9wIXU^l(c@-kZiT}NkXg{YRD z;c!7g;eg1VbVD++8I94VVTpp0Qw3N$@ErEdCOD#U1GMRc!f0w03ydA}E^YdPEkKxZ zJcYwaxPFSKYh4%}pRv@(3Zs*lNXKh}TDxqaqQ#jcR_MUBAellN(yF((V#o>x(D3SH z&YN=0cP;=1T@vYqKeA`XZv3pAJ74z~UEjAxN2P?oJwI&HxJk~J<8FT%YUCj@_F6St zTU(jflEeXLeiT+ZjDjiwEzu&W1y*nJM;P`bRZK*;-muv&+1aG6dg8WrUUsdr(zfGQ z*~<(<)<-awd2&T=bj{+`zh+9J^~VnGzP4(Cw25l5PZCQRGjd6i9uSH><5q2dH8S$v zaVbRO63S##UGM>^?DD6=IRhd^R#q_y{$DPDL^)@pt?ap?A`cTjXXQky%W)?)SE@=T zP@W@9M)Ew-J6V)SS=439VfMfC|Gw+6&{rnTuZ9#d=z!4XJB>A$)q80}R<3MCr};ir z>&jSunoskE3bfodkeQlCRKu31fYh*YTs70I)7DiGfyGi|KgS)$WRr#3lwDa%U3jcf zR~i0?KB{elIVx^S^YPxk_3Yo9GsuqTihzvAK1{A|Oam zppq010SGp&5{#ROXlTvo*yvk)NZW}X@?FnpViA#uOqdn^U%tF;rbHq`YJ$&CYl-f*QIp;Cm z$dZ98cjy{e$D|)!Z7#TUEoAc)ppw}l-`0E`75CLu)pFg(W9?+&c{fy|qxc#vs?>Z{ z9k-z1UukGHk|ydDlIC~s6Kp+xEk~q=+Di=)6P!jvGBPTQq&>}n@UxbNIX=~&o^fZh zgjs_c5SH%_-6Ga&s6-OQmexVXB|QQk+}z{4k42hb=x#7CYaR&jz7FtI#3c<6&|0Le ze5|d%KRZiB!rm5Uc((f39(8|v%+uR=y@>hU^z-RkbwhQXt+IyPf8)G`#xce~>ZMke z5KeHsInVs_G<-p1Z$x<__>n^dFO$L?@+!o$*AONPsVQt&qS`}D*;Oi#EWV8vZfxoXTlaKx%=l1>6rjrQ|}$aDp7@m`LNN31;}tb zR}tMpY&b2-EHzp+b2_axeonFdg#(2#+1A)9%hTNs8_z85r{AY*!OwT*M|?NX@ZTA2 z^cay!un$PHKf5X&6gH;J_tmloO7Q6TzYa#sqnB-@pMmpOK6?fAiwqGx3(N84962S*8VYT`pk-M- zF+zCoSC+GeUiX;!;C0R(q4{|+Q0*VYf(_mUZvC|$(WjxrQWlxvU7AEXh6XD@Deqv4 zYo>FAB)!k5Q-g79x(QwjCFNzdl8%n|32RQybDXYm&%aA_){Q?03Q{lK|13Ya9Jg%V z$K2l1C=YcK+6liOCbumg`yY~R^F2GQaXeQ-U}f~E>Bf0*cQQ9vwZe>e-4^;DXpfiy8MzB z7tv4??rH>4MOjZcYLKG?)C%$rZ}orOTIQ+b&dYJ=XR;e4GglV+_5?NGRi3&9E0EzD zb^B&uxY<5_68TqDQtm>{{V*PC?tGi$pij=Z=;3-Ajba{U zd+4~amW1&PSz}Yj_z$5S+bhG&*biV%usT>=L5}Q`4FW`+_$e+oBCgqLz$;r%24lqf3Q6B~Q?t+Mhb-&hjXqGKZ=cCt|%BOApXQ)j|sqw-9z%X7|z~;TE;}qGGw&iZYkE2 zB$&NVHirc`wUe04D49B|woEhCtTs*gOIw#)6pKm@#!QOO3ruf9F4$*flFz)pE97xp z8Ny6AQC5xwn*2QKE(MJI3YyHd}`{SROW_K3D0qzsohDWYKrd5kEYIn8ji@h@HKJfV9`V`st zXMWLR#1>7v5VK3@$I)P3|8n=u@*1Aj@`nlkbf1E_8wQ5`zt!1Z=@B@+`87-8_|9Z6 z-Vs?FlmvUm{2Hq@;GKlteJ|SM?TRceA#Oyad=z|(!;0>fs3PSQ-!{=SW^ zx}I2~(9qu=@_xuNOKVFY<$MFQJoe^F{p-Nb_IDv5&i`>0_l8$N13NPkkaeFA(s(Y? zxE??vBQ*7MjuVkuZ<5dI+3lA1>ZV?5k#Dlmu?xg!sCLcy3~JPuBY)b41+jq#&I4;6!8LaV z)uNWxsb(VV0F&q<=CplC{4BZ=rXKrMb#3|*O^So|b7oSd@sc{R7R}G$puoA7E76&6 zp@mk8jg7Hq7!1ded>(~zJQ+&7R-ZTC4BD3I{Feb*Z@J*NJ~?CCDD1o#gXOWQIBCpr zI<-V669BdvR3y20_PpIf+b}oW)MypB0z(utcz6U48@jmLUEF@nIzx(CDq?m<=V9&T zV|nza=(#NEK(AYp9wVNq&w>1B+HXt`wf^({on$?&jR}J79c5Z!Os9upt7mcTt*tbI zV8DvF6lirU=8ZeAso_oHEPZX@Cmr~01Cewmi_DvU>$2A9DC@%C%m1`dcuOu(>9?Kp z-5uG7)l-MtT#1k5Ts?+n{AS22Yq@Hc{RpI&Cue&lR@0NNpFeblq`XS87is!p|K#%7!)-o zqo(3HjqtTBSz9dAlz5ufbP8C5Y@4d0Nt5CFnQO{gN}Qdut+}i-)GxliG5jL~V1?q* zxg5_kemur^vgbX2b<;WzBJ^|o5Gb$hW#>M;ur>Ad z^>{(9>Iq!vg%FPa;I%N+;yg&?lhhHfTjE|FI&tqY2EWV#_Uc}%=8J^AjD2sw4v5%!{uaex^((81Z&LhzI(`8;| zaQVctdXk@be3NQZcZ&H|go)He^l93AdNV1?!g7j>q^6x&0LRM8+lnPYi0aG3g3GF9Vy0bqF#32Dfpf5ho@Z__H0oa z39?Pu-XYv#-hFE9lv=5vc%VP=Xs6~WZ7ImJtyf68CdfjIDdxE3{L^E$>9Kuf%qNJJ<_vpN?^g6T$dx!~Dx*Q}u1;=@U*ajnZRo{LyR|TVgO}is zv+Rf6&Vw;4e3;5X4R@`GF&NTXK{EJ$qNKC6y3bkFib~48%boBZL?Olh%B0Gz1x~>a4bEG zftFkUVMs10gc?n-0j3l&q{U3Xo_s&X#+r}q4ee)tJQDN=zhrzIKW=ji??>NhXp!x% z=Xua=Ilk>E5z1VHPdxKly35kq>V6-4K3?}~C-8NW-eaS7X{TpQ* zJ)rxuZv0-F5(~RQ+eX`oAzaywctxL(@T|Rwg`7Fa<;yr=MVPnb9&f&sR;pY=CK_z} z)rHK`M6VmpxT4@rwc-alA_brT4tv{{7wiK5`4*h@SXyx13qD+*IG13<21@eq32twD zeE3eJ{CTmAn&4B-+Scb!%g~l$PRsd9|A(kZxXuAjLZS|)@4nUksph*tmsm6TL z7hMrKZe3Mes>8qAZ@T%xzvEj2v`X$tfe20v5*=_yx*T~9Ya;RI`p9Ua0!Mwx-jmZ$ zl)?8y>Ai9TfNJ2QH*KKD1vAn=ZIy%v0#P2}WSYq&zeM5g9^X(?wnQBb%xtjkS3oJl z$Oc7E>kAx*4LO`rw3niB(Padg^VK_E8rk-Xy&yz!?qw|3RV$2TRwQw(UARerRYSg}5PMqW!Ua}2eK?x6n>maxIpr!6uLFKL^lS#Q2eE{y0Q~Nw-t)DGq*-NItsm4J#v>* z1+Y`H<^3+QQxF|UK9@_5gJ!k#nSzY0pwN`f(TZLn>zrn6D@uiT0x}~IED7RpW=#Uv zkra>~c=$mUV+?9f4MqqD`ANO`5zC|uEKqY(#RV~}`MjGdcQL&ni9BMTL2QTfU6XC& z4;i=;$FmId)aUGSOR3SdX7}qRI;jgff#pgp9>3SW=n?pqRRBEpPP$didDHtQ7zS?Fxn?!{$rbK{Mi;;#Z zRt_j5%_wj(hRiz1TPJ9w$(7?xQ$iA=nf0(eTA1A2-Q4X3IeagKd|56IMt?q>N+UtT z5QOL-wY3->4$439UU*Kw=)ZrIwZS6OT_W9w7gj$EQTtZWgQpOw^`;p%E?ZX*2m{Rp zu=RgGacbm2uaKj{$|oXGAUO%ekrMpagW78*p>YC`VqH`703m)_HQ$Q`X9%^ghLmY= zElW(mwOW#_eB16&LDfE__iy&7yOu%bF3^Y=WT6=OY<<(ROCHtYlfIc)C(?^k9c9@hX8 zDa^^K3$Yg6pC?}NJs{fe0fyKGHQ3R?6d|*hE2noOHs*@`#VfV}v$GR&g!&56PT(ac zQ+ZZXUl7P=@9b=et~NdQjVu<^n>23-RQ;d0vTlK9?k~%kP`CnJW|46?IhXPD%7uEb z^DltM_|_0;EgO#x;>??u{7_iWbGT&9aI>HtPuHeIauB_z=VPo5-dg<=P0|oOW`RnM zBo<6m3@@iO8Y-lHl~AzjO&-x*Xt5u!Q6+S<6K(K^eOrYR#u9a-YU>HfC47bF2#j4`Uo_d_+r*3Z>$7@(i)Dg09A z%yk+@nGRJt98JY>~gg#2f$c=Eu}6$YvtXMBRzk7^w$d z{voEUnTPONC^joRu2B}RW0MO{a)KC-eKtbG`yhKmW_+Y*jsfx8|H(FFU!YIk? zfBVhP(jU!(s(df^+gqqv7Ly28Nw2D~XC*K}7v(bP+LJQ-k72MFXqTO*4;(1s@h5;3 z@lgTc)TXsXoK7%&dWyM#SMcYRWk7ctEI)dF^w-O>$m0OpxhJ3Vz`y+Jy5VF{^Bb9u zcbOSn91^-kTz~U-58{(paBZSZg9;MER~;ubzm%j4J8RYTygWan_WpT+zR}M6qqFto z{(>GyWp@Zs2}q=xxj6eq5H{)=4rzVN6#9W_m}bO41&T6%*Fn@bI=pc9Mrh z*+yR>@C6!LA6Zl)n3p}%iyb1aX9I%}Z>d+F2MC@4Bu@BO1)lg@cgC^`Pfk9))Z($v z+7%=qHShAAH8L*{rf2FQgk&M(!f|40^UxzL(-Ou6vX>SO7{Ldeq@tg_O)=%MtN(4X z>Y6&s$x%rAtEq+Ltcq1Go0Oq~4er{4G%SKwEZgdrHor|oE3*A6D*J%8a0g+Q!--&1 z$q$oNsAiUxl{$^m)QOZRLx!ac!+cu^jIsN_=ksx)iG@hZ>^pldRLx8Og7P%Sg_2Jx zRj%Pu$jNjS3idtd`B}_wB)To#2wV;rCP3yYUsI>Kwa+}!95W?l z=Cv#O$)GMf%C@GtL8sXeem;I99B~KAcy=fTbMzR9v>a;6&^KCuRYU`jm{0+Dk`#Hx z^l-aI}S$Yu9XkeJ2I9I2%Y5ZppFL&M$8U{ zNC|g39r{7F`|aWS+1bPUcl#oUJJ#hIXn%)vMf^2FF2p|yfi>cxfVSG5I~V$%c@ohq zo-_9Q1^zS^LAi5q&{$ft0_JzKg-|n0Tury0b6IJrML1lVcr12}3Rg6nOusG#Dl953 z__naWbI8MUq3rlKLqtgijk+veGibVSWAoQiey|fZ1!;4QfhzXEJVJ9j4Bf>bSaNmz zdo>NU9+4v^1sg)(EWH>xBD4a?Odj($KMeeG;6?jBCdtQ2N0O2E`spq->^VOs3j9v~ zF}{p=#ZXo_}*@A0DbsVWshUVBy7%l7o5h2yfCp^lL( z%5Mj&sl8UWlXq_JBMkP(|6sdC*%-x{d1?shL8|N+DZqzewvXd?!#4L`=G$to%|7s< z?+4bOb~ncM=B2-Em$Xtm$UsZ$`jS6%IBbfHbKtgi(ZQ> z7=2~>-P9beZeR0;W8|Z^T1TM__w41z*mdR(QrX;}-Fsf1BB#Y!SDtYQIZN1k)DUvO z08bDdV}S^O9E1?4h-sA*qAN(sbjL9KYJ)=)cY)65kRprCFiM(k$_7IeBhC=Li#bRw zYQc^`jDd19uAQAbV(W`=-~(;ADOJ`Mtl1YlxrxqK#DWcGBX%oD1PqH3)b45fKhY1- z6H_f{)>o-P%l@`9Ma=&elI^G#yw+T@cBg#pd}(m;s5Cv{f9Rjf-{RY>?JJ07xQ`;@ ziGYlHnq?rm$ZA}v4c!d!5D4Hzz)3O2mHIml5G0_OStG4KgWOg9L{6bY1!@jDJm~NP z3HH8nptSdF5R&Faf7~iJylTK3YE4+sJhq#@XTtf*HatzcKdkvXvLF}b<=F4$+P`!> zfHxe^vmR?w@&d4@MohqmZojS&sZwTEENd5!=-EM(g`7{6XktXPu(#=tm2vjjy!Q_H zT8?{%R{C5`;YOJT&KZCAJePYaPY)AZLMCU+zH>vfVJ71QNEtqJyiB{E>ItYI^Y?(P z@})#yDZ*o!mc}g4Kdr9KZr6KUDE-BBy$5yYAAp}1M2KRQN4~X3QPj4|LE5zUkl*Qo ztWrhBNGU@C>*;g^KmXpXS-Q5)qCHDD!x6xK#bLveq@Hy&@Cc-zbBo9s;i>uznAPi`kdP!G`k zOqFKOT|19@?Dusw+`W5+&%N%H zAr$cOAbG-9a-2<{c}T`j=Mqr|M%!aR2O16PvpFR{y3tSDy^=d4$}lx%=47@ZZmrw>@9BZ@~uG;A3nn zxr1)U$0xf)72RMWGIQ{@HGz{fKxfQK7S0#&#CuUlN4H9gX^mjJO4(7B9Q>I`X7x0@9SGccnW*l9HhGoDy?K4js$2e^s#cA3w}c z`)#3|4EP}~lXzeeBfcgq;>7h9EB8{&F%pLkRCAV=6Ev9QS{}ZjU1s?=dme5Ha~`|b z8t{exl=NLNz&HAPzC9V!fhRRnCTEWxBT6u-8l!$Z?`ddfx7Y*e-0|dPo@UOc*XOL7 zFUK9*{_z8mVwLYn^dU}{N>$?qym{KUufR<*bo z$BINs7BZGTPySr@@pc+vzlvQpjA)shPZ!4t2*)E5{*D6* zTo;~S?S1>DdZ0S!v)_H!{{3(WfSmYgjzhF%ase{1Upwj&sZDMI%sa2;a?X_W)oZQ> zM0fPAwYH*?z6T^FZLj;eG5WZ1Ao%6`Ri8}fLP2#~{DblNv3CpTzbO82!cuP2fPzAr z_}_m4CjY4JOt*6Pn(=->c9HGZv^Szot4lM4<;5>uJaa1)=YJGL-_d`o#-^5}Qbo?J zF>8@yF+b+e))5HLct))pMsC%$xElI5^1V6eDji@v>eH~`gBFmr+0z~*yee>0toNO- zeY>V9>hW~S9HZYAs`dpx=BZPT9tFEc&z*ZjN%H?{ITL>-95;?5Kcz7WnK{;&=rSXj zF2X3~=&PUmXpLy|l_j@anfu5OS&>4am?McV&732-mMlkXnnsy(#zyS7-yiXNUZ4Nq zd0wB_>;1ew&qEn{QM(ej_d$UG%d;%%KHwuWyw>jH{bD}(;*swc4#udkE-ROX0*b)p z2g*1618vPLTY{e(?|CsiP-E~?FI`L&R|Xp+ZIH8IE#4kSXO{|Y`$|twHwujdJ@=B< z|E%zQqcbJp8Sh_tOuCg352>O`=&V$ySf#t%_~AzPZ1Hxb%!uzfcAmR8)-6;M1+^m2 z<2nX%nh5`l8n!w{P$JfTK-I7V&{PW%FVHl$0;cXodSNuL?`W$9>fNew=~?F-P7_EZ z+<=fp(r=H9RmL2Tc%=aT%h922bY1T{sjofTme&zX&7!NYM=qepVj`RAjVeYEpi zV}1-X{D9jv1DHHjVG3E$-%J}yn!8tOED`lT@O|8^d z^S*2uDI?+(V!Q2>tG$^|^R8eQkhf*qEfwy2W+$uqR4Ap>cj{MGqG@sa!JpqH+F^T-qIuf8FtI)R_|@d=t|_hY2>qF1QC4 zK&tg3VPaw+zZ=qZo!;u(lsZ(uB$MyVv*x%#U-WFauhKXsYaJN53GS>jWn-Q*a(*8v z3sud!LRGv@ef2b_k7(7Ur)@z0>&+8`?LtJMJvG2fus4P=wzi6OtvC%o#&gh(q*rNL z1D)7g|7%`jCuc(j%qtK1bhY}fXC?1V{q@i_iMfc0dJWJsmnjZ%^L11hegGM6Qa<%w0pXvToSv!BO_G_ibvuS}Wzqsz)^ zMtSu$1O56i!{cXj?E{|gQcbCTyGymE{$aHMz3yZ?$f88^FXI9@pY^T~hkSWKyua?( z!&Ocy`Q|1sIosSY=$zVY`Jmwl6KBL-l9KEN4XKt}k>b13PdeZ;-e6_@n!Z6Tfqgp* zRA`v5xrItC%4QF)Ix#q#HM9x9qG?<~F9X^1V0%4X@1lrg)vTb>(7O5tU`-*EMVTV+c*sNV<-{Efu6&sHleH?KA~c@6n9_C;1H|L(_LF z>rwl?(}Z=~a>I(gEn=6<+oK-#{!HJ3bl|eRY&yc@u=Qz6GkTG;po*5$MT=p4(acia zatyZDDZj%giORaepRX@`{w-USZmyFT8lHFIv5!1 z5Kui@`rOj#2U4EhR+v-TE%?OvjEGVtf?J3zcPu+=n}%WSWpA9H9*bp{jcBn-OgwaB z2&qnLvmX_cP_g5WSdrn(RLZ>dH~ZNYW4lq~^QWt`BNhFXPM%%)*u)?&`Qb*9T#E&95BTdci&NzbXx4t-am$wC74UQx4MJ6 zp%U6OTl04ehBgKKeaG-3-rrQXRs6|v>d^xWEP4RiNnEdxTjB4fM>^AQ%9%^x;xL8O%y3K64t z@$4!govSc=%?{YWJ4WqDc}>d$2G7-B_lGH1T7|$0w>W)sbog?>diE45ruR>7*>=q{ z24&%3iwibHpZ-=wm84i`)b&7QjQpzIl1N)}d{mVB$Hx&~%5){}wdOM4U_FXx9XV`b z=Lq87muqfjHWLz90Ztc$2xsIyVoe*u$3#e@I= literal 0 HcmV?d00001 diff --git a/demo/tests/data/food/fruit_1.png b/demo/tests/data/food/fruit_1.png new file mode 100644 index 0000000000000000000000000000000000000000..82fd836c70ef229031061baf8122b23bc92ea669 GIT binary patch literal 19768 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/food/fruit_2.png b/demo/tests/data/food/fruit_2.png new file mode 100644 index 0000000000000000000000000000000000000000..5a3e51f11a5e58ce2250b39e3a7967672f38f3c3 GIT binary patch literal 11472 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/food/lettuce_1.png b/demo/tests/data/food/lettuce_1.png new file mode 100644 index 0000000000000000000000000000000000000000..42b81de9ae87a327791a1670f64fc3b0eaca4d47 GIT binary patch literal 19714 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/food/lettuce_2.png b/demo/tests/data/food/lettuce_2.png new file mode 100644 index 0000000000000000000000000000000000000000..78d553a94ad81957019c2de2cf38972a5332ed0f GIT binary patch literal 14373 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 zΞ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%0DHDE^>{65x-*7LoFun(@ge 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/food/lettuce_6.png b/demo/tests/data/food/lettuce_6.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec0a02c8462243c57f9699fa140bd852cd37f8f GIT binary patch literal 16612 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%0D&%6wszkh6MEi*xDZ@Ur_ zNV(dj>ziO@%_a!yNDt0-V}2>Pl93j?yL+DMqPVTbivE4xE4pW`Zx zz7GYSyM5Hi=(&G$2b^vGI)D!$+RByKavpGuqkVsK#kV}BX{C@*0H8f(#y7$%*o^#BOl5sBnav@?fbTX

EyP7rJ@%`BAyF-X0B%H( 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/food/spice_2.png b/demo/tests/data/food/spice_2.png new file mode 100644 index 0000000000000000000000000000000000000000..7201f54c4b54018719448f6d12bbe738bbd36ee3 GIT binary patch literal 14553 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 D*dFAo literal 0 HcmV?d00001 diff --git a/demo/tests/data/food/spice_4.png b/demo/tests/data/food/spice_4.png new file mode 100644 index 0000000000000000000000000000000000000000..62239508e3f70915bc60db0f2dfb0dc30ed22cfc GIT binary patch literal 17324 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/food/spice_5.png b/demo/tests/data/food/spice_5.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbf5d5dfa9dcd78e8d0c9cc1ab7efde19f97f83 GIT binary patch literal 7321 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/food/spice_6.png b/demo/tests/data/food/spice_6.png new file mode 100644 index 0000000000000000000000000000000000000000..0b4a80a949a5ca7a4c9d48eb3067be7f89f9cc4b GIT binary patch literal 10407 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/mage_3.png b/demo/tests/data/mage_3.png new file mode 100644 index 0000000000000000000000000000000000000000..fd7993ce4a1c7d213746cc4e829e641f4bdcb453 GIT binary patch literal 1108 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 rvw*1eefIgwwaYWayl literal 0 HcmV?d00001 diff --git a/demo/tests/data/merilin.png b/demo/tests/data/merilin.png new file mode 100644 index 0000000000000000000000000000000000000000..36ffab3b2b2b088b9ee052a2433e72d63c8b0e51 GIT binary patch literal 97777 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 z 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%0A%)U=OgV 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/monsters/d.png b/demo/tests/data/monsters/d.png new file mode 100644 index 0000000000000000000000000000000000000000..bf35a0820d0ebf2695ffe7d844fae6d03297ae15 GIT binary patch literal 1714 zcmV;j22J^iP)C0002zP)t-s0|Nt_ zGc%_@Khtw_$75r6cXyMMlb4s5moG27S69nxYukH!--m~*tE+#1f3vf*+uPgA%gb8_ z2d_s*pP!#YLqm5L7h_{%TU%RKS69DVTj!6DqdPmZPfzQYmun9XUk3+^BO~*pqxY+; zk1H!@3k(0Zw@(8DQ$HU^0|Sp=H~;^0KQ9-58ykZkALpBEa}yI&2M2#sFTVo=vjYRO zb4SmEQ)@>jLjwbkcT=lxLtjH9cTX#S0|SRwGczj_ivt780|Tc614}m>*Na@!qKK}(w0KL|L5t-Q2uoKrZ417XY|Y*V~!d2 z=iSw_YZpaUR#sM4R#sM4R#sM4R#sNl|62&-uNohhC7GXK@no^LM;T*P%`hfQTvqeO zfBNkCH!rxTN>Y_2!>nY>x+L%yQZAPyJ;2Lv<^I7T7fn^KR;0m7ld7r+sp{p?(W=zx z2}*(6b*r0tb+lTRT4|-Q7MNA#vaA@RX`>4Pfdn=jvHI2V@$pdu1WjF*6=9GGq7`CE z<6})~xKUv&!gak|RuB<#0jlBd3Bkysr00IBIAa1kiy$5$8tZCx{QC9rs;cPT^Ct^q z6UJw7-39O$|_xx`y~o z2>SVxmmwj5^}*T@tg^oCPT!rL1n-SzLSc+q(+CU*i_KV=&ZTku%)MVbko0~% zy6=DJJjQ@!kqt5(Kv3GYj*lbf{OtYN#`}Pf_YSJzEk?2j04j%c0C4U!mF;#rp7FB} zZ_jsY$GP=#7`y=z*K?@BFr@1NW1!oqlt3_yA1=->&VT%A!$1DK@fIN~`?2p@xrTF* z3;;5Y;Ep4J*qv`KHou(xy4&r}KT0?leLwOp7DFX7;}BgywtNehR&PFi{_W!Tiw$G~ z&V=l{qHvBo12&Z?zBbTxZOb`a`+%E<>^|>ye{3Rv9LKgOBpgDE*^q1!Sr1(o;{yOi zSTszt&!09s@5gl;VwZv$sbm0FC~yGh;IGp4y}tRz|tz83_u0M)Z{a~?|Z4V5TX%~iLsZVi?uOy2-GAi0UfZo z`S+fWePjp?X%ro|>maw?)EfqhlL|mtiEk1hrHnba)wUa@+jbFPFqo-S0EUL)HoYDu z!1|t`ck68@2WWx;LuaP)0a!Oo@c#y|UiY^E9;PwIDiMHU*i2_!Mn`&-g1#GFJRbp; zCM^;Hz_LN{aFc)lGtjpW;&T8nzCdwd(`f+W;unmc5)gs}M;M_0ZsNm+098S@09Ob| zB?1r{ww^#^0^;67BfxYB;(T!MJF;L)iUyNr971N}T}A*HzJaQ#1lyw9wgGlCst}@9 zV~=T~eLyMXsrM8rU=2(|HMl;`;DYl2%Q97pBCAnhbRqy`Jmhz(00O%cwB`L|za5v* z5>~+@OUlQxd$rJQ77Npk{WO}3wF}-@tTCMnz*;3#7^Wp8j>a{d30Mo!TmZ262p6_@5+SS`@ZE~QeBQqU5asHqp5ev)rx^7?Pndv>)C%Nm)W2;0AUHiHjbA6y<>+q?LO8phB8KpkLxI19mb)a^CI|6;)x zCn%%7073Cpba;JmeOP2=Wo2b$Wo2b$Wo2b$Wo2b$W&KzE1qJJ{(oiH)fB*mh07*qo IM6N<$g23GPz5oCK literal 0 HcmV?d00001 diff --git a/demo/tests/data/monsters/hero.png b/demo/tests/data/monsters/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..eeb3189b19ed4af7e8024f0bbeef97d7f6a9e3b5 GIT binary patch literal 1314 zcmV+-1>O3IP)C00033P)t-s0DwB1 ze`~Loe`jk?Q&&4jPcx^FcekI1zo(BwLqkVLM>{(^FE1}|b5~niTW@b~cXxM-i;HV( zYhz<$pP!#kPfs^DHf)J934RNyh zV7J-E(3Z3@_kSxrGPHMKX?8|WeuNo*yw5p0k}VL@Xfzs)Mx)VaG#ZUYqtX1JG@8w3 zLuI~UTBf1Spw&1#KR-KbG?dlfwr%?--0n0~gA{(RU3M z1`T5{aC+TtujdQ~N?I^H9}RjRnjd|N!3HgYmvF9am5cs|ygs>1=y_huvoy5(Hs{@? zjVZm8AaHYk|K;I&%1BBG&nO{|V^hj8=JfID=CStt+tt&<^J+8AS;8_m5b-v}5$9QU zcenbwsbApn>0z}VGr}_Jd5+U}VJlK0@b&iFZ!gpO1-?Ju|Ni<41(S5?*diXzB3=}m z?QZuz$9nkkU?A6a++#d-IZtvV1a`Y` zwKu?|-yiRv`+dlEt9aM|S@!2&FnluN5t@wGH~l^o&#U4oRGnqT{%wO~FhA=P5js5&@HGz>?GxuLUG$r*!E8gv4Rs zK?kb(8Dp{q5)ykcOY-~}FI@l(VDjLZERs)1y_PW1dRTvWD<;Pl{4M!n1c#3pyo9C6 zX$IuxGckr$G9jdLku3mISOqh25GSG^l9!;`|1gBfKZ*QfsG>Rma`ui&(-<0NDP4eB za5XPW5U_xWe1Q@Kit_M|4&u|~ApaMN5*l!L7ab7Cz(j=r@Uvvx;sS&8AZz6uJRANwCVg-<8 zwpv3|-3TCSs7e66!$AlaW@9*1ByhU1o7TisDR77m0MckQ8jVJy(P%UpjYgx(*OVf literal 0 HcmV?d00001 diff --git a/demo/tests/data/monsters/hk.png b/demo/tests/data/monsters/hk.png new file mode 100644 index 0000000000000000000000000000000000000000..399afd37ae7e3dc6849f95c03ca71ab1c2dd9749 GIT binary patch literal 1976 zcmV;p2S@mcP)C0002DP)t-s0001I zQ!{s8KZ9#aGbS3^%bBk!YgM>8W=Lo;VnKVM5XcVA0SJ1YPH0ROv_ zFE1}UJ3Ifsn}cgtKPwwUGaGwjPm_CNi*s93KObvHC!2q3Lz6c@gD)>*BY#sbk6$;N zV>`2RN6UXtqia9EdrK!%8#i++7Y_$02o@9o0004WQchC6-T(jwdPzhLul>lF7tgTIO^*-}Z{Rt6PWpI`D=a*i&Ix*?H&4FYRXgd| zZA${Wasn20d3dT49`K~9NnP`G6-Y@M;&LwQ{ho6U0Z_17Dag1AR7%LN)c3smh+LQK$t7xI<8?D-N^+peVMUPE`+mbP8T(?t(iW|^Y zadozL&u3M1m&>KulXgJ`$icR0W(nsrEeZkw7HZ}%c(qeavmC!4^P;QkRux7BAswO0 zf>?gk;$y|zhAh?u9v+PIH76}G=*+=M+qPZP)E#LM5};_?r3^r_Nu^rsAf(&xJM?2t zoBDWcj&P-ehE`EUp>7!k=5+Y;O_PFFQ8yl?Y^lm zPI<(uL(<~lphgH9BtTnYRW|pVhM$+PpdkfphTRuDxLE!}*_VfXy>BkKmAG6Q)MwM8 zK3;$-U^Y%__?=5fIL7dyJh-mn-KCi?Lqc7jeGGFI(IN{yC#S|o< zf4aPPYvrF}iE{n$MIeadK+YA`l(a=Mq7JbJsJ->&shpozoU7ALKJX9ELykQl_IYOo zVD2chiFFMM^4qu0DwvS+0;?94DStC>W9z8sK^-8`>UQYHTk z&L19vHrbs5ZUr3C56mb=Rl4ZHXoJ059uD;^pvBU3ma6;kNi2h1f~ju=5Go?VThsMO z>k_JU&q}v`f1>YyI~UCYRe%UkdoVVLEF#~}XHFEsM(XLlXL*j_{EZ|C;!4%s$CsfB zDqqs06`&&l557wbV(|Boh6lNQ+VgV}oT_4piM;23`4WTn>S!&-={7~~cWgpL_t7B4 zpcxcgpMC!YI=gNG0j=Dj6+_XGA{!Bd$Xc%ryq+=UJWnsf^rCgR$WGLBs4xHa^T#vO!q5+I5z-ffv7{J1Qwt$7G z!(Z3y^_TPazZO#P>uTtkXF_fHXA7(XL_S~s%?W!z)_ZRi=rJd^0!$%+9>3t)u`8S$2Cx7V5eC=S)mu8i!#T*HT~(oQdeY z`7)${u)Eo~j)1`!e#^wu+w|$9$(VA>hL!42+{P#xZ{mIW^h{^oUEl9wScN~w+%fnq z0Qo`Z0pkM4QS@VX$quOXlpI=bJZQ2b89zE5+!UezqUuc08- zsh8(o8oqyMgQaPXN7@V1RV=uN@H@}bG<;*bryzdE3j8Vfu>q$4@%uOXeT~l$KmcA0 zg~o!r^BK4se#ATfBz_z6{PWJgVZ(+E8#Zj%uwlc74I4Hrfqw&}-^N>MtN>U50000< KMNUMnLSTX+44@(a literal 0 HcmV?d00001 diff --git a/demo/tests/data/monsters/imp.png b/demo/tests/data/monsters/imp.png new file mode 100644 index 0000000000000000000000000000000000000000..ca83b8b05f92a6a45a4f594f7899d0be7e632c06 GIT binary patch literal 1078 zcmV-61j+k}P)C0001TP)t-s0001Y zPb+^@FPmdKhgUO?UpKRJM{7qXt8YWUdrPBhKVL&5OE(*H0093VA2TZxKQ9+g00672 ztABrgcXxM#gM(vZV=E&M|NsB9v$LnCr=Opn-{0SV003tI0E++sQ$HWee^1woTer8j zi;IiDzrVOdLG%Cs00DGTPE!Ct=GbNc0004EOGiWihy@);00009a7bBm000XU000XU z0RWnu7ytkO2XskIMF-vm5fLdR)&uIE0009$Nklc-33`IqX3LOIp882m> zrA4;?|HWQVwv(4Wbx2NUaK|2LlzGMP*!lgVT=$&mzeHaa7bq@Eq~PfC^WoT>V88nT{{>Bd3g!6obSyA|Tg%boQ-?J; zJn#LoongW3%S*w>XAsPDaL-R&cHt10?Iuu8$(5I1zh8<=ImfWkq98p0PSC1WT2BNpUAmxXDMky_FYXy~z-ZhG)bUpUML;{$HcX_y zbQp-rm7oHgg_Urk^|}2pf(}s9T5`Ciz*>r(&Ldr>q1yky0n`K_98g22c~A+aZvfhu z01)QIbpp8N<9P+n0GkCfYF_}YfC_-xgqaioG6Vn{f+UD8csC3H2`LdJFi)KUv?x|f zuCtMJ2AEI}*7(zTD(DYTrFT;MA@>GIR{+*2;nE{Ix<^F*r5+M6kzgv3sXxIv4Y&gE5P+I|=!{YN zn@|e?SAaAMK)qj9k|-nM%jHk0)<@#ME`Zu^JtVmiOR&pR-f@kOu{=)0BsiQ+?8YGo wpBSll8n^}~lgVTC0004-P)t-sF#rHt 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/monsters/pain.png b/demo/tests/data/monsters/pain.png new file mode 100644 index 0000000000000000000000000000000000000000..b52987875d9504e9c4beb39dd4144b2477ed438f GIT binary patch literal 2787 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 P00000NkvXXu0mjfOw3x6 literal 0 HcmV?d00001 diff --git a/demo/tests/data/monsters/sg.png b/demo/tests/data/monsters/sg.png new file mode 100644 index 0000000000000000000000000000000000000000..ed80458fb82b8b5212de573cd96a4a36d1065a8f GIT binary patch literal 1299 zcmV+u1?>8XP)C00030P)t-sUw;6b zV>`clOV5K-vvWt^lVkU*d*_>LcTX#SQ!oF=r~kW?k6$+@Qyc%=$N#f~|9gAm0094+ zoA0A@|G%4~Yd=7dmkesBSS+&J3BjvLkIJ77f(-5 zM@L5+8yhDlCkqP;moG1aA0KNE4~JJXiz6d<7Z;B!E4x=$uSZ8;LnD718>2frD@)Ti1(Q6B83#2M2F&Z$B>=PXGX8V`FCv3o|PdQwIl2Hyc-1 zS4RK<--n0CV`BgS0LyD@BP$O#KPN9YA9E8E9~TQ34+j??2M-qjLjVB8_$HVD0004W zQchC+^<83QNIo43b}WPg6GX?w|QD?;uoq5iS}S<6Nk(FhWN@kIq6KYgm7TR~RM1KuQ2P z2*Z%6PuCr4kjLUHd6jw+B%?GLj|aXVva_!H<@_tt(S5)fMvrSACCO-#oQ{3Q0+j!9 zaWU1>{xkPmw>^&;8;u4NIT?(E5Z{N3MKVq=_3S~8)4Q6*8D~6&rIcax{m0qY6!B(r z9r|wVs_Cv`?{Z zdj&WFHr>|xXAoga3J_TaMOjuFYQS7P2!a)}&E;Yi_di`nwrxOn;vtlmv8nC9T)k-`*N~y*GUv1`v>Vr_H zfz4+1>j^8*cf0Lww*!UFvk*q`>j|HGfZg`tVY>?$$0LD83)3f*=W0*&;NQ(#Y_vkI61+t0u_hP{5J*+8r^AB`k#iTl-8h+YHOgE)s`OyC(H zugc2PoB%Ey52P7n=%A`f+z0h0fDRM#9tU(qpbM5-74G-WEg@sHo{RY$k+8e-` zEI_{jrMox4l@;Aj;h_r-B`6QwXy6@*(ye0a8JmC!Vd5=~+JY)Hkl`pcV!%2Wc+Rp? znlZ4HIo6<*Wtlx1OCYvz{jxNppGsxGlH>8CIRjvUN=qL!%fwHN>Z002ov JPDHLkV1nPhDa!x= literal 0 HcmV?d00001 diff --git a/demo/tests/data/monsters/spider.png b/demo/tests/data/monsters/spider.png new file mode 100644 index 0000000000000000000000000000000000000000..d7aaa3bc986200c5ff3f6dfba002eedf623454f1 GIT binary patch literal 2457 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/otu_3.png b/demo/tests/data/otu_3.png new file mode 100644 index 0000000000000000000000000000000000000000..a4037f465040e8ab64e6f6b181f73deeb60ec594 GIT binary patch literal 15475 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 literal 0 HcmV?d00001 diff --git a/demo/tests/data/regenmorph_clouds.png b/demo/tests/data/regenmorph_clouds.png new file mode 100644 index 0000000000000000000000000000000000000000..801147f3263fd26adfb6bfe7894e0476b86dda85 GIT binary patch literal 82235 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 SZSbE)pz>PdRoP3kkpBbZ-to5p literal 0 HcmV?d00001 diff --git a/demo/tests/data/regenmorph_face.png b/demo/tests/data/regenmorph_face.png new file mode 100644 index 0000000000000000000000000000000000000000..2a6778b6d0e5afc1689de386d4c0a35f80259154 GIT binary patch literal 115614 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 ZJe%~j7dwf1LdG{{ZuHmDT_N literal 0 HcmV?d00001 diff --git a/demo/tests/data/shape_1.png b/demo/tests/data/shape_1.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd81240d52280a335f13b91ddcea296dade47ae GIT binary patch literal 1077 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqD;KYh+JeZVuNfGa4|%#chE&{oJI6Lp+EAcX^H5{= z7bYI_osA85)NA{e*nKygAicwoXGMA9kqtp>eTBXCzPI0zJoi0Ri^uy`<>z}7yw?J) z!3wG@=ia^g>HBw&1KT(R8VYUZ_A?yVAYsFLoYCj=vQFzF7 zE$Kk?+d6}H49>^v_wP5<74rXH-*w=T&x4nBN(?;w&1ozKTfc06#g-f*p z3h%q|T3p_T7ihA3@YY+3J22SR|MYpdmZ$kH_kxo9^#aXX6EDnRp2Ablap1-Wb5ovg zGR$f+3UdE~?&e<1yJ041iir?<_?SRxXC#Aw4-j(;_~eg2(YUw>T7sY5yO z{UdAj1Z9msj~=pe>R2-(I`WzR_a;2k1H;nO;dHJp)hRnkY+s@9-W8JWw!%H{b`{PyD10ga~ zWd20#7M@|Pxn$*sELn$FN3TWHTxEKY8Gn1hzv&Z-{r_IO_1}K(-KiV~4*B*njttjW zeg7#l82_~2w&Zrvd56UYXWbkke(ZF5k;(T#jC=mAi&}&Si;hnLzy%x z-*|goZ(rgkv$W-cbgYf&Mfv#6vi6}r9)4BW0E|%mY5zWb`KGw-VQp3Al`{*?*(Emr z4teO^w&TwE>&_34K4-QN+`?S^#?G~7k-E9cHv!Iexn1>rch^T=dV0rUHS?V>7rw51 zv|jhnjT`|k#W}nYtQ;GDM?L@i=)dW~my^3S(yP%70zFs-Iz{xQU#QB$GCOJjWG|S^f<3&%Hav gnT9oU!31x#{V#4gk~=}<<0O!fr>mdKI;Vst0Ps-M_y7O^ literal 0 HcmV?d00001 diff --git a/demo/tests/data/shape_2.png b/demo/tests/data/shape_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e6cedf5401fd0cca46992eaa13503eb3897865aa GIT binary patch literal 1157 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9xE5Gsd?Z_A4UcS78Oqy$B>F!Z|8dZ$ruVaWV_8p*zm5J!wzW7zK#Ja6rc3Uf&mw=`867zMck->CtwM{geXQoLGiQ2I)mS3#C#*D8QJv-B^_N-J z#%s^+T&5$sXo~DIliH;Z+6@b?tbL$&`(6OoJo)<}oR6-1-Bc7k^m#|R6T@1OBSIO{ z#w!&}75DU2FEesjr&wbjTOYZxxOKt1`enN}GpyY=&N5B0je(-%vLj=>> zg{$A5z22hmgN^0FtQ|pOGqjG(da!(H>Xg$*cZ)6v;hHw@f-Yy>ukuIxQdl^5%}@2N zW{zI^=}z1Mkxan_6B%Z)Oczqvem)_PMc6*$v`#^JX;A$Czg26v0%m!wNn;IW+H!)) zlJS|BL3mr7tHI<|UgAiBv0#h?u`SZ|~5v6pV;?yNvb5qi=6_ufCkax#m6V3~feTf7Y$N3p9lyV&A5* zTBN@^|CX(9$1Pv34X&@&dm3E2w|{4CLs+|m?yg@G`x<>y8m<}FpMH1mSF6HZ?hCgU zM|(|gj@;+F=C|B})W_F9t!b!c=3P>!Tl>8rp@l&^?VsvbDNY_vgY;+XSz}(`YWDHC zu#jQvmHjFYZq0xA?!h_lhH1Z^zd7{OZR>~kY@8>UWH|%8{(3X7tKENmb;lj<3EqFR zndSPkAKGqN-d{0o!RhBL&%%DsX~4Q z@iGH*$%=&chCi0hUwHIy8%F}i+s>4EDi7>?Px&ausW>z&5%IZM?ZBWeRB?idMWzcPN(?|sfssk!V8$Dc;<-N_WGrb`FgnonQGk)bW;zqrEDS7Fyg&1EEW8x0 UoV)~BmM}1Qy85}Sb4q9e0EIF45&!@I literal 0 HcmV?d00001 diff --git a/demo/tests/data/shape_3.png b/demo/tests/data/shape_3.png new file mode 100644 index 0000000000000000000000000000000000000000..403c286d303705dd6ddd291b537d97a849f97e2a GIT binary patch literal 1064 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9xE5GnV#JG?Mw^|%*Q=l978H@y`5v5^~6D-H9Bb;=N#!C;rj<3{Lb0uKI_hR z!#BKhBo05}J2UH}o00G3we`KPN^9jUzVuwE{<suo%R23?7#PA*V_1EZ`YrGYn!vyM6K4j8m2m#f#1LU;lr2bp783&b~~NUnzCx2 z@qyQ;cXvw9<(eNizlrfll*2nW`+0}Ho935!Rzw}}bKCLkgQ?2Cps%OZ4xIg~ShJ^A z^l}0>W7evwoh&boym9$g@te#1dwW4~y$08&G^r!=r}8a+S-PSyp!~zMOoNcGrw)0q zWh&BcymR(_&xVqv2BAORRbTzJ|Brx#6UW=P>0vYO6gL~@F7&VYx?{Ru!#v~cx!DI&d>1BIa<5& z>Xl3XSI=PdQu9b}-lv+Jmuc=+Bb1;X7k}^Y;mdc=e{MMabB3tqT;3w@V}^zC#zCA0 z>T&It6x8c}*=sI+$j{uNBc6OP*jZ;~)z*LUPX#PWmp;&Zx7w?rB0k~OCY|1j^^d%z z63)($ef4$g_xf<-hDnBo3<(WupEC%U9f&K8j{d)#)#CmCO>7abcU=Fx{`2|yt*;L< z2tGsrXN84U`X9}!NxCeZxgb!q z{`}h8hH3$ZPK)*a2|axL@csAww_S}Jv!u4f9gR;`Tal=jq05yY`)5|$;cG=#k00N! z`~I%>>;+r3>Q=s5`|j@QSqnmi?*DO~I#F#yO3SgX57iy}Q$zz!b1mE&^!3!#^?RH$ zbUWnlulT}v{%OsWyU)W79Fsl&=(0vwUwfXkR@Ox9hgy9-U8Jm-(oi!^iZ1SW~~PTbZu#8!P4<&v&Xq-azF)_h-*= zcxQ7UhPlV|;5BypwQu=O$)(98&#=_Ikk0V*@cd=-m?M_ve_9{-=M}HP_jcu1>uU@1 z8)mT{W{^Hw)4TsyVQ#~n->sg)LJ41X%@+$$Om27NKRlnCc}Z@q?wj0s;Aul#EU(n2{`@W X=TeCO#3Qk>8l=M0)z4*}Q$iB}ARphH literal 0 HcmV?d00001 diff --git a/demo/tests/data/shape_4.png b/demo/tests/data/shape_4.png new file mode 100644 index 0000000000000000000000000000000000000000..53edbc7b70c8f6f686268e8a5adb6872ae3c049b GIT binary patch literal 1104 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9xE5Gg`~wq`(_3P=J%d1jv*Dd-p)PfcgH}Wjo0hw!tYbV_P&u0c~o2VeBzGp zwG%3s^|V#qRXe!m`bSDWKGOI0i1Ez#lPyG6M11@IeE!DC63>A~V+AcAK41L%IQGPI zG2sM;0}M+VLi4`q{rY@(U!A*ppL-rAw^u)Wwy}eSNSm6+ zQirt<>TXXgSl{Hye5CDAz>~l^Voks8oxQ%y_HURo)v@=1-NJ)QLiYa@n;^yI&3awn zuY`i3$Tg04(%xBLk{evs$7${G*VuRD#c>AX&kpCl`wMOpS$VOa(db#D%)#XoF=j z7kgL5Wq;{5bI^JeeCT=DzxVn17tjCyRjkoh=X+KE6oc-ny8uz13s7oKnaFbX*oRCAa&MJ;PM7N+pcb)Binvo|byhOOVi6#lVZTjI2m z(~C#In33(p9IlnqF1*TG@JuA&XGMjUXc6xPuCtm8{?#;mh-r{xyI>=*%3kSMeevO^ z$tQ(2mPA_4^1XetWw(X0#+nT`?EVUU%>FK6@|O35xU)i8*H%T-se#bnd^mV(#pU4KY8xzrQ=Y zzP0UyWwb|>w#1rld-Z~@DCeA7w~d+1KArcA_Sdac^k85-z1P%J(#eVIPSmP@njg0d zCG250IxeB&@cijLv9tvF1pGa373|nnNd6M|uf4lU`Ow`15%=9|nspsMKfW!o zVBwFD{f5j6`w}78joNcU literal 0 HcmV?d00001 diff --git a/demo/tests/data/shape_5.png b/demo/tests/data/shape_5.png new file mode 100644 index 0000000000000000000000000000000000000000..3fb16d7c27788d9080fccc5611458432321c47c3 GIT binary patch literal 1089 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqD;FQ1#E~-!mJAHc=R92;Ln>~)onxCPZ79&Hd8o1b z3saNH&c?<&$7}nZ*nJnAAiYA6Wkm|Mbvf z22Sw}W^8+|zGHvPccJvp_4oYCTpzvsSFf~T2B*#4^BfF^6EE~I9NShGcK5&<<`UNL zzgNGMZQg$6@6JUVMA&>S9kl-N?qp!f_<5RNQpf07|1Zp7)|vZ1JKp_*hRTyCx!;#9_o_3z z7`$`LN(I&H8V*n5xMFo+%1`?%Uu&Bp9M@DD-aQ`_z=m@4xiTCeWT z!@`HoNrDk4*;cVk_noOS%3wv#6aIc1xC40GAPpReps#KYa^=N{;5|E%u4e@jT)q#NT{u_U* zM(-o)erCP3)6X>6kBdK#5OSO)-SD(`?LF38CTSO{WbR(w^e=9JI-6s z(EIHFwWIRfopYE?ZhcL5^4Q6^yTOUiz-+eapZd8RTi&phiQK>Te`OtuN9+X)6(J_> tc72vCmb2vy_Ir1fze@mRd7Pl3^alfb%_XmS@*Wl-MV_vHF6*2UngC^f(Q^O* literal 0 HcmV?d00001 diff --git a/demo/tests/data/shape_6.png b/demo/tests/data/shape_6.png new file mode 100644 index 0000000000000000000000000000000000000000..8cde1ed6babbd30cfcb6a6f1044cb986e789cf50 GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqD;FO>cVuS3G6n`lCQlc~kcwMx?>cfdIfyhQc8fXw zj`B|LSg=<8#ge%Tas}op#$1mpSZ*%hdC2_S_qhod?whYm>tX_$h71}mgb9ijuFQ*F zr~jaE|G8g$*Y-8;;Z!J|oxyE2|I|_YFV9z-F$yqjYe+m^w0#Eq-*wW$42%j4f0+Ng z*l=HM^R@HaO@Y!(4h$S1VU`94@;J(>r6D<5$JfsSne#wCVb+T4Yi0o1(FfvPc7#oc+K1HTDnOyRo-U3d6}R5rye-&lz~kx|tM+&M znvw|*nUk8oi5xia$w(>mYH9q=!rNEH-~0|d%na0m4A`bseQ-D;3Kp6qw=v+Q-Tr%C z|F+kC5@Xn~Z641BYXzCvbAHZan-FU^JNzEg&BU|~zZ7@WBs?#ochWOnsWuVX&PZ!6Kid%1QdGZ}H5O6*CPviUk zqRolYEKE7<*R2^IOcLf-x_Y%VOlzyl-Tl9wMCZx@H8JGGuKQ@L+bqWj;vm3+_ojcG zmdwACtMW6yq3&T)x`|Vm)E}OfHD*69azqw>P!`-4&(`00|E_VkvN6MfKkf=?2lS#J zuKmtf)^v_3dp?`0=cLUCLVy4G->l~XG#occHfoTGl4=gJzX3_DsH{K=_ur2z~gZ7$d3P0 zlQYwGF3i|d-)wg^EY&6Cj{f8Jt4AfaOUMD$GxX@G=QO7Q8Ix2zC#k%AvsruHs^8}M zGw{#&kMf4+B literal 0 HcmV?d00001 diff --git a/demo/tests/data/squares_4.png b/demo/tests/data/squares_4.png new file mode 100644 index 0000000000000000000000000000000000000000..09e0f81e89a42486e849f2da5ab5c876b2d5b6be GIT binary patch literal 216 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%0D=- ziO|d7Rw=QIufn>uqwtGJM~{x0j;*RBG<%wfjbTcJiizCFS^Q_Knc**1cAQ9; zpbSRzWz)>fTsrV9G# z&$*5d*PE@uXAV`~4oh|K`q|7GiH=W7vQFY=Ckuo|)?LyNG|oTR(XkyEP9l%~nVFaY z3ewLo)imd$(*k!nBv?Qz(DPMDt;O25IdEo@9 zrVwjaG8J80yf5I*E%;R(W$iq=-^QYL7kEw+xt~3oU28SPYwp`GnwH)VIWt}|h}ui& znNwp$P!shulJ#YvDqzrK!g(7Ipb3!>pr0dTtgs0nKm-VWt3iL1g^a>9v=fRoM`y&7 zERKbom+xoRN@A>wjgQNPq5!@U(s44lDTBh$@~)MR?WgXU2hYuHaIXneJ6G&fUV*Kz zJMF*@QvU6C&(E}WRJaKuwOgV#lNMZ5Vg16u7BuL)EnEY?1g*LT+rVaImBRA;bH#EO zUJp*#S{M_V9cS0zDkPx?x7 zML@L?*TY&&yg@e!9espJzeFXknPr4+&e;!0ds||6w-KL5`cLV{`_F`01+D`)#fD9! zj4YH{kf23NcH^Vu=)x{YHSm?lvZmL&w3MX`B%bCuoC^$V^O{WZlMwo&U*|Sa_6RyB&~p;dRyuTUYrAR!A{ISdSJmJe zCt9+J>hvy2eMJjyz*Q2#lRk68B14CK?2&K1djo#r-X4(cEySA{^M1xt<-TSFX8V;D zC-*4}TKn3_Wt6^ORU|h*vDX3RYmQdVSH#)X8t^n+Adp8@Yc|16l11hpr3QvG+m*sq z`kZ=$^7G zzF#Na)aNy9`rlu*U+G=nfq|{sN5paGd&n_W)cr(cDR(kKQbCc>Y?MI@frowk3U7v`-*hQ|EGnIHu1qR(Cks${zK3dzs*XHh33+O; zV=Tdl0gnp%OeS0vudl*mE#1Du_4H=H<@KdY8Bca!DL-Ba7kGWpi(^oE_8a`|Mw!2F zT=@R1uFtXl?EFIeR2-^je{E@L+|W3xg7@DzXITE}>QcsqEQpgnjj`_De4f^Yw(@$m zeDEN```AN#(QtHm_XfjeTJStjcX5_c-lSi_r?|t#h(x2tTW8yO<`Au7HdglNa9EgM zEooxC_%^9Jcht*1ffUPxxAn;J*!^@r_{nA+GpL;`@bgjgR^q1G_F7)*1^0 zE5|Lfv0FmftPe-7Ky4OTAuLcm**47MW_R~?{LpnIJ+$zHtIpAjm|Tbp=*6vHwfTUQ zdz*@?svBaiI15#ZOidE*ZFnHK;nuWwapv!yZxkH6)9JU2MRGfcChb=VQH-z9Vw!Gy z`J$rvhPE~#{8SDF;cbHKt>lS++D~lE>T>1!I@I-{V=DFii}EnS!W~s4RTSYlj}|0R zr7<0Y>ZTyoR3^_N5<>I{^N5he&%&yT5i(hQl2izLh!sX7QtWNy0dgPq=bCTRhG!Q| zD%{aAYZ};YQdim5T0XlTKOFIrQ^VF1A0$6{r#~)Q3V%#J{3J!>K8S+xXF3<(!na?3k|5}{Dl8W@J<20g! zIvqFA3U_`@&URGNKtIRv-$Zy?zUV-dY>Y>hgt$_hj~4W()Bl^zh$2{jkHPFAAg7aO z<$u`-TQ54u30>wyn9oonTy`R-dr)qfmE%ua*W91p4hv5^`vlhVtlrV__qYFgf+=q0 z80r%WvEU3e3)H#@sVNpR z)*&FoGe>gQgi!$(hoQ-rKMPboufK~4w7<@4z6N^UAoIFE(NRV%-mkXLhj`fss|hH% zfAE~|7*FR?$qz;&B+Oa@Q8`=lWarleTR}8sfp1v`_X%QuVGSWYAY?xHq+uo4lyK^! zNXL%?_D!UiVB~EA>{xf{P|t7?duWH${r~;OsDOR*>NAjM%agey*>1vRkpu|kHqnTBev7AZCyreI`IbBp^;Oj7s?45l_`S&J%5YUsnu%LbGIE zRzi%Od3CR?=Asp+WT_*HnL24FsO2a{T^8WBw($;x?{0l zq}rX?sd^2xjcM!rha!VU6_zAKHDsrQo)ZHj(AW1B3Zbn!F4v>_Z<{yqYkO$s^F9^v zN5%={J7L04*N)>y^z>o}wgT%51ar(ubnFnQAiVkph$t0n6M#TQ8H1&AhcNJmsfjNi zHWTD=X4@#(sw1m=ezWU~_!bYlc9~-ojFSkkB1|7-Q{RnnwSS@vLs|||dW$nHrQY^d zxVuX?_AQ<2O7v{ppj-&BT{*1F$&iu!&CS{i3OrO^}ev(Pw`e%5ge22i7_&}T;d ziOj0NnsJ-Ic-UQ9aXWgNsdaUdLMdr!*0*9_L1x?d-_wr=^^=wsOk)>}ZdT6S|a z^>0}=bY*q#aG$RJ;ZcAoat!L9gQLD4A*@?SB)bAlfVlWYkfQ##>=^5ix{ry&h{~nx z7rP9s5^37pG#ZLQb{<1XUp8|m!pW!8_WRzY&aVeM);)dJQq!5Z1y}WK@7S@4Qlb2k zhMtLC##}+?9uWSTy5$tHsg$HOy>r+St(tp@sQB+SVlBgkr%%2UJ`LxQ-?Ymzqfd^# z{7#M)3wS`^5W{*Q1Na7xmT;U$9r)%Utgo1p&Ctb(bCMJ3@gMh${1WuD#! zkyIk-%mX{~PhKY00%<0j!P1J7;Bg1VT4Ano3Ek=vyxxjz#WCOhGMhef8!zy?+hox2 zVAW9r^s^OcRH+@aD=RlJt`bKH^66Fbi-`k-gY<;}!4Uj>fS^BnW%rP!vOETE&SQG6 zu>*`$CHQu&9UDQM ziWgN|z6S^imX&UWxn}<|KE|R7ZTNp(2SnQ2_%HdX>yJ~byh+lzM+YN{Eu|gE1i>h# zBpa*4N@yDf-BEH56Gi8_Fi*n?P@0z#hjI^f#hCnVrJ$ObBlI10x<@Du9sGB^+XNl7 zH3D&kZp3kGhqNJ-G=}2emqIFaht|ar>=5=33t(zTLMGN8#E&3TSV5^`wxh4%Ux)TD zG7Pi@9jDDbvkz*eOoXH$uE@Z9CrlpBh>hGcpK`)6Wh`gQvOljOp|mR^quTVaVA zD%Oc`1*wQ4f~jJhK3(dJF14XnTUKuRGc%{Frx|QFg%{=MP&1rThl?urOP2Td<12N3 zy3cgm{e!d4i)thl9W|v3!8KYrOsVRr0R%!Xt(<%~0$D$e9Zg-+uo4a?cF|Ove8d&6 zUI-Ua!2f9hm^JG&j)me27bH<#2=y6*)QFYPX@m1C@g6qqJgTv0$b-ZAnob`{EJ)jM z;Hk77*;zW>%&})6M}w~OLX&AJ5`kDND=@@mjU{TBO2%X5f6QArjm#wy$b#&pP#}1m z6k*EC*DD``22P%)Ob-`;k#})-6OPX=9G6#3Yirht#@1P*vx8N$)@Zywh=8!vU^t#r5%(MaBz`PC~kM( z+a(~tkl&C*VdEP*$REmVZ7K;JgLh&Gq3>N?Y0dhc%zrB`XH-o)aPG8N*mZt=Z z=eYcosGgz%N7&gV?jI8M4^YXm=kkdFAKzVge7G)g^%%2y>3>v1|L0VU40?zl16N_J z1S4=Z_0i&uaY~z-Xj?O3w~ScA`4H0eCtw{;m@OgYx{Z_6qQkT6fIs^7g6}=kMBNAM zMH!1(PS)ws3qqnOL@7nBE$A7gn6uJ`*-;^$v#&vuQ`2jiHt3;ys^u{&Ms+~pwtX!M--K2zBEjig5g5(;$@rZGA2%2 z936FNbrN2jFZk%ig43&l$|uv~fg91~Norxw;uMn=k2h zI}G}Lgp$OKj8y=2U1P2FioE8_qokx<&beMKnO&Vx?8ii9m%U&QS@)=A3la24lP)08 zC~6{%h`ceSnLN8Kq0VNIwml!%-bo8_M}Yut3-ocjI@~xA8v?Ne+F{8-GUhlPk;V^E zGV<-Z*0^ehDX+15MG$86gNiJi(F;ekf(1f_xNwKkb(p6yJF><3a>=OB)Hb5m3OLGY z_Mk-$an`CdUH=*Tw{s?v_>LucKx|nj5au>HXC8*q%RKQHnz?4iJDBojVzN58wuIr za^B+GAJ_chx8{_p!~V`OLMrC7oWWp+POD8E$4DvANS3o9ZWXXH3-ZEHYpb0U_1FI8 z9}B?!`d5GXZ(Ij(f?fTFt4F^ZRP!%Mk+*~}(uxQxGP3<6(vw{r5wb2Z^Y7wT7X&gw zgav_2yhuc7AHwJau@Z!dWVH+!e)0(c@6+08^Um*&`Gap%jJ4v;FLwAxzx^hUAE&g_ zlCrM(=%wYmKdiVM#dNxR{QS?}BTgk}FPD7hoe|G2N=hAJU4V0GBkA{R!R2Di<;5vs z5>rZ)dUkn-rk03mC%Xro0REq7ST6AIVz|Gt0| z^(}D1y1T1CKgrreVy^=#Z>7LDQ0

  • xN(4K>l;bpKuiHYZhVo-I)>Y`mDUJ$k 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 O8i@U^tJQXQp8OAoNx~!m literal 0 HcmV?d00001 diff --git a/demo/tests/data/transformer_2.png b/demo/tests/data/transformer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c159a5f089100d63f72b346f7f04549915ca50ef GIT binary patch literal 59487 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 Q2m4ww5{lwAqQ)Wr2meGRGynhq literal 0 HcmV?d00001 diff --git a/demo/tests/data/volatile_1.png b/demo/tests/data/volatile_1.png new file mode 100644 index 0000000000000000000000000000000000000000..143c0625fa743963165ef41e2875ba07426618da GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9xFQ^hwyj3wpT!*UQZXtkcwMxZ+LSZHsEn^)c(GIa}i^*lh~$>Y1ec^)+_$& zVPq%~y>Be^@Ko+`Z4p#E~Gmg=@<_c7_D`0FC1(j`nwEGp}L0 zFRA1wz0b;Njzvvsi$&>=RUCfJ>i>U>`Zsb5GO`FbFq~e{J3;+G d9m2ry;t8v!rh;a)QmP4v>*?y}vd$@?2>{(WOe6pR literal 0 HcmV?d00001 diff --git a/demo/tests/data/volatile_2.png b/demo/tests/data/volatile_2.png new file mode 100644 index 0000000000000000000000000000000000000000..dc2f5d475101abc8a5c01ad24658cb3957e28c1f GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9xFQ^o03KG>NucKwx^3@NX4zUH!kuXP~dQIEcidSl-YjbiMvd?>(#=Pfhrgn z5_;CuJ?OhJefr6K<~wZll1jUI<7E}C`QjxNck{)ICf;O~s{h*+YEZ|@q0qp{XE z)7O>#9xFQ^o3`V6;a@*;N^TkUl?&gaZO}xn}RsXju)S!-)L!p6z=?2?h rj!4FHOn%Mpn59}O3YA$vh8$2~KRRDbCM=In7sT~+^>bP0l+XkKp$#~% literal 0 HcmV?d00001 diff --git a/demo/tests/data/volatile_4.png b/demo/tests/data/volatile_4.png new file mode 100644 index 0000000000000000000000000000000000000000..eeeca9281793ea4d03383cd8101023aee05a985e GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqD?6XOuJIZ9>p-DyPZ!6Kid%1Q1PV1MaIiYO{8zq> z+vJ+~q&IN~Dh!#eK$b8tY!ST4e$MdOqvS_77{XfL^C+znoiFPYqGM;=vLdP`jAOcH zz>oLoC62%O1R5Av6c~~(C@o>W!+M8pFS`gw((!JA2G$wkB0~IIm%wn4Roq=J&dTGCX3YzbXx|e}$^mO%eS?83{1OSucQ~>}0 literal 0 HcmV?d00001 diff --git a/demo/tests/output/.gitignore b/demo/tests/output/.gitignore new file mode 100644 index 0000000..5e7d273 --- /dev/null +++ b/demo/tests/output/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore diff --git a/demo/tests/test_armors.sh b/demo/tests/test_armors.sh new file mode 100755 index 0000000..6ae9916 --- /dev/null +++ b/demo/tests/test_armors.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# ImageMagick is needed for these tests to run properly. + +cd output + +# TEST: Many Armors +TITLE="armors" +../../atomorph -f test_${TITLE} -i ../data/armors --blobs-as-texture -F 120 --verbose -m -1 -O 60 -D 2 a-0.png a-1.png a-2.png a-3.png a-4.png a-5.png a-6.png a-7.png a-8.png a-9.png a-10.png a-11.png a-12.png a-13.png a-14.png a-15.png a-16.png a-17.png a-18.png a-19.png +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif +montage test_${TITLE}_*.png -tile 10x12 -geometry 64x64+1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten -quality 50 montage_${TITLE}.jpg +rm montage_${TITLE}.png + diff --git a/demo/tests/test_battlelord.sh b/demo/tests/test_battlelord.sh new file mode 100755 index 0000000..b44e34c --- /dev/null +++ b/demo/tests/test_battlelord.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# ImageMagick is needed for these tests to run properly. + +cd output + +# TEST: Battle Lord +TITLE="battlelord" +../../atomorph -f test_${TITLE} -i ../data --blobs-as-texture battlelord_1.png battlelord_2.png battlelord_3.png battlelord_4.png battlelord_5.png battlelord_6.png -F 48 --verbose -m -1 -O 60 -D 2 +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif +montage test_${TITLE}_*.png -tile 8x6 -geometry 64x64+1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten -quality 50 montage_${TITLE}.jpg +rm montage_${TITLE}.png + diff --git a/demo/tests/test_cat.sh b/demo/tests/test_cat.sh new file mode 100755 index 0000000..a73ada7 --- /dev/null +++ b/demo/tests/test_cat.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# ImageMagick is needed for these tests to run properly. + +cd output + +# TEST: Walking Cat +TITLE="cat" +../../atomorph -f test_${TITLE} -i ../data --blobs-as-texture cat_1.png cat_2.png cat_3.png cat_4.png cat_5.png cat_6.png -F 48 -t 5 --verbose -m 4 -M 5 -O 10 -D 2 -B 32 -c 2 -p 5 -z 1 --blend-blobs +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif +montage test_${TITLE}_*.png -tile 8x6 -geometry 64x64+1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten -quality 50 montage_${TITLE}.jpg +rm montage_${TITLE}.png + diff --git a/demo/tests/test_combine.sh b/demo/tests/test_combine.sh new file mode 100755 index 0000000..8742112 --- /dev/null +++ b/demo/tests/test_combine.sh @@ -0,0 +1,59 @@ +#!/bin/bash +# ImageMagick is needed for these tests to run properly. + +cd output + +TITLE="combine" + +# TEST: Combine Layers +# This test shows that individual morphs +# can be combined together with ImageMagick. +../../atomorph -f test_body -i ../data/battlelord --blobs-as-texture body_1.png body_2.png body_3.png body_4.png body_5.png body_6.png -F 48 --verbose -m -1 -O 60 -D 2 +convert +append test_body_*.png strip_body.png +rm test_body_*.png + +../../atomorph -f test_head -i ../data/battlelord --blobs-as-texture head_1.png head_2.png head_3.png head_4.png head_5.png head_6.png -F 48 --verbose -m -1 -O 30 -D 2 +convert +append test_head_*.png strip_head.png +rm test_head_*.png + +../../atomorph -f test_lleg -i ../data/battlelord --blobs-as-texture lleg_1.png lleg_2.png lleg_3.png lleg_4.png lleg_5.png lleg_6.png -F 48 --verbose -m -1 -O 5 -D 2 +convert +append test_lleg_*.png strip_lleg.png +rm test_lleg_*.png + +../../atomorph -f test_lfoot -i ../data/battlelord --blobs-as-texture lfoot_1.png lfoot_2.png lfoot_3.png lfoot_4.png lfoot_5.png lfoot_6.png -F 48 --verbose -m -1 -O 5 -D 2 +convert +append test_lfoot_*.png strip_lfoot.png +rm test_lfoot_*.png + +../../atomorph -f test_rleg -i ../data/battlelord --blobs-as-texture rleg_1.png rleg_2.png rleg_3.png rleg_4.png rleg_5.png rleg_6.png -F 48 --verbose -m -1 -O 20 -D 2 +convert +append test_rleg_*.png strip_rleg.png +rm test_rleg_*.png + +../../atomorph -f test_rfoot -i ../data/battlelord --blobs-as-texture rfoot_1.png rfoot_2.png rfoot_3.png rfoot_4.png rfoot_5.png rfoot_6.png -F 48 --verbose -m -1 -O 5 -D 2 +convert +append test_rfoot_*.png strip_rfoot.png +rm test_rfoot_*.png + +../../atomorph -f test_rarm -i ../data/battlelord --blobs-as-texture rarm_1.png rarm_2.png rarm_3.png rarm_4.png rarm_5.png rarm_6.png -F 48 --verbose -m -1 -O 30 -D 2 +convert +append test_rarm_*.png strip_rarm.png +rm test_rarm_*.png + +../../atomorph -f test_rhand -i ../data/battlelord --blobs-as-texture rhand_1.png rhand_2.png rhand_3.png rhand_4.png rhand_5.png rhand_6.png -F 48 --verbose -m -1 -O 30 -D 2 +convert +append test_rhand_*.png strip_rhand.png +rm test_rhand_*.png + +convert strip_lfoot.png strip_rfoot.png strip_lleg.png strip_rleg.png strip_body.png strip_rarm.png strip_rhand.png strip_head.png -background none -flatten strip_${TITLE}.png +rm strip_body.png +rm strip_head.png +rm strip_lleg.png +rm strip_lfoot.png +rm strip_rleg.png +rm strip_rfoot.png +rm strip_rarm.png +rm strip_rhand.png +convert strip_${TITLE}.png -crop 128x128 +repage test_${TITLE}_%04d.png +rm strip_${TITLE}.png +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif +montage test_${TITLE}_*.png -tile 8x6 -geometry 64x64+1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten montage_${TITLE}.jpg +rm montage_${TITLE}.png + diff --git a/demo/tests/test_fluid.sh b/demo/tests/test_fluid.sh new file mode 100755 index 0000000..02aa5c7 --- /dev/null +++ b/demo/tests/test_fluid.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# ImageMagick is needed for these tests to run properly. + +TITLE="fluid" + +cd output + +# TEST: A Morph of Unrelated Photos using Fluid Dynamics +../../atomorph -f test_${TITLE} -i ../data flowers.png merilin.png --blobs-as-texture --verbose -c 2 -p 3 -z 1 -M 10 -O 50 --blob-feather 256 --keep-background -F 96 -B 256 -L 10 +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif + +convert +append test_${TITLE}_*.png strip_${TITLE}.png +rm test_${TITLE}_*.png +convert strip_${TITLE}.png -crop 256x256 +repage test_${TITLE}_%04d.png + +for i in 1 2 3 +do + rm test_${TITLE}_*1.png + rm test_${TITLE}_*3.png + rm test_${TITLE}_*5.png + rm test_${TITLE}_*7.png + rm test_${TITLE}_*9.png + convert +append test_${TITLE}_*.png strip_${TITLE}.png + rm test_${TITLE}_*.png + convert strip_${TITLE}.png -crop 256x256 +repage test_${TITLE}_%04d.png +done +rm strip_${TITLE}.png + +montage test_${TITLE}_*.png -tile 3x4 -geometry 256x256+1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten -quality 50 montage_${TITLE}.jpg +rm montage_${TITLE}.png + + diff --git a/demo/tests/test_food.sh b/demo/tests/test_food.sh new file mode 100755 index 0000000..d95ab40 --- /dev/null +++ b/demo/tests/test_food.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# ImageMagick is needed for these tests to run properly. + +cd output + +# TEST 1: fruit +TITLE="fruit" +../../atomorph -f test_${TITLE} -i ../data/food --blobs-as-texture fruit_1.png fruit_2.png fruit_3.png -F 24 --verbose -m -1 -O 60 -D 2 +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif +montage test_${TITLE}_*.png -tile 8x3 -geometry 64x64+1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten -quality 90 montage_${TITLE}.jpg +rm montage_${TITLE}.png + +# TEST 2: berry +TITLE="berry" +../../atomorph -f test_${TITLE} -i ../data/food --blobs-as-texture berry_1.png berry_2.png berry_3.png berry_4.png berry_5.png berry_6.png -F 48 --verbose -m -1 -O 60 -D 2 +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif +montage test_${TITLE}_*.png -tile 8x6 -geometry 64x64+1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten -quality 90 montage_${TITLE}.jpg +rm montage_${TITLE}.png + +# TEST 3: lettuce +TITLE="lettuce" +../../atomorph -f test_${TITLE} -i ../data/food --blobs-as-texture lettuce_1.png lettuce_2.png lettuce_3.png lettuce_4.png lettuce_5.png lettuce_6.png -F 48 --verbose -m -1 -O 60 -D 2 +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif +montage test_${TITLE}_*.png -tile 8x6 -geometry 64x64+1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten -quality 90 montage_${TITLE}.jpg +rm montage_${TITLE}.png + +# TEST 4: spice +TITLE="spice" +../../atomorph -f test_${TITLE} -i ../data/food --blobs-as-texture spice_1.png spice_2.png spice_3.png spice_4.png spice_5.png spice_6.png -F 48 --verbose -m -1 -O 60 -D 2 +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif +montage test_${TITLE}_*.png -tile 8x6 -geometry 64x64+1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten -quality 90 montage_${TITLE}.jpg +rm montage_${TITLE}.png diff --git a/demo/tests/test_monsters.sh b/demo/tests/test_monsters.sh new file mode 100755 index 0000000..02a1972 --- /dev/null +++ b/demo/tests/test_monsters.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# ImageMagick is needed for these tests to run properly. + +cd output + +# TEST: Doom Monsters +TITLE="monsters" +../../atomorph -f test_${TITLE} -i ../data/monsters --blobs-as-texture -F 112 --verbose -m -1 -O 60 -D 4 hero.png d.png cg.png cd.png baron.png imp.png mc.png pain.png spider.png vile.png sg.png revenant.png zm.png hk.png +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif +rm test_${TITLE}_*.png +../../atomorph -f test_${TITLE} -i ../data/monsters --blobs-as-texture -F 24 --verbose -m -1 -O 60 -D 4 hero.png d.png cg.png cd.png baron.png imp.png mc.png pain.png spider.png vile.png revenant.png hk.png +montage test_${TITLE}_*.png -tile 4x6 -geometry 128x128+1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten -quality 50 montage_${TITLE}.jpg +rm montage_${TITLE}.png + diff --git a/demo/tests/test_perlin.sh b/demo/tests/test_perlin.sh new file mode 100755 index 0000000..b3029bb --- /dev/null +++ b/demo/tests/test_perlin.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# ImageMagick is needed for these tests to run properly. + +cd output + +# TEST: Perlin Noise Dependent Colour Interpolation +TITLE="perlin" +../../atomorph -f test_${TITLE} -i ../data --blobs-as-texture RGB_1.png RGB_2.png RGB_3.png RGB_4.png -F 32 --verbose -c 0 -p 1 -z 0 -O 1 -D 1 +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif +montage test_${TITLE}_*.png -tile 8x4 -geometry +1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten montage_${TITLE}.jpg +rm montage_${TITLE}.png + diff --git a/demo/tests/test_quick.sh b/demo/tests/test_quick.sh new file mode 100755 index 0000000..e4e0540 --- /dev/null +++ b/demo/tests/test_quick.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# ImageMagick is needed for these tests to run properly. + +cd output + +# TEST 1: Volatile Blobs +# AtoMorph does not require all blobs to +# have correspondences on all key frames. +TITLE="volatile" +../../atomorph -f test_${TITLE} -i ../data --blobs-as-texture volatile_1.png volatile_2.png volatile_3.png volatile_4.png -F 32 --verbose -c 1 -p 0 -z 0 -O 1 -D 1 +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif +montage test_${TITLE}_*.png -tile 8x4 -geometry +1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten montage_${TITLE}.jpg +rm montage_${TITLE}.png + + +# TEST 2: Empty Key Frames +# AtoMorph intuitively handles the situations +# where some key frames are completely empty. +TITLE="empty" +../../atomorph -f test_${TITLE} -i ../data --blobs-as-texture RGB_1.png empty.png squares_4.png volatile_1.png volatile_4.png -F 40 --verbose -c 1 -p 1 -z 1 -O 1 -D 1 +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif +montage test_${TITLE}_*.png -tile 8x5 -geometry +1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten montage_${TITLE}.jpg +rm montage_${TITLE}.png + + +# TEST 3: Simple Fluid +TITLE="fluid_simple" +../../atomorph -f test_${TITLE} -i ../data --blobs-as-texture volatile_1.png volatile_4.png -F 48 --verbose -c 1 -p 0 -z 0 -M 1 -O 1 -D 1 -L 10 +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif +montage test_${TITLE}_*.png -tile 8x6 -geometry +1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten montage_${TITLE}.jpg +rm montage_${TITLE}.png + +# TEST 4: Chaotic Fluid +TITLE="fluid_chaotic" +../../atomorph -f test_${TITLE} -i ../data --blobs-as-texture volatile_1.png RGB_1.png squares_1.png -F 48 --verbose -c 0 -p 1 -z 0 -M 1 -O 1 -D 1 -L 10 --blob-feather 1 +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif +montage test_${TITLE}_*.png -tile 8x6 -geometry +1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten montage_${TITLE}.jpg +rm montage_${TITLE}.png + diff --git a/demo/tests/test_regenmorph.sh b/demo/tests/test_regenmorph.sh new file mode 100755 index 0000000..c2580a5 --- /dev/null +++ b/demo/tests/test_regenmorph.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# ImageMagick is needed for these tests to run properly. + +TITLE="regenmorph" + +cd output + +# TEST: A Morph of Unrelated Photos using Fluid Dynamics +../../atomorph -f test_${TITLE} -i ../data regenmorph_clouds.png regenmorph_face.png --blobs-as-texture --verbose -c 2 -p 3 -z 1 -M 10 -O 50 --blob-feather 256 --keep-background -F 96 -B 256 -L 10 +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif + +convert +append test_${TITLE}_*.png strip_${TITLE}.png +rm test_${TITLE}_*.png +convert strip_${TITLE}.png -crop 300x400 +repage test_${TITLE}_%04d.png + +for i in 1 2 3 +do + rm test_${TITLE}_*1.png + rm test_${TITLE}_*3.png + rm test_${TITLE}_*5.png + rm test_${TITLE}_*7.png + rm test_${TITLE}_*9.png + convert +append test_${TITLE}_*.png strip_${TITLE}.png + rm test_${TITLE}_*.png + convert strip_${TITLE}.png -crop 300x400 +repage test_${TITLE}_%04d.png +done +rm strip_${TITLE}.png + +montage test_${TITLE}_*.png -tile 6x2 -geometry 300x400+1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten -quality 50 montage_${TITLE}.jpg +rm montage_${TITLE}.png + + diff --git a/demo/tests/test_rotation.sh b/demo/tests/test_rotation.sh new file mode 100755 index 0000000..c8f844a --- /dev/null +++ b/demo/tests/test_rotation.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# ImageMagick is needed for these tests to run properly. + +cd output + +# TEST 1: Rotation +# Intuitively, this test should generate a +# perfectly rotating star. However, instead +# it generates interestingly anomalous yet +# smooth rotation. +TITLE="rotation" +../../atomorph -f test_${TITLE} -i ../data --blobs-as-texture shape_1.png shape_2.png shape_3.png shape_4.png shape_5.png shape_6.png -F 48 --verbose -t 255 -M 1 -O 10 -D 2 +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif +montage test_${TITLE}_*.png -tile 8x6 -geometry 64x64+1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten montage_${TITLE}.jpg +rm montage_${TITLE}.png + diff --git a/demo/tests/test_spline.sh b/demo/tests/test_spline.sh new file mode 100755 index 0000000..d198ba6 --- /dev/null +++ b/demo/tests/test_spline.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# ImageMagick is needed for these tests to run properly. + +cd output + +# TEST: Spline Interpolation +../../atomorph -f test_motion_none -i ../data --blobs-as-texture dots_1.png dots_2.png dots_3.png dots_4.png -F 80 --verbose -c 0 -p 0 -z 1 -O 1 -D 1 --fading-linear --motion-none +../../atomorph -f test_motion_linear -i ../data --blobs-as-texture dots_1.png dots_2.png dots_3.png dots_4.png -F 80 --verbose -c 0 -p 0 -z 1 -O 1 -D 1 --fading-linear --motion-linear +../../atomorph -f test_motion_spline -i ../data --blobs-as-texture dots_1.png dots_2.png dots_3.png dots_4.png -F 80 --verbose -c 0 -p 0 -z 1 -O 1 -D 1 --fading-linear --motion-spline +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose none test_motion_none_*.png test_motion_none.gif +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose none test_motion_linear_*.png test_motion_linear.gif +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose none test_motion_spline_*.png test_motion_spline.gif +convert test_motion_none_*.png -layers flatten montage_motion_none.png +convert test_motion_linear_*.png -layers flatten montage_motion_linear.png +convert test_motion_spline_*.png -layers flatten montage_motion_spline.png +rm test_motion_none_*.png +rm test_motion_linear_*.png +rm test_motion_spline_*.png +convert montage_motion_none.png -background white -flatten montage_motion_none.jpg +convert montage_motion_linear.png -background white -flatten montage_motion_linear.jpg +convert montage_motion_spline.png -background white -flatten montage_motion_spline.jpg +rm montage_motion_none.png +rm montage_motion_linear.png +rm montage_motion_spline.png + + diff --git a/demo/tests/test_transformer.sh b/demo/tests/test_transformer.sh new file mode 100755 index 0000000..41fabb1 --- /dev/null +++ b/demo/tests/test_transformer.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# ImageMagick is needed for these tests to run properly. + +cd output + +# TEST: Transformer +TITLE="transformer" +../../atomorph -f test_${TITLE} -i ../data --blobs-as-texture transformer_1.png transformer_2.png -F 32 --verbose -b 128 -M 5 -O 30 -D 2 -p 3 -c 4 -z 2 --finite +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif +montage test_${TITLE}_*.png -tile 8x4 -geometry 64x64+1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten -quality 50 montage_${TITLE}.jpg +rm montage_${TITLE}.png + diff --git a/demo/tests/test_unrelated.sh b/demo/tests/test_unrelated.sh new file mode 100755 index 0000000..2779c65 --- /dev/null +++ b/demo/tests/test_unrelated.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# ImageMagick is needed for these tests to run properly. + +TITLE="unrelated" + +cd output + +# TEST: A Morph of Unrelated Photos using Fluid Dynamics +../../atomorph -f test_${TITLE} -i ../data flowers.png merilin.png --blobs-as-texture --verbose --blend-blobs -c 2 -p 3 -z 1 -M 10 -O 50 --finite --blob-feather 4 --keep-background -F 48 -B 256 +convert -channel A -threshold 99% -delay 10 -loop 0 -dispose background test_${TITLE}_*.png test_${TITLE}.gif + +convert +append test_${TITLE}_*.png strip_${TITLE}.png +rm test_${TITLE}_*.png +convert strip_${TITLE}.png -crop 256x256 +repage test_${TITLE}_%04d.png + +for i in 1 2 +do + rm test_${TITLE}_*1.png + rm test_${TITLE}_*3.png + rm test_${TITLE}_*5.png + rm test_${TITLE}_*7.png + rm test_${TITLE}_*9.png + convert +append test_${TITLE}_*.png strip_${TITLE}.png + rm test_${TITLE}_*.png + convert strip_${TITLE}.png -crop 256x256 +repage test_${TITLE}_%04d.png +done +rm strip_${TITLE}.png + +montage test_${TITLE}_*.png -tile 4x3 -geometry 128x128+1+1 -frame 3 -background white -bordercolor white montage_${TITLE}.png +rm test_${TITLE}_*.png +convert montage_${TITLE}.png -background white -flatten -quality 50 montage_${TITLE}.jpg +rm montage_${TITLE}.png + + diff --git a/demo/tests/tests.sh b/demo/tests/tests.sh new file mode 100755 index 0000000..b1693b0 --- /dev/null +++ b/demo/tests/tests.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# ImageMagick is needed for these tests to run properly. + +./test_quick.sh +./test_perlin.sh +./test_rotation.sh +./test_spline.sh +./test_transformer.sh +./test_armors.sh +./test_battlelord.sh +./test_cat.sh +./test_combine.sh +./test_fluid.sh +./test_food.sh +./test_monsters.sh +./test_unrelated.sh +./test_regenmorph.sh + diff --git a/fluidmodel.cpp b/fluidmodel.cpp new file mode 100644 index 0000000..4c5a8a0 --- /dev/null +++ b/fluidmodel.cpp @@ -0,0 +1,602 @@ +/* + * See Copyright Notice in fluidmodel.h + * See Copyright Notice in atomorph.h + * + */ + +#include +#include + +#include "fluidmodel.h" + +Material::Material(double m_, + double rd_, + double k_, + double v_, + double d_, + double g_) + :m(m_), + rd(rd_), + k(k_), + v(v_), + d(d_), + g(g_) { + +} + + +Particle::Particle() { + +} + +Particle::Particle(Material *mat_, + double x_, + double y_, + double u_, + double v_) + :mat(mat_), + x(x_), + y(y_), + u(u_), + v(v_), + dudx(0.0), + dudy(0.0), + dvdx(0.0), + dvdy(0.0), + cx(0.0), + cy(0.0) { + + std::fill(px, px + 3, 0.0); + std::fill(gx, gx + 3, 0.0); + std::fill(py, py + 3, 0.0); + std::fill(gy, gy + 3, 0.0); + +} + + +Node::Node() + :m(0.0), + d(0.0), + gx(0.0), + gy(0.0), + u(0.0), + v(0.0), + ax(0.0), + ay(0.0), + active(false) { + +} + +void Node::clear() { + m = d = gx = gy = u = v = ax = ay = 0.0; + r = 0.0; + g = 0.0; + b = 0.0; + a = 0.0; + weight = 0.0; + active = false; +} + +void Particle::clear() { + u = 0.0; + v = 0.0; + dudx = 0.0; + dudy = 0.0; + dvdx = 0.0; + dvdy = 0.0; + cx = 0.0; + cy = 0.0; + strength = 1.0; + std::fill(px, px + 3, 0.0); + std::fill(gx, gx + 3, 0.0); + std::fill(py, py + 3, 0.0); + std::fill(gy, gy + 3, 0.0); + source_owner = false; +} + +void Particle::copy_from(Particle *p) { + x = p->x; + y = p->y; + gravity_x = p->gravity_x; + gravity_y = p->gravity_y; + freedom_r = p->freedom_r; + R = p->R; G = p->G; B = p->B; A = p->A; + r = p->r; g = p->g; b = p->b; a = p->a; +} + +FluidModel::FluidModel(unsigned gsizeX_, + unsigned gsizeY_, + unsigned particle_count_) + :particles(NULL), + gsizeX(gsizeX_), + gsizeY(gsizeY_), + particle_count(particle_count_), + active(NULL), + activeCount(0), + water(1.0, 1.0, 1.0, 1.0, 1.0, 1.0), + pressed(false), + pressedprev(false), + mx(0.0), + my(0.0), + mxprev(0.0), + myprev(0.0), + grid(NULL), + lines(NULL) { + + grid = new Node *[gsizeX]; + for (unsigned i = 0; i < gsizeX; ++i) { + grid[i] = new Node[gsizeY]; + } + for (size_t j=0; jclear(); + } + activeCount = 0; + + double phi; + double x, y; + double fx = 0.0, fy = 0.0; + + Particle *p; + Node *n; + + for (unsigned i = 0; i < particle_count; ++i) { + p = particles + i; + if (p->active == false) continue; // CUSTOMIZATION + + p->cx = static_cast(p->x - 0.5); + p->cy = static_cast(p->y - 0.5); + + x = p->cx - p->x; + + p->px[0] = (0.5 * x * x + 1.5 * x + 1.125); + p->gx[0] = (x + 1.5); + x += 1.0; + p->px[1] = (-x * x + 0.75); + p->gx[1] = (-2.0 * x); + x += 1.0; + p->px[2] = (0.5 * x * x - 1.5 * x + 1.125); + p->gx[2] = (x - 1.5); + + y = p->cy - p->y; + + p->py[0] = (0.5 * y * y + 1.5 * y + 1.125); + p->gy[0] = (y + 1.5); + y += 1.0; + p->py[1] = (-y * y + 0.75); + p->gy[1] = (-2.0 * y); + y += 1.0; + p->py[2] = (0.5 * y * y - 1.5 * y + 1.125); + p->gy[2] = (y - 1.5); + + for (unsigned i = 0; i < 3; ++i) { + for (unsigned j = 0; j < 3; ++j) { + n = grid[p->cx + i] + p->cy + j; + if (not n->active) { + active[activeCount++] = n; + n->active = true; + } + + phi = p->px[i] * p->py[j]; + n->m += phi * p->mat->m; + n->d += phi; + n->gx += p->gx[i] * p->py[j]; + n->gy += p->px[i] * p->gy[j]; + + // CUSTOM: + if (p->mature && p->strength > 0.0) { + double new_w = p->strength; + double old_w = n->weight; + double sum_w = new_w + old_w; + n->r = (old_w * n->r + new_w * p->r)/sum_w; + n->g = (old_w * n->g + new_w * p->g)/sum_w; + n->b = (old_w * n->b + new_w * p->b)/sum_w; + n->a = (old_w * n->a + new_w * p->a)/sum_w; + n->weight = sum_w; + } + // END OF CUSTOM + } + } + + } + + unsigned cx, cy; + unsigned cxi, cyi; + + double pdx, pdy; + double C20, C02, C30, C03; + double C21, C31, C12, C13, C11; + + double csum1, csum2; + + double u, u2, u3; + double v, v2, v3; + + double vx, vy; + + double density; + double pressure; + double weight; + + Node *n01, *n02, *n11, *n12; + + for (unsigned i = 0; i < particle_count; ++i) { + p = particles + i; + if (p->active == false) continue; // CUSTOMIZATION + + cx = static_cast(p->x); + cy = static_cast(p->y); + cxi = cx + 1; + cyi = cy + 1; + + n01 = grid[cx] + cy; + n02 = grid[cx] + cyi; + n11 = grid[cxi] + cy; + n12 = grid[cxi] + cyi; + + pdx = n11->d - n01->d; + pdy = n02->d - n01->d; + C20 = 3.0 * pdx - n11->gx - 2.0 * n01->gx; + C02 = 3.0 * pdy - n02->gy - 2.0 * n01->gy; + C30 = -2.0 * pdx + n11->gx + n01->gx; + C03 = -2.0 * pdy + n02->gy + n01->gy; + + csum1 = n01->d + n01->gy + C02 + C03; + csum2 = n01->d + n01->gx + C20 + C30; + + C21 = 3.0 * n12->d - 2.0 * n02->gx - n12->gx - + 3.0 * csum1 - C20; + C31 = -2.0 * n12->d + n02->gx + n12->gx + + 2.0 * csum1 - C30; + C12 = 3.0 * n12->d - 2.0 * n11->gy - n12->gy - + 3.0 * csum2 - C02; + C13 = -2.0 * n12->d + n11->gy + n12->gy + + 2.0 * csum2 - C03; + C11 = n02->gx - C13 - C12 - n01->gx; + + u = p->x - cx; + u2 = u * u; + u3 = u * u2; + v = p->y - cy; + v2 = v * v; + v3 = v * v2; + + density = n01->d + n01->gx * u + + n01->gy * v + C20 * u2 + + C02 * v2 + C30 * u3 + + C03 * v3 + C21 * u2 * v + + C31 * u3 * v + C12 * u * v2 + + C13 * u * v3 + C11 * u * v; + + pressure = density - 1.0; + if (pressure > 2.0) { + pressure = 2.0; + } + + fx = fy = 0.0; + + if (p->x < 4.0) { + fx += p->mat->m * (4.0 - p->x); + } else if (p->x > gsizeX - 5) { + fx += p->mat->m * (gsizeX - 5 - p->x); + } + + if (p->y < 4.0) { + fy += p->mat->m * (4.0 - p->y); + } else if (p->y > gsizeY - 5) { + fy += p->mat->m * (gsizeY - 5 - p->y); + } + + if (drag) { + vx = fabs(p->x - mx); + vy = fabs(p->y - my); + if (vx < 10.0 and vy < 10.0) { + weight = p->mat->m * (1.0 - vx * 0.1) * + (1.0 - vy * 0.1); + fx += weight * (mdx - p->u); + fy += weight * (mdy - p->v); + } + } + + for (unsigned i = 0; i < 3; ++i) { + for (unsigned j = 0; j < 3; ++j) { + n = grid[p->cx + i] + p->cy + j; + phi = p->px[i] * p->py[j]; + n->ax += -((p->gx[i] * p->py[j]) * pressure) + fx * phi; + n->ay += -((p->px[i] * p->gy[j]) * pressure) + fy * phi; + } + } + } + + for (unsigned i = 0; i < activeCount; ++i) { + n = active[i]; + if (n->m > 0.0) { + n->ax /= n->m; + n->ay /= n->m; + + //ORIGINALLY GRAVITY WAS INDICATED BY THESE: + //n->ay += 0.03; + //n->ax += 0.03; + } + } + + double mu, mv; + + for (unsigned pi = 0; pi < particle_count; ++pi) { + p = particles + pi; + if (p->active == false) continue; // CUSTOMIZATION + + for (unsigned i = 0; i < 3; ++i) { + for (unsigned j = 0; j < 3; ++j) { + n = grid[p->cx + i] + p->cy + j; + phi = p->px[i] * p->py[j]; + + /* CUSTOM STUFF */ + double custom_ax=0.0; + double custom_ay=0.0; + { + double x1 = p->x; + double y1 = p->y; + double x2 = p->gravity_x; + double y2 = p->gravity_y; + double a = 0.03; + + // Gravitate towards (x2, y2). + double A = std::abs(y1 - y2); + double B = std::abs(x1 - x2); + double C = std::sqrt(A*A + B*B); + + if (a >= C) a = C; + + if (B <= 0.0) { + if (y2 <= y1) custom_ay -= a; + else custom_ay += a; + } + else if (C > 0.0) { + double dx = (a * B) / C; + double dy = (A *dx) / B; + + if (x1 <= x2) custom_ax += dx; + else custom_ax -= dx; + + if (y1 <= y2) custom_ay += dy; + else custom_ay -= dy; + } + } + /* END OF CUSTOM STUFF */ + + p->u += phi * (n->ax+custom_ax); + p->v += phi * (n->ay+custom_ay); + + } + } + mu = p->mat->m * p->u; + mv = p->mat->m * p->v; + if (p->mature == false) { + mu *= 0.0; + mv *= 0.0; + } + for (unsigned i = 0; i < 3; ++i) { + for (unsigned j = 0; j < 3; ++j) { + n = grid[p->cx + i] + p->cy + j; + phi = p->px[i] * p->py[j]; + n->u += phi * mu; + n->v += phi * mv; + } + } + } + + for (unsigned i = 0; i < activeCount; ++i) { + n = active[i]; + if (n->m > 0.0) { + n->u /= n->m; + n->v /= n->m; + } + } + + double gu, gv; + + for (unsigned i = 0; i < particle_count; ++i) { + p = particles + i; + + // CUSTOMIZATION: + if (p->active == false) continue; + double nR = 0.0, nG = 0.0, nB = 0.0, nA = 0.0; + double weight = 0.0; + // END OF CUSTOMIZATION + + gu = 0.0; + gv = 0.0; + for (unsigned ii = 0; ii < 3; ++ii) { + for (unsigned j = 0; j < 3; ++j) { + n = grid[p->cx + ii] + p->cy + j; + phi = p->px[ii] * p->py[j]; + gu += phi * n->u; + gv += phi * n->v; + + if (n->weight > 0.0) { + weight += n->weight; + nR += n->r * n->weight; + nG += n->g * n->weight; + nB += n->b * n->weight; + nA += n->a * n->weight; + } + } + } + + // CUSTOMIZATION: + if (weight > 0.0) { + double wr = 1.0; + double wg = 1.0; + double wb = 1.0; + double wa = 1.0; + nR /= weight; wr = std::abs(nR - p->R); + nG /= weight; wg = std::abs(nG - p->G); + nB /= weight; wb = std::abs(nB - p->B); + nA /= weight; wa = std::abs(nA - p->A); + + if (p->mature == false) { + p->r = nR; + p->g = nG; + p->b = nB; + p->a = nA; + } + else { + p->r = (1.0 - wr) * p->r + wr * nR; + p->g = (1.0 - wg) * p->g + wg * nG; + p->b = (1.0 - wb) * p->b + wb * nB; + p->a = (1.0 - wa) * p->a + wa * nA; + } + } + // END OF CUSTOMIZATION + + p->x += gu; + p->y += gv; + + /* CUSTOM STUFF */ + { + double x1 = p->x; + double y1 = p->y; + double x2 = p->gravity_x; + double y2 = p->gravity_y; + + // Gravitate towards (x2, y2) if the distance + // is greater than freedom radius. + double A = std::abs(y1 - y2); + double B = std::abs(x1 - x2); + double C = std::sqrt(A*A + B*B); + + double r = freedom_radius * p->freedom_r; + if (C > r) { + double mx = 0.0; + double my = 0.0; + + double a = C - r; + if (a >= C) a = C; + + if (B <= 0.0) { + if (y2 <= y1) my -= a; + else my += a; + } + else if (C > 0.0) { + double dx = (a * B) / C; + double dy = (A *dx) / B; + + if (x1 <= x2) mx += dx; + else mx -= dx; + + if (y1 <= y2) my += dy; + else my -= dy; + } + + double w = 1.0 / (steps_left + 1); + + mx *= w; + my *= w; + + p->x += mx; + p->y += my; + } + } + /* END OF CUSTOM STUFF */ + + p->u += gu - p->u; + p->v += gv - p->v; + if (p->x < 1.0) { + p->x = 1.0 + static_cast(rand()) / RAND_MAX * 0.01; + p->u = 0.0; + } else if (p->x > gsizeX - 2) { + p->x = gsizeX - 2 - static_cast(rand()) / RAND_MAX * 0.01; + p->u = 0.0; + } + if (p->y < 1.0) { + p->y = 1.0 + static_cast(rand()) / RAND_MAX * 0.01; + p->v = 0.0; + } else if (p->y > gsizeY - 2) { + p->y = gsizeY - 2 - static_cast(rand()) / RAND_MAX * 0.01; + p->v = 0.0; + } + } + + // ORIGINALLY THIS PIECE OF CODE WAS HERE + // BUT FOR FLUID MORPHING IT IS NOT NEEDED: + /*for (unsigned i = 0; i < particle_count; ++i) { + p = particles + i; + if (p->inactive) continue; // CUSTOMIZATION + + lines[i].x1 = p->x; + lines[i].y1 = p->y; + lines[i].x2 = p->x - p->u; + lines[i].y2 = p->y - p->v; + }*/ +} + +void FluidModel::setPressed(bool b) { + pressed = b; +} + +void FluidModel::setMovePos(double x, double y) { + mx = x; + my = y; +} + +const Line * FluidModel::getLines() { + return lines; +} + +Particle * FluidModel::getParticles() { + return particles; +} + +Material * FluidModel::getMaterial() { + return &water; +} + diff --git a/fluidmodel.h b/fluidmodel.h new file mode 100644 index 0000000..f353d6a --- /dev/null +++ b/fluidmodel.h @@ -0,0 +1,169 @@ +/* + * See Copyright Notice at the end of this file. + */ + +#ifndef FLUIDMODEL_H +#define FLUIDMODEL_H + +#include + +struct Line { + double x1, y1; + double x2, y2; +}; + +struct Material { + + Material(double m_, + double rd_, + double k_, + double v_, + double d_, + double g_); + + double m; //mass + double rd; + double k; + double v; + double d; + double g; +}; + + +struct Particle { + + Particle(); + Particle(Material *mat_, + double x_, + double y_, + double u_, + double v_); + + void clear(); + void copy_from(Particle *p); + + Material *mat; + + double x; + double y; + double u; + double v; + + double dudx; + double dudy; + double dvdx; + double dvdy; + unsigned cx; + unsigned cy; + + double px[3]; + double py[3]; + double gx[3]; + double gy[3]; + + // CUSTOM VARIABLES: + double gravity_x; + double gravity_y; + double freedom_r; // freedom radius multiplier + bool active; + bool mature; + double R,G,B,A; // ideal color (does not blend) + double r,g,b,a; // current color (blends over time) + size_t destination_pos; + size_t source_pos; + size_t frame_key; + double strength; // how easily it regains its color + bool hack; + bool source_owner; // true when it was first one to occupy the source location. + // END OF CUSTOM VARIABLES +}; + + +struct Node { + + Node(); + + void clear(); + + double m; + double d; + double gx; + double gy; + double u; + double v; + double ax; + double ay; + bool active; + size_t pos; + double r,g,b,a; + double weight; +}; + + +class FluidModel { + + public: + + FluidModel(unsigned gsizeX_, + unsigned gsizeY_, + unsigned particle_count); + ~FluidModel(); + + void setPressed(bool b); + void setMovePos(double x, double y); + + void step(size_t steps_left, double freedom_radius, double t); + const Line * getLines(); + Material * getMaterial(); + Particle * getParticles(); + + unsigned get_particle_count(void) {return particle_count;} + private: + + Particle * particles; + unsigned gsizeX; + unsigned gsizeY; + unsigned particle_count; + Node ** active; + unsigned activeCount; + Material water; + + bool pressed; + bool pressedprev; + + double mx; + double my; + double mxprev; + double myprev; + + Node ** grid; + + Line * lines; +}; + +#endif + +/* This version: + * Copyright Xueqiao Xu ( http://code.google.com/p/mycodeplayground ) + * MIT License ( http://www.opensource.org/licenses/mit-license.php ) + * Download from: http://code.google.com/p/mycodeplayground + + * Python version: + * Copyright Xueqiao Xu ( http://code.google.com/p/mycodeplayground ) + * MIT License ( http://www.opensource.org/licenses/mit-license.php ) + * Download from: http://code.google.com/p/mycodeplayground + + * Javascript version: + * Copyright Stephen Sinclair (radarsat1) ( http://www.music.mcgill.ca/~sinclair ) + * MIT License ( http://www.opensource.org/licenses/mit-license.php ) + * Download from: http://www.music.mcgill.ca/~sinclair/blog + + * Flash version: + * Copyright iunpin ( http://wonderfl.net/user/iunpin ) + * MIT License ( http://www.opensource.org/licenses/mit-license.php ) + * Download from: http://wonderfl.net/c/6eu4 + + * Original Java version: + * http://grantkot.com/MPM/Liquid.html + */ + diff --git a/morph.cpp b/morph.cpp new file mode 100644 index 0000000..5a0af5d --- /dev/null +++ b/morph.cpp @@ -0,0 +1,1573 @@ +/* + * See Copyright Notice in atomorph.h + */ + +#include "atomorph.h" + +namespace am { + +morph::morph() { + std::default_random_engine e(0); + e1 = e; +} + +morph::~morph() { + clear(); +} + +void morph::clear() { + while (!frames.empty()) { + frame f = frames.begin()->second; + while (!f.blobs.empty()) { + delete f.blobs.back(); + f.blobs.pop_back(); + } + frames.erase(frames.begin()); + } + frames.clear(); + + while (!chains.empty()) { + chain c = chains.begin()->second; + clear_chain(&c); + chains.erase(chains.begin()); + } + chains.clear(); + + identifier= 0; + energy = 0.0; + + bbox_x1 = UINT16_MAX; + bbox_y1 = UINT16_MAX; + bbox_x2 = 0; + bbox_y2 = 0; + + if (worker.is_running()) { + worker.stop(); + worker.clear(); + } + + if (fluid) delete fluid; +} + +void morph::compute() { + if (is_busy()) return; + + if (worker.is_running()) worker.resume(); + else worker.start(); +} + +void morph::iterate(size_t iterations) { + if (is_busy()) return; + if (worker.is_running()) worker.resume(iterations); + else worker.start (iterations); +} + +void morph::compute(double seconds) { + if (is_busy()) return; + + if (worker.is_running()) worker.resume(seconds); + else worker.start(seconds); +} + +void morph::suspend() { + while (is_busy()) { + // Attempt to suspend the worker. + worker.pause(); + std::this_thread::sleep_for(std::chrono::milliseconds(0)); + } +} + +bool morph::suspend(double timeout) { + if (!is_busy()) return true; + + std::chrono::steady_clock::time_point t_start, t_end; + t_start = std::chrono::steady_clock::now(); + + while (1) { + // Attempt to suspend the worker. + worker.pause(); + if (worker.is_paused()) break; + + t_end = std::chrono::steady_clock::now(); + if (std::chrono::duration_cast(t_end - t_start).count() > (timeout * 1000000000)) { + return false; + } + + std::this_thread::sleep_for(std::chrono::milliseconds(0)); + } + + return true; +} + +bool morph::synchronize() { + if (!worker.is_paused()) return false; + + if (worker.get_seed() != seed) worker.set_seed(seed); + + worker.set_blob_delimiter (blob_delimiter); + worker.set_blob_threshold (blob_threshold); + worker.set_blob_max_size (blob_max_size); + worker.set_blob_min_size (blob_min_size); + worker.set_blob_box_grip (blob_box_grip); + worker.set_blob_box_samples(blob_box_samples); + worker.set_blob_number (blob_number); + worker.set_degeneration (degeneration); + worker.set_density (density); + worker.set_threads (threads); + worker.set_cycle_length (cycle_length); + + worker.set_bbox(bbox_x1, bbox_y1, bbox_x2, bbox_y2); + worker.set_blob_weights(blob_rgba_weight, blob_size_weight, blob_xy_weight); + + if (identifier != worker.get_identifier()) { + // Reset everything. + worker.clear(); + + std::map::iterator it; + + refresh_frames(); + for (it=frames.begin(); it!=frames.end(); ++it) { + worker.set_frame(it->first, &(it->second)); + } + worker.set_identifier(identifier); + + if (fluid) delete fluid; + fluid = nullptr; + } + + { + // Load results. + state = worker.get_state(); + energy = worker.get_energy(); + + std::map::iterator fit; + for (fit=frames.begin(); fit!=frames.end(); ++fit) { + frame *to = &(fit->second); + frame *from = worker.get_frame(fit->first); + + while (!to->blobs.empty()) { + delete to->blobs.back(); + to->blobs.pop_back(); + } + to->owners.clear(); + + for (size_t i=0; iblobs.size(); ++i) { + blob* b= from->blobs[i]; + if (!b) continue; + + blob* new_blob = new blob; + + new_blob->index = to->blobs.size(); + new_blob->r = b->r; + new_blob->g = b->g; + new_blob->b = b->b; + new_blob->a = b->a; + new_blob->x = b->x; + new_blob->y = b->y; + new_blob->surface = b->surface; + new_blob->group = b->group; + + to->blobs.push_back(new_blob); + } + } + + const std::map *chains_from = worker.get_chains(); + std::map::const_iterator cit; + // Get chain updates from worker's chains. + for (cit=chains_from->begin(); cit!=chains_from->end(); ++cit) { + size_t chain_key = cit->first; + + // If this chain already exists, it might have different attributes. + if ((chains[chain_key].width != chains_from->at(chain_key).width + || chains[chain_key].height != chains_from->at(chain_key).height)) { + // Chains are different, free the target to allocate memory again later. + if (!renew_chain(&(chains[chain_key]), cit->second.width, cit->second.height)) { + chains.erase(chain_key); + return false; + } + } + + // Normally the above memory allocation is not needed because the morph should + // not change its parameters very often, although the implementation allows it + // by essentially restarting the whole procedure whenever critical parameters + // change. For normal synchronization, only the below code is called to refresh + // the key points and splines for example. + for (size_t y=0; yat(chain_key).points[x][y]; + + double vx = chains[chain_key].points[x][y].s.x + chains[chain_key].points[x][y].s.x_fract / double(UINT8_MAX+1); + double vy = chains[chain_key].points[x][y].s.y + chains[chain_key].points[x][y].s.y_fract / double(UINT8_MAX+1); + + if (y == 0) chains[chain_key].splines[x].clearCPoints(); + chains[chain_key].splines[x].AddSplinePoint(glnemo::Vec3D(vx, vy, 0.0)); + } + } + if (chains[chain_key].max_surface != chains_from->at(chain_key).max_surface) { + // Number of particles in the fluid simulator has changed, reset the simulation. + chains[chain_key].max_surface = chains_from->at(chain_key).max_surface; + if (fluid) { + delete fluid; + fluid = nullptr; + } + } + } + // Delete chains that don't exist in worker's chains. + std::vector delete_keys; + for (cit=chains.begin(); cit!=chains.end(); ++cit) { + if (chains_from->find(cit->first) != chains_from->end()) continue; + delete_keys.push_back(cit->first); + } + while (!delete_keys.empty()) { + clear_chain(&(chains[delete_keys.back()])); + chains.erase(delete_keys.back()); + delete_keys.pop_back(); + } + + worker.set_identifier(identifier); + + if (skip_state) { + worker.next_state(); + skip_state = false; + } + + // Initialize the fluid simulator if needed. + if (!fluid && width > 0 && height > 0) { + size_t particle_count = 0; + + for (cit=chains.begin(); cit!=chains.end(); ++cit) { + particle_count += cit->second.max_surface; + } + + fluid = new (std::nothrow) FluidModel(width*sparseness+20, height*sparseness+20, particle_count); + if (fluid) { + Particle *particles = fluid->getParticles(); + + for (size_t i=0; iclear(); + p->x = width *sparseness/2.0 - 10; + p->y = height*sparseness/2.0 - 10; + p->u = 0.0; + p->v = 0.0; + p->gravity_x = p->x; + p->gravity_y = p->y; + p->freedom_r = 1.0; + p->R = 0.0; p->r = p->R; + p->G = 1.0; p->g = p->G; // Should never appear in morphs. + p->B = 0.0; p->b = p->B; + p->A = 1.0; p->a = p->A; + p->active = false; + p->mature = false; + } + } + } + } + + return true; +} + +void morph::refresh_frames() { + std::map::iterator it; + size_t index = 0; + for (it=frames.begin(); it!=frames.end(); ++it) { + it->second.index = index++; + if (it->second.pixels.empty()) { + it->second.x = (bbox_x1 <= bbox_x2 ? (bbox_x1 + bbox_x2)/2.0 : 0.0); + it->second.y = (bbox_y1 <= bbox_y2 ? (bbox_y1 + bbox_y2)/2.0 : 0.0); + it->second.r = 0.0; + it->second.g = 0.0; + it->second.b = 0.0; + it->second.a = 0.0; + } + } +} + +bool morph::add_frame(size_t frame_key) { + if (frames.find(frame_key) != frames.end()) return false; + + frames[frame_key].x = (bbox_x1 <= bbox_x2 ? (bbox_x1 + bbox_x2)/2.0 : 0.0); + frames[frame_key].y = (bbox_y1 <= bbox_y2 ? (bbox_y1 + bbox_y2)/2.0 : 0.0); + + refresh_frames(); + + return true; +} + +bool morph::add_pixel(size_t frame_key, pixel px) { + if (blob_delimiter == HSP) { + px.c = rgb_to_hsp(px.c); + } + + add_frame(frame_key); + + am::frame *f = &(frames[frame_key]); + + auto pixelmap = &(f->pixels); + size_t pos = px.y * (UINT16_MAX+1) + px.x; + + (*pixelmap)[pos] = px; + identifier++; + + if (px.x < bbox_x1) bbox_x1 = px.x; + if (px.y < bbox_y1) bbox_y1 = px.y; + if (px.x > bbox_x2) bbox_x2 = px.x; + if (px.y > bbox_y2) bbox_y2 = px.y; + + if (pixelmap->size() == 1) { + f->x = px.x; + f->y = px.y; + f->r = px.c.r / 255.0; + f->g = px.c.g / 255.0; + f->b = px.c.b / 255.0; + f->a = px.c.a / 255.0; + return true; + } + + double weight = 1.0 / double(pixelmap->size()); + f->x = (1.0 - weight)*f->x + weight*px.x; + f->y = (1.0 - weight)*f->y + weight*px.y; + f->r = (1.0 - weight)*f->r + weight*(px.c.r/255.0); + f->g = (1.0 - weight)*f->g + weight*(px.c.g/255.0); + f->b = (1.0 - weight)*f->b + weight*(px.c.b/255.0); + f->a = (1.0 - weight)*f->a + weight*(px.c.a/255.0); + + return true; +} + +pixel morph::get_average_pixel (size_t f) { + pixel px = create_pixel(0,0,0,0,0,0); + if (!has_frame(f)) return px; + px.x = round(frames[f].x); + px.y = round(frames[f].y); + px.c.r = round(255.0*frames[f].r); + px.c.g = round(255.0*frames[f].g); + px.c.b = round(255.0*frames[f].b); + px.c.a = round(255.0*frames[f].a); + + if (blob_delimiter == HSP) { + px.c = hsp_to_rgb(px.c); + } + + return px; +} + +pixel morph::get_average_pixel (size_t f, size_t b) { + pixel px = create_pixel(0,0,0,0,0,0); + if (!has_frame(f) + || frames[f].blobs.size() <= b + || frames[f].blobs[b] == nullptr) { + return px; + } + + px.x = round(frames[f].blobs[b]->x); + px.y = round(frames[f].blobs[b]->y); + px.c.r = round(255.0*frames[f].blobs[b]->r); + px.c.g = round(255.0*frames[f].blobs[b]->g); + px.c.b = round(255.0*frames[f].blobs[b]->b); + px.c.a = round(255.0*frames[f].blobs[b]->a); + + if (blob_delimiter == HSP) { + px.c = hsp_to_rgb(px.c); + } + + return px; +} + +pixel morph::get_pixel (size_t f, size_t pos) { + pixel px = create_pixel(0,0,0,0,0,0); + if (!has_pixel(f,pos)) { + // Asking a pixel from void gives + // a fully transparent pixel. + return px; + } + px = frames[f].pixels[pos]; + + if (blob_delimiter == HSP) { + px.c = hsp_to_rgb(px.c); + } + + return px; +} + +size_t morph::get_pixel_count (size_t f) { + if (!has_frame(f)) return 0; + return frames[f].pixels.size(); +} + +size_t morph::get_blob_count (size_t f) { + if (!has_frame(f)) return 0; + return frames[f].blobs.size(); +} + +size_t morph::get_frame_key (double t) { + double integ; + t = std::modf(t, &integ); + if (t < 0.0) t += 1.0; + + size_t f = t * frames.size(); + + std::map::iterator it; + + size_t i=0; + size_t frame = SIZE_MAX; + for (it=frames.begin(); it!=frames.end(); ++it) { + if (i++ == f) { + frame = it->first; + break; + } + } + + return frame; +} + +size_t morph::get_blob_count () { + size_t count = 0; + std::map::iterator it; + + for (it=frames.begin(); it!=frames.end(); ++it) { + count += get_blob_count(it->first); + } + + return count; +} + +void morph::set_seed(unsigned seed) { + std::default_random_engine e(seed); + e1 = e; + + PerlinNoise l_map(seed); lag_map = l_map; + PerlinNoise s_map(seed+1); slope_map = s_map; + + this->seed = seed; +} + +double morph::normalize_time(double t) { + double integ, time = std::modf(t, &integ); + if (time < 0.0) time += 1.0; + return time; +} + +const blob* morph::get_pixels(size_t blob_index, double time, std::vector *to) { + time = normalize_time(time); + double t = time; + + if (frames.empty()) return nullptr; + + size_t frame_key = get_frame_key(t); + size_t blob_count = get_blob_count(frame_key); + + if (blob_index >= blob_count) return nullptr; + + double dt = 1.0 / double(frames.size()); + t = std::max(0.0, (t - (frame_key * dt)) / dt); + + const blob * bl = get_blob(frame_key, blob_index); + if (!bl) return nullptr; + + if (chains.empty()) { + std::set::iterator it; + for (it=bl->surface.begin(); it!=bl->surface.end(); ++it) { + pixel px = get_pixel(frame_key, *it); + to->push_back(px); + } + } + else { + std::map> colors; + std::map> weights; + + if (chains.find(bl->group) == chains.end()) return nullptr; + + size_t w = chains[bl->group].width; + size_t h = chains[bl->group].height; + point**p = chains[bl->group].points; + + size_t y = frames[frame_key].index; + size_t y_next = (y+1)%h; + assert(y < h); + + std::map::iterator it = frames.find(frame_key); + ++it; + if (it == frames.end()) it = frames.begin(); + size_t next_frame_key = it->first; + + for (size_t x=0; xgroup].splines) { + glnemo::Vec3D v = chains[bl->group].splines[x].GetInterpolatedSplinePoint(time); + double fract, integ; + fract = std::modf(v.x, &integ); pt.s.x = integ; pt.s.x_fract = std::round(fract * UINT8_MAX); + fract = std::modf(v.y, &integ); pt.s.y = integ; pt.s.y_fract = std::round(fract * UINT8_MAX); + } + + pixel px; + px.x = pt.s.x; + px.y = pt.s.y; + + if (fading == PERLIN) { + double f = 8.0; // Frequency + int octaves = 8; // Octaves + double bbox_w = bbox_x2 - bbox_x1 + 1.0; + double bbox_h = bbox_y2 - bbox_y1 + 1.0; + double perlin_x = (((pt1.s.x-bbox_x1)*(UINT8_MAX+1)+pt1.s.x_fract) / double(bbox_w*(UINT8_MAX+1)))*f; + double perlin_y = (((pt1.s.y-bbox_y1)*(UINT8_MAX+1)+pt1.s.y_fract) / double(bbox_h*(UINT8_MAX+1)))*f; + double lag = lag_map. octaveNoise(perlin_x, perlin_y, octaves)*0.5 + 0.5; + double slope = slope_map.octaveNoise(perlin_x, perlin_y, 8)*0.5 + 0.5; + + px.c = interpolate(px1.c, px2.c, lag, slope, 1.0 - t); + } + else if (fading == COSINE) px.c = interpolate(px1.c, px2.c, 0.5, 0.5, 1.0 - t); + else px.c = interpolate(px1.c, px2.c, 1.0 - t); + + if (px.x >= width || px.y >= height) { + if (px.x > bbox_x2 || px.x < bbox_x1 + || px.y > bbox_y2 || px.y < bbox_y1) continue; + } + + // Bilinear interpolation: + double total_weight= UINT8_MAX * UINT8_MAX; + double weight_x1y1 = ((UINT8_MAX - pt.s.x_fract) * (UINT8_MAX - pt.s.y_fract)) / total_weight; + double weight_x2y1 = ( pt.s.x_fract * (UINT8_MAX - pt.s.y_fract)) / total_weight; + double weight_x1y2 = ((UINT8_MAX - pt.s.x_fract) * pt.s.y_fract ) / total_weight; + double weight_x2y2 = ( pt.s.x_fract * pt.s.y_fract ) / total_weight; + + size_t pos = xy2pos(px.x, px.y); + if (weight_x1y1 > 0.0) { + colors [pos].push_back(px.c); + weights[pos].push_back(weight_x1y1); + } + if ((px.x < bbox_x2 || px.x+1 < width) && weight_x2y1 > 0.0) { + pos = xy2pos(px.x + 1, px.y); + colors [pos].push_back(px.c); + weights[pos].push_back(weight_x2y1); + } + + if ((px.y < bbox_y2 || px.y+1 < height) && weight_x1y2 > 0.0) { + pos = xy2pos(px.x, px.y + 1); + colors [pos].push_back(px.c); + weights[pos].push_back(weight_x1y2); + } + + if (weight_x2y2 > 0.0) { + if ((px.y < bbox_y2 && px.x < bbox_x2) + || (px.y+1 < height && px.x+1 < width)) { + pos = xy2pos(px.x + 1, px.y + 1); + colors [pos].push_back(px.c); + weights[pos].push_back(weight_x2y2); + } + } + } + + std::map blob; + std::map>::iterator cit; + for (cit = colors.begin(); cit!=colors.end(); ++cit) { + std::vector *cs = &(cit->second); + std::vector*ws = &(weights[cit->first]); + size_t vsz = cs->size(); + + double r = 0.0, g = 0.0, b = 0.0, a = 0.0; + double weight_sum = 0.0; + for (size_t c = 0; cat(c); + r += cs->at(c).r * ws->at(c); + g += cs->at(c).g * ws->at(c); + b += cs->at(c).b * ws->at(c); + a += cs->at(c).a * ws->at(c); + } + double w = density > 0 ? double(vsz)/double(density) : 0.0; + if (w > 1.0) w = 1.0; + + r = std::round(r/weight_sum); + g = std::round(g/weight_sum); + b = std::round(b/weight_sum); + a = std::round(w*(a/weight_sum)); + + size_t pos = cit->first; + uint16_t x = pos % (UINT16_MAX+1); + uint16_t y = pos / (UINT16_MAX+1); + + pixel px = create_pixel(x,y,r,g,b,a); + + if (feather > 0) blob[pos] = px; + else to->push_back(px); + } + + if (feather > 0) { + std::vector> layers; + std::map peeled_blob = blob; + while (!peeled_blob.empty() && layers.size() < feather) { + std::set border; + std::map::iterator pit; + for (pit = peeled_blob.begin(); pit!=peeled_blob.end(); ++pit) { + size_t pos = pit->first; + uint16_t x = pos % (UINT16_MAX+1); + uint16_t y = pos / (UINT16_MAX+1); + + if (x == 0 || x == UINT16_MAX + || y == 0 || y == UINT16_MAX) { + border.insert(pos); + continue; + } + + if (peeled_blob.find(xy2pos(x+1, y )) == peeled_blob.end() + || peeled_blob.find(xy2pos(x-1, y )) == peeled_blob.end() + || peeled_blob.find(xy2pos(x, y+1)) == peeled_blob.end() + || peeled_blob.find(xy2pos(x, y-1)) == peeled_blob.end()) { + border.insert(pos); + } + } + std::set::iterator bt; + for (bt = border.begin(); bt != border.end(); ++bt) { + size_t pos = *bt; + peeled_blob.erase(pos); + } + + layers.push_back(border); + } + + size_t lsz = layers.size(); + for (size_t l=0; l *layer = &(layers[l]); + std::set::iterator lt; + + for (lt = layer->begin(); lt != layer->end(); ++lt) { + pixel px = blob[*lt]; + px.c.a = std::round(double(px.c.a)*(double(l+1)/double(feather+1))); + to->push_back(px); + } + } + + std::map::iterator pit; + for (pit = peeled_blob.begin(); pit!=peeled_blob.end(); ++pit) { + to->push_back(pit->second); + } + } + } + + return bl; +} + +void morph::update_particle( Particle *p, const blob * blob_before, const blob * blob_after, point **points, + std::map& sources, std::map& destinations, double t, + size_t y, size_t y_next, size_t frame_key, size_t next_frame_key, size_t chain_key, double time ) +{ + double previous_surface = blob_before->surface.size(); + double next_surface = blob_after->surface.size(); + + size_t src_pos = p->source_pos; + size_t dst_pos = p->destination_pos; + size_t src_x = sources[src_pos]; + size_t dst_x = destinations[dst_pos]; + + // If area is growing then gain the real source x from the destination. + if (next_surface > previous_surface) { + src_x = destinations[dst_pos]; + } + + { + point pt1 = points[src_x][y]; + point pt2 = points[dst_x][y_next]; + + pixel px1, px2; + + if (point_has_pixel(pt1) + && !point_has_pixel(pt2)) { + px1 = get_pixel(frame_key, xy2pos(pt1.s.x, pt1.s.y)); + px2 = px1; + px2.x = pt2.s.x; + px2.y = pt2.s.y; + if (next_surface > 0.0) px2.c.a = 0; + } + else if (point_has_pixel(pt2) + && !point_has_pixel(pt1)) { + px2 = get_pixel(next_frame_key, xy2pos(pt2.s.x, pt2.s.y)); + px1 = px2; + px1.x = pt1.s.x; + px1.y = pt1.s.y; + if (previous_surface > 0.0) px1.c.a = 0; + } + else { + px1 = get_pixel(frame_key, xy2pos(pt1.s.x, pt1.s.y)); + px2 = get_pixel(next_frame_key, xy2pos(pt2.s.x, pt2.s.y)); + } + + color c; + + if (fading == PERLIN) { + double f = 8.0; // Frequency + int octaves = 8; // Octaves + double bbox_w = bbox_x2 - bbox_x1 + 1.0; + double bbox_h = bbox_y2 - bbox_y1 + 1.0; + double perlin_x = (((pt1.s.x-bbox_x1)*(UINT8_MAX+1)+pt1.s.x_fract) / double(bbox_w*(UINT8_MAX+1)))*f; + double perlin_y = (((pt1.s.y-bbox_y1)*(UINT8_MAX+1)+pt1.s.y_fract) / double(bbox_h*(UINT8_MAX+1)))*f; + double lag = lag_map. octaveNoise(perlin_x, perlin_y, octaves)*0.5 + 0.5; + double slope = slope_map.octaveNoise(perlin_x, perlin_y, 8)*0.5 + 0.5; + + c = interpolate(px1.c, px2.c, lag, slope, 1.0 - t); + } + else if (fading == COSINE) c = interpolate(px1.c, px2.c, 0.5, 0.5, 1.0 - t); + else c = interpolate(px1.c, px2.c, 1.0 - t); + + point pt = pt1; + + if (motion == LINEAR) pt = interpolate(pt1, pt2, 1.0 - t); + else if (motion == SPLINE && chains[chain_key].splines) { + glnemo::Vec3D v = chains[chain_key].splines[src_x].GetInterpolatedSplinePoint(time); + double fract, integ; + fract = std::modf(v.x, &integ); pt.s.x = integ; pt.s.x_fract = std::round(fract * UINT8_MAX); + fract = std::modf(v.y, &integ); pt.s.y = integ; pt.s.y_fract = std::round(fract * UINT8_MAX); + } + + float ptx, pty; + point2xy(pt, &ptx, &pty); + + p->gravity_x = std::min(std::max((ptx * sparseness) + 10.0, 1.0), double(width *sparseness + 10.0) ); + p->gravity_y = std::min(std::max((pty * sparseness) + 10.0, 1.0), double(height*sparseness + 10.0) ); + + p->R = c.r/255.0; + p->G = c.g/255.0; + p->B = c.b/255.0; + p->A = c.a/255.0; + + if (show_blobs == DISTINCT) { + std::mt19937 gen(chain_key); + std::uniform_real_distribution uniform_dist_color(0.0, 1.0); + p->R = uniform_dist_color(gen); + p->G = uniform_dist_color(gen); + p->B = uniform_dist_color(gen); + p->A = 1.0; + } + else if (show_blobs == AVERAGE) { + p->R = blob_before->r; + p->G = blob_before->g; + p->B = blob_before->b; + p->A = blob_before->a; + } + + p->r = t*p->R + (1.0-t)*p->r; + p->g = t*p->G + (1.0-t)*p->g; + p->b = t*p->B + (1.0-t)*p->b; + p->a = t*p->A + (1.0-t)*p->a; + + if (!p->mature) { + if (p->source_owner) { + p->x = p->gravity_x; + p->y = p->gravity_y; + + // These lines should only be called + // for a newly created particle that was + // first to occupy its source location: + p->r = p->R; + p->g = p->G; + p->b = p->B; + p->a = p->A; + // Otherwise wrongly coloured single particles + // start appearing during the morph when new + // particles are created. + } + + if (previous_surface == 0.0) p->strength = 0.1; + else p->strength = 1.0; + + p->freedom_r = 1.0; + } + } +} + +void morph::step_fluid(size_t frame_key, double t, double time) { + // t is for current transition between 2 images, time is overall time across all key frames. + size_t iptc = 0; + size_t particle_count = fluid->get_particle_count(); + Particle *particles = fluid->getParticles(); + + std::map::const_iterator cit; + for (cit=chains.begin(); cit!=chains.end(); ++cit) { + size_t chain_key = cit->first; + size_t w = cit->second.width; + size_t h = cit->second.height; + point **points = cit->second.points; + + size_t y = frames[frame_key].index; + size_t y_next = (y+1)%h; + + std::map::iterator fit = frames.find(frame_key); ++fit; + if (fit == frames.end()) fit = frames.begin(); + size_t next_frame_key = fit->first; + + const blob* blob_before = find_blob_by_group(frame_key, chain_key); + const blob* blob_after = find_blob_by_group(next_frame_key, chain_key); + + double previous_surface = blob_before->surface.size(); + double next_surface = blob_after->surface.size(); + double current_surface = std::round((1.0-t)*previous_surface + t*next_surface); + + size_t active_count = 0; + size_t active_limit = current_surface; + + { + std::map sources; // pt1 has fluid, pt2 maybe not + std::map destinations; // pt2 has fluid, pt1 maybe not + std::map> particles_by_destination; + std::map> particles_by_source; + + std::vector free_particles; + std::vector update_particles; + + for (size_t x=0; xactive && p->frame_key == frame_key) { + // Map this particle as an existing particle. + active_count++; + particles_by_destination[p->destination_pos].push_back(p); + particles_by_source [p->source_pos ].push_back(p); + update_particles.push_back(p); + } + else { + p->active = false; + free_particles.push_back(p); + } + } + } + + if (active_count < active_limit) { + size_t to_create = active_limit - active_count; + // Add new particles. + + while (to_create > 0) { + assert(!free_particles.empty()); + Particle *p = free_particles.back(); + free_particles.pop_back(); + update_particles.push_back(p); + p->clear(); + p->frame_key = frame_key; + + { + bool source_found = false; + std::map::iterator it; + std::vector source_candidates; + + // First see if any of the source positions is still unused, + // it is the highest priority to have these filled. + for (it=sources.begin(); it!=sources.end(); ++it) { + size_t pos = it->first; + + if (particles_by_source.find(pos) != particles_by_source.end() + && !particles_by_source[pos].empty()) { + // This source is already taken. + continue; + } + + // Free source was found, take it. + source_candidates.push_back(pos); + } + + if (!source_candidates.empty()) { + std::uniform_int_distribution uniform_dist_candidate(0, source_candidates.size()-1); + size_t pos = source_candidates[uniform_dist_candidate(e1)]; + assert(sources.find(pos) != sources.end()); + size_t x = sources[pos]; + + p->source_pos = pos; + particles_by_source[pos].push_back(p); + source_found = true; + + { + // This source was unoccupied, take its default destination + // even if it leads to a place without HAS_FLUID flag and thus this + // particle must be destroyed sooner or later during this morph. + + point pt2 = points[x][y_next]; + size_t destination_pos = xy2pos(pt2.s.x, pt2.s.y); + p->destination_pos = destination_pos; + particles_by_destination[destination_pos].push_back(p); + + assert(destinations.find(destination_pos) != destinations.end()); + } + } + + if (!source_found) { + // All sources are already occupied, this new particle must now + // share the source with some other particle, but it will still + // must get an unused destination. Search for such destination. + bool destination_found = false; + for (it=destinations.begin(); it!=destinations.end(); ++it) { + size_t pos = it->first; + size_t x = it->second; + + if (particles_by_destination.find(pos) != particles_by_destination.end() + && !particles_by_destination[pos].empty()) { + // This destination is already taken. + continue; + } + + // Free destination was found, take it. + p->destination_pos = pos; + particles_by_destination[pos].push_back(p); + destination_found = true; + + { + // Destination was found but all the sources were already + // occupied. Now see the pt1 of this destination even if + // it does not have HAS_FLUID flag. + + point pt1 = points[x][y]; + size_t source_pos = xy2pos(pt1.s.x, pt1.s.y); + p->source_pos = source_pos; + particles_by_source[source_pos].push_back(p); + source_found = true; + + assert(sources.find(source_pos) != sources.end()); + } + + break; + } + + assert(destination_found); + } + + assert(source_found); + } + + { + size_t pos = p->source_pos; + + // Find a suitable starting position for this particle. + if (particles_by_source.find(pos) != particles_by_source.end() + && particles_by_source[pos].size() > 1) { + // Another particle exists with the same source, + // copy its location for seamless creation. + + std::uniform_int_distribution uniform_dist_p(0, particles_by_source[pos].size()-2); + Particle *parent = particles_by_source[pos].at(uniform_dist_p(e1)); + assert(parent != p); + + p->copy_from(parent); + p->mature = parent->mature; + p->strength = parent->strength; + std::uniform_real_distribution uniform_dist_fuzz(0.0, 1.0); + + p->x = std::min(p->x + uniform_dist_fuzz(e1), width * sparseness-10.0); + p->y = std::min(p->y + uniform_dist_fuzz(e1), height* sparseness-10.0); + + p->source_owner = false; + } + else { + // No other particle currently exists with the + // same source location. Copy the attractor's + // current position for the initial setup of this + // new particle. + + p->mature = false; + p->source_owner = true; + + update_particle(p, blob_before, blob_after, points, sources, + destinations, t, y, y_next, frame_key, + next_frame_key, chain_key, time); + } + } + p->active = true; + to_create--; + } + } + else if (active_count > active_limit) { + size_t to_delete = active_count - active_limit; + // Delete particles. + std::shuffle(update_particles.begin(), update_particles.end(), e1); + while (to_delete > 0) { + assert(!update_particles.empty()); + Particle *p = update_particles.back(); + + p->active = false; + update_particles.pop_back(); + + to_delete--; + } + } + + { + // Particles either created or deleted by now, update their positions. + size_t usz = update_particles.size(); + for (size_t i=0; i < usz; ++i) { + Particle *p = update_particles[i]; + if (!p->active) continue; + + update_particle(p, blob_before, blob_after, points, sources, + destinations, t, y, y_next, frame_key, + next_frame_key, chain_key, time); + } + } + } + } + + double freedom = std::sqrt(width*width + height*height) * double(sparseness) / 4.0; + double freedom_radius = freedom*(1.0 - t); + for (size_t step = 0; step < fluidsteps; ++step) fluid->step(fluidsteps - (step+1), freedom_radius, t); +} + +void morph::draw_fluid(double time, std::vector *image) { + if (!fluid || chains.empty()) return; + + time = normalize_time(time); + double t = time; + + if (frames.empty()) return; + + size_t frame_key = get_frame_key(t); + double dt = 1.0 / double(frames.size()); + t = std::max(0.0, (t - (frame_key * dt)) / dt); + // t is 0.0 at the beginning of frame + // t is 1.0 at the end of this frame + + step_fluid(frame_key, t, time); + + std::map image_buffer; + + Particle *particles = fluid->getParticles(); + size_t particle_count = fluid->get_particle_count(); + + std::map> colors; + std::map> weights; + std::map> startups; + + for (size_t i=0; iactive == false) continue; + + { + // Correct the colours so they would not blur too much. + // Blobs that appear from nothingness should be blended + // with their surroundings a lot though to avoid sharp + // gradient spots in the very beginnning of the morph. + //double w = 1.0 / (100.0 * std::pow(t, 2.0)+1.0); + double w = (1.0 / (100.0*std::pow((t-(1.0*(1.0-p->strength))), 2.0)+1.0)) * std::pow(p->strength, 2.0); + + p->r = (w * p->R)+(1.0 - w)*p->r; + p->g = (w * p->G)+(1.0 - w)*p->g; + p->b = (w * p->B)+(1.0 - w)*p->b; + p->a = (w * p->A)+(1.0 - w)*p->a; + } + + double px, py; + + if (p->x <= 10.0) px = 0.0; + else if (p->x >= width*sparseness + 10.0) px = (width-1); + else px = (p->x-10.0)/sparseness; + + if (p->y <= 10.0) py = 0.0; + else if (p->y >= height*sparseness+ 10.0) py = (height-1); + else py = (p->y-10.0)/sparseness; + + uint16_t x = std::min(int(px), width - 1); + uint16_t y = std::min(int(py), height- 1); + size_t pos = xy2pos(x, y); + + if (!p->mature) { + p->mature = true; + } + + double x_fract, y_fract; + + x_fract = std::modf(px, &px); + y_fract = std::modf(py, &py); + + if (px >= width || py >= height) { + if (px > bbox_x2 || px < bbox_x1 + || py > bbox_y2 || py < bbox_y1) continue; + } + + // Bilinear interpolation: + double weight_x1y1 = ((1.0 - x_fract) * (1.0 - y_fract)); + double weight_x2y1 = ( x_fract * (1.0 - y_fract)); + double weight_x1y2 = ((1.0 - x_fract) * y_fract ); + double weight_x2y2 = ( x_fract * y_fract ); + + color c = create_color(p->r, p->g, p->b, p->a); + + if (weight_x1y1 > 0.0) { + colors [pos].push_back(c); + weights[pos].push_back(weight_x1y1); + } + if ((x < bbox_x2 || x+1 < width) && weight_x2y1 > 0.0) { + pos = xy2pos(x + 1, y); + colors [pos].push_back(c); + weights[pos].push_back(weight_x2y1); + } + + if ((y < bbox_y2 || y+1 < height) && weight_x1y2 > 0.0) { + pos = xy2pos(x, y + 1); + colors [pos].push_back(c); + weights[pos].push_back(weight_x1y2); + } + + if (weight_x2y2 > 0.0) { + if ((y < bbox_y2 && x < bbox_x2) + || (y+1 < height && x+1 < width)) { + pos = xy2pos(x + 1, y + 1); + colors [pos].push_back(c); + weights[pos].push_back(weight_x2y2); + } + } + } + + std::map blob; + std::map>::iterator cit; + for (cit = colors.begin(); cit!=colors.end(); ++cit) { + std::vector *cs = &(cit->second); + std::vector *ws = &(weights[cit->first]); + + size_t vsz = cs->size(); + + double r = 0.0, g = 0.0, b = 0.0, a = 0.0; + double weight_sum = 0.0; + for (size_t c = 0; cat(c); + + weight_sum += weight; + r += cs->at(c).r * weight; + g += cs->at(c).g * weight; + b += cs->at(c).b * weight; + a += cs->at(c).a * weight; + } + + r = std::round(r/weight_sum); + g = std::round(g/weight_sum); + b = std::round(b/weight_sum); + a = std::round(a/weight_sum); + + if (keep_background) { + double alpha = 1.0 - std::pow(t, 24.0); + a *= alpha; + } + + size_t pos = cit->first; + uint16_t x = pos % (UINT16_MAX+1); + uint16_t y = pos / (UINT16_MAX+1); + + pixel px = create_pixel(x,y,r,g,b,a); + + size_t imgpos = y*width + x; + + if (feather > 0) blob[pos] = px.c; + else image_buffer[imgpos] = px.c; + } + + if (feather > 0) { + for (size_t layer = 0; layer < feather; ++layer) { + double alpha = 1.0 - (double(layer + 1) / double(feather + 1)); + std::set border; + std::map::iterator it; + for (it = blob.begin(); it!=blob.end(); ++it) { + size_t pos = it->first; + uint16_t x = pos % (UINT16_MAX+1); + uint16_t y = pos / (UINT16_MAX+1); + + size_t ps; + if (x+1 < width && blob.find( (ps = xy2pos(x+1, y )) ) == blob.end()) border.insert(ps); + if (y+1 < height && blob.find( (ps = xy2pos(x, y+1)) ) == blob.end()) border.insert(ps); + if (x > 0 && blob.find( (ps = xy2pos(x-1, y )) ) == blob.end()) border.insert(ps); + if (y > 0 && blob.find( (ps = xy2pos(x, y-1)) ) == blob.end()) border.insert(ps); + } + + if (border.empty()) break; + + std::map blob_buf; + for (const auto& pos: border) { + uint16_t x = pos % (UINT16_MAX+1); + uint16_t y = pos / (UINT16_MAX+1); + + std::set components; + size_t ps; + if (x+1 < width && blob.find( (ps = xy2pos(x+1, y )) ) != blob.end()) components.insert(ps); + if (y+1 < height && blob.find( (ps = xy2pos(x, y+1)) ) != blob.end()) components.insert(ps); + if (x > 0 && blob.find( (ps = xy2pos(x-1, y )) ) != blob.end()) components.insert(ps); + if (y > 0 && blob.find( (ps = xy2pos(x, y-1)) ) != blob.end()) components.insert(ps); + + assert(!components.empty()); + + double r = 0.0, g = 0.0, b = 0.0, a = 0.0; + double w = components.size(); + for (const auto& comp: components) { + color c = blob[comp]; + r += (c.r/255.0) / w; + g += (c.g/255.0) / w; + b += (c.b/255.0) / w; + a += (c.a/255.0) / w; + } + + a *= alpha; + + blob_buf[pos] = create_color(r, g, b, a); + } + + for (it = blob_buf.begin(); it!=blob_buf.end(); ++it) { + blob[it->first] = it->second; + } + } + + std::map::iterator it; + for (it = blob.begin(); it!=blob.end(); ++it) { + size_t pos = it->first; + uint16_t x = pos % (UINT16_MAX+1); + uint16_t y = pos / (UINT16_MAX+1); + + size_t imgpos = y*width + x; + image_buffer[imgpos] = it->second; + } + } + + { + std::map::iterator cit; + for (cit = image_buffer.begin(); cit!=image_buffer.end(); ++cit) { + size_t pos = cit->first; + color c = cit->second; + + if (keep_background) { + color bgc = image->at(pos).c; + double bgr = double(bgc.r)/255.0; + double bgg = double(bgc.g)/255.0; + double bgb = double(bgc.b)/255.0; + double bga = double(bgc.a)/255.0; + + double r = c.r/255.0; + double g = c.g/255.0; + double b = c.b/255.0; + double a = c.a/255.0; + + r = a*r + (1.0-a)*bgr; + g = a*g + (1.0-a)*bgg; + b = a*b + (1.0-a)*bgb; + a = bga + (1.0-bga)*a; + + c.r = std::round(r*255.0); + c.g = std::round(g*255.0); + c.b = std::round(b*255.0); + c.a = std::round(a*255.0); + } + + image->at(pos).c = c; + } + } +} + +void morph::draw_atoms(double t, std::vector *image) { + std::map> colors; + const am::blob *bl; + size_t b = 0; + + std::vector pixels; + + while ( (bl = get_pixels(b++, t, &pixels)) != nullptr ) { + size_t group = bl->group; + pixel px_ave = blob2pixel(bl); + + while (!pixels.empty()) { + pixel px = pixels.back(); + size_t pos = px.y*width + px.x; + pixels.pop_back(); + + if (pos >= image->size()) continue; + + unsigned char rr,gg,bb,aa; + if (show_blobs == DISTINCT) { + std::mt19937 gen(group); + std::uniform_int_distribution uniform_dist_byte(0, 255); + rr = uniform_dist_byte(gen); + gg = uniform_dist_byte(gen); + bb = uniform_dist_byte(gen); + aa = 255; + } + else if (show_blobs == AVERAGE) { + rr = px_ave.c.r; + gg = px_ave.c.g; + bb = px_ave.c.b; + aa = px_ave.c.a; + } + else { + rr = px.c.r; + gg = px.c.g; + bb = px.c.b; + aa = px.c.a; + } + + if (aa == 0) continue; + + colors[pos].push_back(create_color(rr,gg,bb,aa)); + } + } + + std::map>::iterator cit; + for (cit = colors.begin(); cit!=colors.end(); ++cit) { + size_t pos = cit->first; + std::vector *cs = &(cit->second); + size_t vsz = cs->size(); + + double r = 0.0, g = 0.0, b = 0.0, a = 0.0; + double rsum = 0.0, gsum = 0.0, bsum = 0.0, asum = 0.0; + + for (size_t c = 0; cat(c).r/255.0; + double sg = cs->at(c).g/255.0; + double sb = cs->at(c).b/255.0; + double sa = cs->at(c).a/255.0; + + asum += sa; + rsum += sr*sa; + gsum += sg*sa; + bsum += sb*sa; + + if (c == 0) { + r = sr; + g = sg; + b = sb; + a = sa; + } + else { + r = sa*sr + (1.0-sa)*r; + g = sa*sg + (1.0-sa)*g; + b = sa*sb + (1.0-sa)*b; + a = a + (1.0-a)*(cs->at(c).a/255.0); + } + } + + if (blend_blobs) { + r = rsum/asum; + g = gsum/asum; + b = bsum/asum; + } + + if (keep_background) { + color bgc = image->at(pos).c; + double bgr = double(bgc.r)/255.0; + double bgg = double(bgc.g)/255.0; + double bgb = double(bgc.b)/255.0; + double bga = double(bgc.a)/255.0; + + r = a*r + (1.0-a)*bgr; + g = a*g + (1.0-a)*bgg; + b = a*b + (1.0-a)*bgb; + a = bga + (1.0-bga)*a; + } + + image->at(pos).c = create_color(r, g, b, a); + } +} + +void morph::get_pixels(double t, std::vector *image) { + image->clear(); + image->reserve(width*height); + + for (size_t y=0; ypush_back(px); + } + } + + if (fluid && fluidsteps > 0) draw_fluid(t, image); + else draw_atoms(t, image); + + return; +} + +pixel morph::blob2pixel(const blob *bl) { + pixel px = create_pixel(bl->x, bl->y, create_color(bl->r, bl->g, bl->b, bl->a)); + if (blob_delimiter == HSP) { + px.c = hsp_to_rgb(px.c); + } + return px; +} + +color morph::get_background(uint16_t x, uint16_t y, double time) { + if (frames.empty()) return create_color(0.0, 0.0 ,0.0 ,0.0); + size_t position = xy2pos(x, y); + + time = normalize_time(time); + double t = time; + + size_t frame_key = get_frame_key(t); + std::map::iterator it = frames.find(frame_key); + ++it; + if (it == frames.end()) it = frames.begin(); + size_t next_frame_key = it->first; + + double dt = 1.0 / double(frames.size()); + t = std::max(0.0, (t - (frame_key * dt)) / dt); + + color c1 = get_pixel(frame_key, position).c; + color c2 = get_pixel(next_frame_key, position).c; + + if (fading == PERLIN) { + double f = 8.0; // Frequency + int octaves = 8; // Octaves + double bbox_w = bbox_x2 - bbox_x1 + 1.0; + double bbox_h = bbox_y2 - bbox_y1 + 1.0; + double perlin_x = ((x-bbox_x1) / double(bbox_w))*f; + double perlin_y = ((y-bbox_y1) / double(bbox_h))*f; + double lag = lag_map. octaveNoise(perlin_x, perlin_y, octaves)*0.5 + 0.5; + double slope = slope_map.octaveNoise(perlin_x, perlin_y, 8)*0.5 + 0.5; + + return interpolate(c1, c2, lag, slope, 1.0 - t); + } + else if (fading == COSINE) return interpolate(c1, c2, 0.5, 0.5, 1.0 - t); + + return interpolate(c1, c2, 1.0 - t); +} + +color morph::interpolate(color c1, color c2, double lag, double slope, double str) { + if (fading == COSINE || fading == PERLIN) { + const double pi = 3.14159265358; + double s = (slope+0.1)/1.1; + double l = (1.0 - s) * lag; + + if (str <= l ) str = 0.0; + else if (str >= (l+s)) str = 1.0; + else str = ((-cos((str-l)*(pi/s))+1.0)/2.0); + } + + return interpolate(c1, c2, str); +} + +color morph::interpolate(color c1, color c2, double c1_weight) { + color c; + c.r = std::round(c1_weight * double(c1.r) + (1.0 - c1_weight) * double(c2.r)); + c.g = std::round(c1_weight * double(c1.g) + (1.0 - c1_weight) * double(c2.g)); + c.b = std::round(c1_weight * double(c1.b) + (1.0 - c1_weight) * double(c2.b)); + c.a = std::round(c1_weight * double(c1.a) + (1.0 - c1_weight) * double(c2.a)); + return c; +} + +pixel morph::interpolate(pixel px1, pixel px2, double px1_weight) { + pixel px; + px.x = std::round(px1_weight * double(px1.x) + (1.0 - px1_weight) * double(px2.x)); + px.y = std::round(px1_weight * double(px1.y) + (1.0 - px1_weight) * double(px2.y)); + px.c.r = std::round(px1_weight * double(px1.c.r) + (1.0 - px1_weight) * double(px2.c.r)); + px.c.g = std::round(px1_weight * double(px1.c.g) + (1.0 - px1_weight) * double(px2.c.g)); + px.c.b = std::round(px1_weight * double(px1.c.b) + (1.0 - px1_weight) * double(px2.c.b)); + px.c.a = std::round(px1_weight * double(px1.c.a) + (1.0 - px1_weight) * double(px2.c.a)); + return px; +} + +point morph::interpolate(point pt1, point pt2, double pt1_weight) { + point pt; + + double x1 = (double(UINT8_MAX+1)*pt1.s.x + pt1.s.x_fract); + double y1 = (double(UINT8_MAX+1)*pt1.s.y + pt1.s.y_fract); + double x2 = (double(UINT8_MAX+1)*pt2.s.x + pt2.s.x_fract); + double y2 = (double(UINT8_MAX+1)*pt2.s.y + pt2.s.y_fract); + double x = (pt1_weight * x1 + (1.0 - pt1_weight) * x2); + double y = (pt1_weight * y1 + (1.0 - pt1_weight) * y2); + + pt.s.x = x / double(UINT8_MAX+1); pt.s.x_fract = x - (pt.s.x*(UINT8_MAX+1)); + pt.s.y = y / double(UINT8_MAX+1); pt.s.y_fract = y - (pt.s.y*(UINT8_MAX+1)); + + return pt; +} + +void morph::set_resolution(uint16_t w, uint16_t h) { + width = w; + height = h; +} + +double morph::get_time(size_t frame_index, size_t total_frames_out) { + if (total_frames_out == 0) return 0.0; + + if (finite) { + if (total_frames_out == 1) { + if (get_frame_count() == 0) return 0.0; + + return (1.0 - (1.0/double(get_frame_count())))/2.0; + } + + double t = double(frame_index) / double(total_frames_out-1); + t*= 1.0 - (1.0/double(get_frame_count())); + return t; + } + + return double(frame_index) / double(total_frames_out); +} + +blob * morph::find_blob_by_group(size_t frame_key, size_t group) { + if (!has_frame(frame_key)) return nullptr; + + std::vector *blobs = &(frames[frame_key].blobs); + size_t bsz = blobs->size(); + + for (size_t i=0; i< bsz; ++i) { + if (blobs->at(i)->group == group) return blobs->at(i); + } + + return nullptr; +} + +void morph::set_fluid(unsigned f) { + if (fluidsteps != f) { + fluidsteps = f; + if (fluidsteps > 0 && density > 1) { + set_density(1); + } + } +} + +void morph::set_density(uint16_t d) { + if (density != d) { + density = d; + identifier++; + if (fluidsteps != 0 && density > 1) { + set_fluid(0); + } + } +} + +} + diff --git a/morph.h b/morph.h new file mode 100644 index 0000000..3c1e11b --- /dev/null +++ b/morph.h @@ -0,0 +1,147 @@ +/* + * See Copyright Notice in atomorph.h + */ + +#include "atomorph.h" + +namespace am { + +class morph { + public: + morph(); + ~morph(); + + void clear (); + bool add_pixel (size_t frame, pixel px); + bool add_frame (size_t frame); + size_t get_pixel_count (size_t frame); + size_t get_frame_key (double t); + size_t get_blob_count (size_t frame); + size_t get_blob_count (); + pixel get_average_pixel (size_t frame); + pixel get_average_pixel (size_t frame, size_t blob); + pixel get_pixel (size_t frame, size_t position); + color get_background (uint16_t x, uint16_t y, double t); + point interpolate (point pt1, point pt2, double pt1_weight); + pixel interpolate (pixel px1, pixel px2, double px1_weight); + color interpolate (color c1, color c2, double c1_weight); + color interpolate (color c1, color c2, double lag, double slope, double c1_weight); + const blob* get_pixels (size_t blob, double t, std::vector *to); + void get_pixels (double t, std::vector *to); + void set_seed (unsigned seed); + double get_time (size_t current_frame, size_t total_frames); + double normalize_time (double t); + + uint16_t get_width () {return width;} + uint16_t get_height () {return height;} + size_t get_frame_count () {return frames.size();} + unsigned get_state () {return state;} + void next_state () {skip_state = true;} + const blob* get_blob (size_t f, size_t b) {return (has_blob(f, b) ? ((const blob*) frames[f].blobs[b]) : nullptr);} + double get_energy () {return energy;} + pixel blob2pixel (const blob *bl); + void compute (); // If not busy yet, sets worker thread to run indefinitely. + void iterate (size_t iterations); // If not busy yet, sets worker thread to run the defined number of iterations. + void compute (double seconds); // If not busy yet, sets worker thread to run for the defined number of seconds. + void suspend (); // Blocks the calling thread until morph is no longer busy. Returns when worker is paused. + bool suspend (double timeout); // Blocks the calling thread for timeout seconds at maximum. Returns false on timeout. + bool is_busy () const {return (worker.is_running() && !worker.is_paused());} + + bool synchronize (); // Synchronizes data with the worker thread. Returns false when worker is busy at the moment. + + void set_blob_delimiter (unsigned char d) {blob_delimiter = d;} // Color distance formula. + void set_blob_threshold (double t) {blob_threshold = t;} // Color difference toleration. + void set_blob_max_size (size_t s) {blob_max_size = s;} // Maximum size of a blob. + void set_blob_min_size (size_t s) {blob_min_size = s;} // Minimum size of a blob. + void set_blob_box_grip (uint16_t g) {blob_box_grip = g;} // Defines the bounding box. + void set_blob_box_samples(size_t s) {blob_box_samples=s;} // Number of dust samples. + void set_blob_number (size_t n) {blob_number = n;} // Preferred number of blobs. + void set_blob_rgba_weight(unsigned char w) {blob_rgba_weight=w;} // Blob RGBA weight. + void set_blob_size_weight(unsigned char w) {blob_size_weight=w;} // Blob size weight. + void set_blob_xy_weight (unsigned char w) {blob_xy_weight =w;} // Blob location weight. + void set_degeneration (size_t d) {degeneration =d;} // Solution degeneration period. + void set_motion (unsigned char m) {motion =m;} // How to interpolate movement. + void set_fading (unsigned char f) {fading =f;} // How to interpolate colors. + void set_threads (size_t t) {threads =t;} // How many threads the worker thread can spawn. + void set_cycle_length (size_t c) {cycle_length =c;} // How many times to morph per iteration. + void set_feather (size_t f) {feather =f;} // Blob outer layers to fade out. + void set_keep_background (bool k) {keep_background =k;} // Background is kept and cross-dissolved. + void set_finite (bool f) {finite =f;} // Morph will not repeat itself. + void set_show_blobs (unsigned b) {show_blobs =b;} // Determines how blobs are drawn. + + // These change identifier, causing the morph to restart: + void set_fluid (unsigned f); // Steps of fluid simulation per frame. + void set_density (uint16_t d); // Key points per pixel. + + void set_resolution (uint16_t w, uint16_t h); + + private: + inline bool has_pixel (size_t f, size_t pos) {return (has_frame(f) && frames[f].pixels.find(pos) != frames[f].pixels.end());} + inline bool has_frame (size_t f ) const {return (frames.find(f) != frames.end());} + inline bool has_blob (size_t f, size_t b ) {return (has_frame(f) && frames[f].blobs.size() > b);} + void refresh_frames(); + + blob * find_blob_by_group(size_t frame_key, size_t group); + + void draw_atoms(double t, std::vector *image); + void draw_fluid(double t, std::vector *image); + void step_fluid(size_t frame_key, double t, double time); + + void update_particle (Particle *p, const blob * blob_before, const blob * blob_after, point **points, + std::map& src, std::map& dest, double t, size_t y, + size_t y_next, size_t frame_key, size_t next_frame_key, size_t chain_key, double time); + + std::map frames; + std::map chains; // Key is the blob's group. + + unsigned char fading = PERLIN; // Color interpolation. + unsigned char motion = SPLINE; // Trajectory interpolation. + unsigned char blob_delimiter = HSP; + double blob_threshold = 1.0; + size_t blob_number = 1; + size_t blob_max_size = SIZE_MAX; + size_t blob_min_size = 1; + size_t blob_box_samples = 10; + uint16_t blob_box_grip = UINT16_MAX; + unsigned char blob_rgba_weight = 1; + unsigned char blob_size_weight = 1; + unsigned char blob_xy_weight = 1; + size_t degeneration = 0; + uint16_t density = 1; + size_t threads = 0; + size_t cycle_length = 1000; + size_t feather = 0; + bool keep_background = false; + bool blend_blobs = false; + bool finite = false; + unsigned fluidsteps = 0; + unsigned show_blobs = TEXTURE; + unsigned seed; + + // Minimum Bounding Box that fits all pixels of all frames: + uint16_t bbox_x1 = UINT16_MAX; + uint16_t bbox_y1 = UINT16_MAX; + uint16_t bbox_x2 = 0; + uint16_t bbox_y2 = 0; + + uint16_t width = 0; + uint16_t height = 0; + + size_t identifier=0; // Changed when anything changes in the key frames. + unsigned state =STATE_BLOB_DETECTION; + bool skip_state=false; + + thread worker; + double energy=0.0; + + PerlinNoise lag_map; + PerlinNoise slope_map; + + FluidModel *fluid = nullptr; + unsigned sparseness = 1; + + std::default_random_engine e1; +}; + +} + diff --git a/obj/.gitignore b/obj/.gitignore new file mode 100644 index 0000000..5e7d273 --- /dev/null +++ b/obj/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore diff --git a/perlin.cpp b/perlin.cpp new file mode 100644 index 0000000..8a4a651 --- /dev/null +++ b/perlin.cpp @@ -0,0 +1,90 @@ +/* + * See Copyright Notice in perlin.h + */ +#include +#include +#include +#include +#include +#include "perlin.h" + +PerlinNoise::PerlinNoise( unsigned seed ) { + if(seed==0) seed = std::mt19937::default_seed; + // p[0]..p[255] contains all numbers in [0..255] in random order + std::iota(std::begin(p),std::begin(p)+256,0); + std::shuffle(std::begin(p),std::begin(p)+256,std::mt19937(seed)); + for(int i=0; i<256; ++i) p[256+i] = p[i]; +} + +double PerlinNoise::noise( double x, double y, double z ) const { + const int X = static_cast(::floor(x)) & 255; + const int Y = static_cast(::floor(y)) & 255; + const int Z = static_cast(::floor(z)) & 255; + + x -= ::floor(x); + y -= ::floor(y); + z -= ::floor(z); + + const double u = fade(x); + const double v = fade(y); + const double w = fade(z); + + const int A = p[X ]+Y, AA = p[A]+Z, AB = p[A+1]+Z; + const int B = p[X+1]+Y, BA = p[B]+Z, BB = p[B+1]+Z; + + return lerp(w, lerp(v, lerp(u, grad(p[AA ], x , y , z ), + grad(p[BA ], x-1, y , z )), + lerp(u, grad(p[AB ], x , y-1, z ), + grad(p[BB ], x-1, y-1, z ))), + lerp(v, lerp(u, grad(p[AA+1], x , y , z-1 ), + grad(p[BA+1], x-1, y , z-1 )), + lerp(u, grad(p[AB+1], x , y-1, z-1 ), + grad(p[BB+1], x-1, y-1, z-1 )))); +} + +double PerlinNoise::octaveNoise( double x, int octaves ) const { + double result = 0.0; + double amp = 1.0; + + for(int i=0; i= (int)vp.size() ? p0 - (int)vp.size() : p0)); + int p1 = p; p1 = (p1 < 0 ? vp.size()-1 : (p1 >= (int)vp.size() ? p1 - (int)vp.size() : p1)); + int p2 = p + 1; p2 = (p2 < 0 ? vp.size()-1 : (p2 >= (int)vp.size() ? p2 - (int)vp.size() : p2)); + int p3 = p + 2; p3 = (p3 < 0 ? vp.size()-1 : (p3 >= (int)vp.size() ? p3 - (int)vp.size() : p3)); + // Relative (local) time + double lt = (t - delta_t*(double)p) / delta_t; + // Interpolate + return CRSpline::Eq(lt, vp[p0], vp[p1], vp[p2], vp[p3]); +} + +int CRSpline::GetNumPoints() { + return vp.size(); +} + +Vec3D& CRSpline::GetNthPoint(int n) { + return vp[n]; +} + +} + diff --git a/spline.h b/spline.h new file mode 100644 index 0000000..94624c2 --- /dev/null +++ b/spline.h @@ -0,0 +1,45 @@ +// ============================================================================ +// Copyright Jean-Charles LAMBERT - 2007-2013 +// e-mail: Jean-Charles.Lambert@oamp.fr +// address: Dynamique des galaxies +// Laboratoire d'Astrophysique de Marseille +// Pôle de l'Etoile, site de Château-Gombert +// 38, rue Frédéric Joliot-Curie +// 13388 Marseille cedex 13 France +// CNRS U.M.R 7326 +// ============================================================================ +// See the complete license in LICENSE and/or "http://www.cecill.info". +// ============================================================================ +#ifndef CATMULL_ROM_SPLINE_H +#define CATMULL_ROM_SPLINE_H +#include "vec3d.h" +#include + +namespace glnemo { + +class CRSpline +{ + public: + CRSpline(); + CRSpline(const CRSpline&); + ~CRSpline(); + + void AddSplinePoint(const Vec3D& v); + Vec3D GetInterpolatedSplinePoint(double t); // t = 0...1; 0=vp[0] ... 1=vp[max] + int GetNumPoints(); + Vec3D& GetNthPoint(int n); + + // Static method for computing the Catmull-Rom parametric equation + // given a time (t) and a vector quadruple (p1,p2,p3,p4). + static Vec3D Eq(double t, const Vec3D& p1, const Vec3D& p2, const Vec3D& p3, const Vec3D& p4); + + // Clear ctrl points + void clearCPoints() { vp.clear();} + + private: + std::vector vp; + double delta_t; +}; +} +#endif + diff --git a/thread.cpp b/thread.cpp new file mode 100644 index 0000000..fec4dae --- /dev/null +++ b/thread.cpp @@ -0,0 +1,1236 @@ +/* + * See Copyright Notice in atomorph.h + */ + +#include +#include "atomorph.h" + +namespace am { + +thread::thread() { + signal_stop = false; + signal_pause = false; + running = false; + paused = true; + + iterations = 0; + seconds = 0.0; + + blob_map = nullptr; + blob_map_w = 0; + blob_map_h = 0; + blob_map_e = 0.0; + chain_map_e = 0.0; + + clear(); +} + +thread::~thread() { + if (step_thread.joinable()) { + pause(); + stop(); + } + clear(); +} + +bool thread::clear() { + if (running && !paused) return false; + + if (blob_map) { + for ( size_t i = 0; i < blob_map_w; ++i) { + delete [] blob_map[i]; + } + delete [] blob_map; + blob_map = nullptr; + } + blob_map_w = 0; + blob_map_h = 0; + blob_map_e = 0.0; + best_blob_map_e = 0.0; + + best_e = std::numeric_limits::infinity(); + chain_map_e = std::numeric_limits::infinity(); + deviant= false; + + while (!frames.empty()) { + frame f = frames.begin()->second; + while (!f.blobs.empty()) { + delete f.blobs.back(); + f.blobs.pop_back(); + } + frames.erase(frames.begin()); + } + frames.clear(); + + while (!chains.empty()) { + chain c = chains.begin()->second; + clear_chain(&c); + chains.erase(chains.begin()); + } + chains.clear(); + + state = STATE_BLOB_DETECTION; + identifier = SIZE_MAX; + counter = 1; + + bbox_x1 = UINT16_MAX; + bbox_y1 = UINT16_MAX; + bbox_x2 = 0; + bbox_y2 = 0; + bbox_d = 0; + + return true; +} + +void thread::set_seed(unsigned seed) { + if (running && !paused) return; + this->seed = seed; + std::default_random_engine e(seed); + e1 = e; +} + +void thread::set_frame (size_t nr, frame * frame_pt) { + if (running && !paused) return; + + frames[nr].pixels.insert(frame_pt->pixels.begin(), frame_pt->pixels.end()); + frames[nr].x = frame_pt->x; + frames[nr].y = frame_pt->y; + frames[nr].r = frame_pt->r; + frames[nr].g = frame_pt->g; + frames[nr].b = frame_pt->b; + frames[nr].a = frame_pt->a; + frames[nr].first_expansion=0; + frames[nr].first_dust =0; + + // Refresh frame indexes: + std::map::iterator it; + size_t index = 0; + for (it=frames.begin(); it!=frames.end(); ++it) { + it->second.index = index++; + } +} + +void thread::resume(size_t iterations) { + if (!is_paused()) return; + this->iterations = iterations; + resume(); +} + +void thread::resume(double seconds) { + if (!is_paused()) return; + this->seconds = seconds; + resume(); +} + +void thread::start(size_t iterations) { + if (is_running()) return; + this->iterations = iterations; + start(); + resume(); +} + +void thread::start(double seconds) { + if (is_running()) return; + this->seconds = seconds; + start(); + resume(); +} + +void thread::step() { + switch (state) { + case STATE_BLOB_DETECTION: if (blobify()) { + state = STATE_BLOB_UNIFICATION; + counter = 0; + } + break; + case STATE_BLOB_UNIFICATION: if (unify()) { + state = STATE_BLOB_MATCHING; + counter = 0; + } + break; + case STATE_BLOB_MATCHING: if (skip_state || match()) { + if (!init_morph()) { + state = STATE_DONE; + } + else { + state = STATE_ATOM_MORPHING; + } + counter = 0; + } + break; + case STATE_ATOM_MORPHING: if (skip_state || morph()) { + state = STATE_DONE; + counter = 0; + } + break; + default: break; + } + skip_state = false; + counter++; + return; +} + +void thread::run() { + std::chrono::steady_clock::time_point start,end; + start = std::chrono::steady_clock::now(); + + while (!signal_stop) { + if (!signal_pause && !paused) { + step(); + if (iterations > 0 && --iterations == 0) { + // When the defined number of steps have been made, automatically pause the thread. + signal_pause = true; + } + + if (seconds > 0.0) { + // When worked more than the defined number of seconds, automatically pause the thread. + end = std::chrono::steady_clock::now(); + if (std::chrono::duration_cast(end - start).count() > (seconds * 1000000000)) { + signal_pause = true; + seconds = 0.0; + } + } + } + else { + paused = true; + signal_pause = false; + std::this_thread::sleep_for(std::chrono::milliseconds(0)); + + start = std::chrono::steady_clock::now(); + } + } + running = false; + signal_stop = false; + signal_pause = false; + paused = true; +} + +bool thread::can_expand(size_t frame, size_t from_pos, size_t to_pos) { + if (!has_pixel(frame, to_pos)) return false; + + pixel p1 = get_pixel(frame, from_pos); + pixel p2 = get_pixel(frame, to_pos); + + if (color_distance(p1.c, p2.c) <= blob_threshold) return true; + + return false; +} + +pixel thread::get_pixel (size_t f, size_t pos) { + if (!has_pixel(f,pos)) return create_pixel(0,0,0,0,0,0); + return frames[f].pixels[pos]; +} + +// Returns false when not finished. +bool thread::blobify_frame(size_t frame_key) { + frame* f = &frames[frame_key]; + size_t sz = f->blobs.size(); + size_t pos,to_pos,x,y,b; + + if (sz == 0) { + // First step is to interpret all pixels as atomic blobs. + std::map::iterator it; + for (it=f->pixels.begin(); it!=f->pixels.end(); ++it) { + pos = it->first; + blob* new_blob = new blob; + new_blob->surface.insert(pos); + new_blob->x = it->second.x; + new_blob->y = it->second.y; + new_blob->r = (it->second.c.r/255.0); + new_blob->g = (it->second.c.g/255.0); + new_blob->b = (it->second.c.b/255.0); + new_blob->a = (it->second.c.a/255.0); + new_blob->group = pos; + x = pos % (UINT16_MAX+1); + y = pos / (UINT16_MAX+1); + + // Add reasonable border. + if (x < UINT16_MAX && has_pixel(frame_key, (to_pos = xy2pos(x+1, y )))) new_blob->border.insert(to_pos); + if (x > 0 && has_pixel(frame_key, (to_pos = xy2pos(x-1, y )))) new_blob->border.insert(to_pos); + if (y < UINT16_MAX && has_pixel(frame_key, (to_pos = xy2pos(x , y+1)))) new_blob->border.insert(to_pos); + if (y > 0 && has_pixel(frame_key, (to_pos = xy2pos(x , y-1)))) new_blob->border.insert(to_pos); + + f->blobs.push_back(new_blob); + f->owners[pos] = new_blob; + } + + std::shuffle(f->blobs.begin(), f->blobs.end(), e1); + sz = f->blobs.size(); + + for (size_t bb = 0; bbblobs[bb]->index = bb; + } + + if (f->blobs.size() == 0 || blob_max_size == 1) return true; + + return false; + } + + Again: // For popping all sequential nullptrs from the end of the vector. + sz = f->blobs.size(); + b = 0; + if (sz > 1) { + // Always take the last blob from the initially shuffled vector + // because popping the last element is fast. + b = sz-1; + } + else return true; + + blob* bl = (f->blobs[b]); + + if (!bl || bl->surface.size() == 0) { + // This blob is empty, remove it. + f->blobs.pop_back(); + delete bl; + goto Again; + } + + if (f->blobs.size() <= blob_number) return true; + + std::set::iterator it; + std::vector erased_border; + std::set checked; + bool best_found = false; + double best_dist = 0.0; + blob * best_match = nullptr; + size_t best_equal = 0; + + if (bl->surface.size() >= blob_min_size) { + // This blob has met its minimum size, prevent it from being unified later. + bl->unified = true; + } + + bool check_threshold = true; + if (bl->surface.size() < blob_max_size) { + IgnoreColourThreshold: + + for (it=bl->border.begin(); it!=bl->border.end(); ++it) { + pos = *it; + if (bl->surface.count(pos) != 0 + || f->owners.count(pos) == 0 + || checked.count(f->owners[pos]) != 0 + || !has_pixel(frame_key, pos)) { + // Don't expand into itself and empty positions. + if (check_threshold && bl->surface.size() >= blob_min_size) { + erased_border.push_back(pos); + } + } + else { + // Find out which blob currently owns this pixel. + blob *owner = f->owners[pos]; + checked.insert(owner); + if (owner != bl) { + double dist; + color c1 = create_color(owner->r,owner->g,owner->b,owner->a); + color c2 = create_color(bl->r, bl->g, bl->b, bl->a); + dist = color_distance(c1, c2); + + if ((dist <= blob_threshold || !check_threshold) && (!best_found || dist <= best_dist)) { + if (best_found && dist == best_dist) { + std::uniform_int_distribution uniform_dist_border (0, best_equal); + best_equal++; + if (uniform_dist_border(e1) != 0) continue; + } + else { + best_equal = 1; + } + best_found = true; + best_match = owner; + best_dist = dist; + } + } + } + } + } + + if (best_found) { + // Merge with this blob. + size_t surface_1 = bl->surface.size(); + size_t surface_2 = best_match->surface.size(); + double weight = (surface_2) / double(surface_1 + surface_2); + + bl->x = ((1.0 - weight) * bl->x + weight * best_match->x); + bl->y = ((1.0 - weight) * bl->y + weight * best_match->y); + bl->r = ((1.0 - weight) * bl->r + weight * best_match->r); + bl->g = ((1.0 - weight) * bl->g + weight * best_match->g); + bl->b = ((1.0 - weight) * bl->b + weight * best_match->b); + bl->a = ((1.0 - weight) * bl->a + weight * best_match->a); + + for (it=best_match->surface.begin(); it!=best_match->surface.end(); ++it) { + f->owners[*it] = bl; + bl->surface.insert(*it); + } + + for (it=best_match->border.begin(); it!=best_match->border.end(); ++it) { + bl->border.insert(*it); + } + + best_match->surface.clear(); + best_match->border .clear(); + + size_t blob_index = best_match->index; + f->blobs[blob_index] = bl; + bl->index = blob_index; + bl->unified = (bl->unified || best_match->unified); + + delete best_match; + f->blobs.pop_back(); + } + else { + size_t bb = f->first_expansion; + + if (bl->surface.size() < blob_min_size && bl->border.size() > 0 && check_threshold) { + // This outlier has neighbours but it is undersized. Discard colour threshold constraint. + check_threshold = false; + checked.clear(); + goto IgnoreColourThreshold; + } + + bl->border.clear(); // Don't attempt to expand any more. + + if (bb < sz) { + // Swap it with last random blob. + blob *other = f->blobs[bb]; + if (other) other->index = b; + + f->blobs[b] = other; + f->blobs[bb] = bl; + bl->index = bb; + + f->first_expansion++; + } + else return true; // None of the remaining blobs can expand any more. + } + + // Remove erased borders. + size_t esz = erased_border.size(); + for (size_t i=0; iborder.erase(erased_border[i]); + } + + return false; +} + +bool thread::blobify() { + bool done = true; + std::map::iterator it; + + for (it=frames.begin(); it!=frames.end(); ++it) { + done &= blobify_frame(it->first); + } + + return done; +} + +// Returns false when not finished. +bool thread::unify_frame(size_t frame_key) { + frame* f = &frames[frame_key]; + size_t fexp; // Only unify blobs that cannot expand any more. + size_t sz; + size_t bb; + blob *bl, *ubl; + blob *best; + size_t score = 0; + uint16_t ubl_x, ubl_y; + size_t samples; + bool done = true; + size_t blobs_before = 0; + std::set::iterator it; + + // Remove all sequential nullptrs from the end of blobs. + while (!f->blobs.empty() && f->blobs.back() == nullptr) { + f->blobs.pop_back(); + } + + blobs_before = f->blobs.size(); + if (blob_box_samples == 0 || blobs_before <= blob_number) return true; + + Again: + ubl = nullptr; + best = nullptr; + samples = 0; + + NotEnoughSamples: + sz = f->blobs.size(); + fexp = f->first_expansion; + + for (bb = f->first_dust; bbblobs[bb]) == nullptr) continue; + + if (bl == ubl) { + // Cycle has ended. + goto Samples; + } + + if (bl->unified) { + size_t fd = f->first_dust; + if (bb != fd) { + // Swap this already unified blob with current first dust + // and increase the first dust index by 1. + blob *fdb = f->blobs[fd]; + if (fdb) fdb->index = bb; + bl->index = fd; + f->blobs[fd] = bl; + f->blobs[bb] = fdb; + } + f->first_dust++; + goto Again; + } + + if (samples >= blob_box_samples) { + Samples: + samples = 0; + if (best == nullptr) { + // Nothing suitable for merging. + if (done) { + ubl->unified = true; + } + bb = ubl->index; + ubl = nullptr; + continue; + } + else { + // Enough samples gathered, now merge with the best one. + size_t bi = best->index; + + size_t surface_1 = ubl->surface.size(); + size_t surface_2 = best->surface.size(); + double weight = (surface_2) / double(surface_1 + surface_2); + + ubl->x = ((1.0 - weight) * ubl->x + weight * best->x); + ubl->y = ((1.0 - weight) * ubl->y + weight * best->y); + ubl->r = ((1.0 - weight) * ubl->r + weight * best->r); + ubl->g = ((1.0 - weight) * ubl->g + weight * best->g); + ubl->b = ((1.0 - weight) * ubl->b + weight * best->b); + ubl->a = ((1.0 - weight) * ubl->a + weight * best->a); + + for (it=best->surface.begin(); it!=best->surface.end(); ++it) { + f->owners[*it] = ubl; + ubl->surface.insert(*it); + } + + best->surface.clear(); + best->border .clear(); + ubl ->border .clear(); // Not needed because it's a pixel dust cloud anyway. + + f->blobs[bi] = nullptr; + + delete best; + best = nullptr; + + if (sz == fexp) { + // sz should always equal to fexp if everything + // has been properly blobified before unifying. + // This optimization is only then possible. + if (f->blobs.back()) { + // Last element is not nullptr, swap it with blobs[bi] + // so that the latter can be safely popped later. + size_t last_index = f->blobs.back()->index; + f->blobs[bi] = f->blobs.back(); + f->blobs[bi]->index = bi; + f->blobs[last_index] = nullptr; + } + + while (!f->blobs.empty() && f->blobs.back() == nullptr) { + f->blobs.pop_back(); + sz--; + fexp--; + f->first_expansion--; + } + } + done = false; + + if (sz <= blob_number) { + ubl->unified = true; + return false; + } + } + bb = ubl->index; // Next, take a blob right after ubl. + ubl = nullptr; + continue; + } + + if (ubl == nullptr) { + ubl = bl; + ubl_x = round(ubl->x); + ubl_y = round(ubl->y); + continue; + } + + samples++; + + std::pair bounds_x = std::minmax(ubl_x, uint16_t(round(bl->x))); + std::pair bounds_y = std::minmax(ubl_y, uint16_t(round(bl->y))); + + if (bounds_x.first + blob_box_grip >= bounds_x.second + && bounds_y.first + blob_box_grip >= bounds_y.second) { + size_t dx,dy,current_score; + dx = (bounds_x.second - bounds_x.first); + dy = (bounds_y.second - bounds_y.first); + current_score = dx*dx+dy*dy; + + if (best == nullptr + || current_score < score) { + best = bl; + score = current_score; + continue; + } + } + } + if (samples > 0 && ubl) { + goto NotEnoughSamples; + } + + return done; +} + +bool thread::unify() { + bool done = true; + std::map::iterator it; + + for (it=frames.begin(); it!=frames.end(); ++it) { + done = (done && unify_frame(it->first)); + } + + return done; +} + +bool thread::match() { + if (blob_map == nullptr) { + // Find the frame with the largest number of blobs. + std::map::iterator it; + size_t blob_count = 0; + size_t frame_count= 0; + for (it=frames.begin(); it!=frames.end(); ++it) { + frame *f = &(it->second); + if (blob_count < f->blobs.size()) { + blob_count = f->blobs.size(); + } + frame_count++; + } + + blob_map_w = blob_count; + blob_map_h = frame_count; + + size_t i; + blob_map = new (std::nothrow) blob** [blob_map_w]; + if (blob_map) { + for (i = 0 ; i < blob_map_w ; ++i ) { + blob_map[i] = new (std::nothrow) blob* [blob_map_h]; + if (blob_map[i] == nullptr) { + for(size_t j = 0; j<=i; ++j) { + delete [] blob_map[j]; + } + delete [] blob_map; + blob_map = nullptr; + return false; + } + } + + // Fill blob map with pointers to real blobs. + size_t f=0; + for (it=frames.begin(); it!=frames.end(); ++it) { + frame *fp = &(it->second); + + // Add empty blobs if needed. + while (fp->blobs.size() < blob_count) { + blob* new_blob = new blob; + new_blob->x = fp->x; + new_blob->y = fp->y; + new_blob->r = fp->r; + new_blob->g = fp->g; + new_blob->b = fp->b; + new_blob->a = fp->a; + new_blob->unified = true; + new_blob->index = fp->blobs.size(); + fp->blobs.push_back(new_blob); + } + + size_t blobs = fp->blobs.size(); + + std::shuffle(fp->blobs.begin(), fp->blobs.end(), e1); + + for (size_t b=0; bblobs[b]; + fp->blobs[b]->group = b; + fp->blobs[b]->index = b; + } + ++f; + } + + blob_map_e = get_energy(blob_map); + } + + return false; + } + + if (blob_map_h == 0 || blob_map_w <= 1) return true; + + // Pick 2 blobs randomly and swap them if it would decrease the energy. + std::uniform_int_distribution uniform_dist_x(0, blob_map_w - 1); + std::uniform_int_distribution uniform_dist_y(0, blob_map_h - 1); + size_t x1,x2; + size_t y = uniform_dist_y(e1); + size_t y_next = (y+1) % blob_map_h; + size_t y_prev = (y>0 ? y-1 : blob_map_h - 1); + + x1 = uniform_dist_x(e1); + do { + x2 = uniform_dist_x(e1); + } while (x1 == x2); + + blob* x1_y_prev = blob_map[x1][y_prev]; + blob* x2_y_prev = blob_map[x2][y_prev]; + blob* x1_y = blob_map[x1][y ]; + blob* x2_y = blob_map[x2][y ]; + blob* x1_y_next = blob_map[x1][y_next]; + blob* x2_y_next = blob_map[x2][y_next]; + + bool x1_volatile = x1_y->surface.empty(); + bool x2_volatile = x2_y->surface.empty(); + + if (x1_volatile && x2_volatile) { + return false; // No point to swap empty blobs. + } + + double x1_e_before = blob_distance(x1_y_prev, x1_y) + blob_distance(x1_y, x1_y_next); + double x2_e_before = blob_distance(x2_y_prev, x2_y) + blob_distance(x2_y, x2_y_next); + double x1_e_after = blob_distance(x2_y_prev, x1_y) + blob_distance(x1_y, x2_y_next); + double x2_e_after = blob_distance(x1_y_prev, x2_y) + blob_distance(x2_y, x1_y_next); + + double c1 = x1_e_before + x2_e_before; + double c2 = x1_e_after + x2_e_after; + + if (c1 >= c2 || (degenerate && (counter % degenerate) == 0)) { + blob *buf = blob_map[x2][y]; + blob_map[x2][y] = blob_map[x1][y]; + blob_map[x1][y] = buf; + double gain = c1 - c2; + + blob_map_e -= gain; + if (blob_map_e < 0.0) blob_map_e = 0.0; + + if (blob_map_e < best_e) { + best_e = blob_map_e; + best_blob_map_e = best_e; + counter = 0; + + if (deviant) { + // Refresh all groups. + for (size_t j=0; jgroup = i; + } + } + } + else { + blob_map[x1][y]->group = x1; + blob_map[x2][y]->group = x2; + } + deviant = false; + } + else deviant = true; + } + + if (best_e == 0.0) return true; + + return false; +} + +bool thread::init_morph() { + size_t i,j; + + if (chains.empty() && blob_map) { + chain_map_e = 0.0; + + // Refresh blob map according to groups. + // Needed in case deviant was left TRUE so + // that the blob map might be messed up. + std::map::iterator it; + size_t frame_index = 0; + for (it=frames.begin(); it!=frames.end(); ++it) { + std::vector *blobs = &(it->second.blobs); + size_t blob_count = blobs->size(); + for (i=0; iat(i)->group][frame_index] = blobs->at(i); + } + frame_index++; + } + + // Make sure that volatile blobs have their positions averaged. + for (i=0; i to_be_fixed; + for (j=0; jsurface.size() > max_size) { + max_size = blob_map[i][j]->surface.size(); + } + } + size_t point_count = max_size * point_density; + + // Then create a blob chain that includes all the blobs that share the same group. + for (j=0; j points; + blob *bl = blob_map[i][j]; + point *pt; + std::set::iterator it; + size_t frame_key; + + std::map::iterator fit = frames.begin(); + assert(frames.size() > j); + std::advance(fit, j); + frame_key = fit->first; + + std::uniform_int_distribution uniform_dist_byte(0, UINT8_MAX); + + p = 0; + for (it=bl->surface.begin(); it!=bl->surface.end(); ++it) { + pos = *it; + px = get_pixel(frame_key, pos); + + pt = &(chains[i].points[p][j]); + pt->s.x = px.x; + pt->s.y = px.y; + pt->s.flags = HAS_PIXEL|HAS_FLUID; + pt->s.x_fract = 0; + pt->s.y_fract = 0; + points.push_back(*pt); + + ++p; + } + + if (points.empty()) { + point volatile_point; + volatile_point.s.x = std::round(bl->x); + volatile_point.s.y = std::round(bl->y); + volatile_point.s.flags = HAS_FLUID; // This is still needed for the trajectories of fluid particles. + volatile_point.s.x_fract= 0; + volatile_point.s.y_fract= 0; + + chains[i].points[p][j] = volatile_point; + points.push_back(volatile_point); + ++p; + } + + std::shuffle(points.begin(), points.end(), e1); + size_t psz = points.size(); + + for (; ps.x = points[p%psz].s.x; + pt->s.y = points[p%psz].s.y; + pt->s.flags = points[p%psz].s.flags; + pt->s.flags &= ~HAS_FLUID; // Duplicates must not represent fluid particles. + pt->s.x_fract = uniform_dist_byte(e1); + pt->s.y_fract = uniform_dist_byte(e1); + } + +#ifdef ATOMORPH_OPENCV + // Initiate Locality Sensitive Hashing: + //cv::flann::LinearIndexParams indexParams; + cv::flann::KDTreeIndexParams indexParams(16); + cv::Mat * features = new cv::Mat(chains[i].width, 2, CV_32F); + if (features) { + for (size_t f=0; fat(f, 0) = x; + features->at(f, 1) = y; + chains[i].places[f][j] = f; + } + + cv::flann::Index *kdtree = new cv::flann::Index(*features, indexParams, cvflann::FLANN_DIST_L1); + chains[i].kdtrees[j] = (void *) kdtree; + chains[i].feature[j] = (void *) features; + } +#endif + chains[i].energy = get_energy(&(chains[i])); + chain_map_e += chains[i].energy; + } + } + if (chains.empty()) return false; + } + + // These extra checks are done here in advance to have the morph + // function as fast as possible, without wasting any time on the + // sanity checks. + if (blob_map_h == 0 || blob_map_w == 0) return false; + + size_t max_w = 0; + for (i=0; iheight == 0) return false; + if (ch->width > max_w) max_w = ch->width; + } + + if (max_w <= 1) return false; + + return true; +} + +#ifdef ATOMORPH_OPENCV +bool thread::morph() { + size_t x1, x2; + chain *ch = &(chains[counter % blob_map_w]); + + if (ch->width <= 1) return false; + + std::uniform_int_distribution uniform_dist_x(0, ch->width - 1); + std::uniform_int_distribution uniform_dist_y(0, ch->height- 1); + + size_t y = uniform_dist_y(e1); + size_t y_next = (y+1) % ch->height; + size_t y_prev = (y>0 ? y-1 : ch->height - 1); + + x1 = uniform_dist_x(e1); + do { + x2 = uniform_dist_x(e1); + } while (x1 == x2); + + cv::flann::Index *kdtree = (cv::flann::Index *) ch->kdtrees[y_next]; + + const size_t knn = 2; // Number of nearest neighbors to search for + std::vector query1; // Search near the source + std::vector query2; // Search near the destination + std::vector index1(knn); + std::vector index2(knn); + std::vector dist_1(knn); + std::vector dist_2(knn); + float qx1, qx2, qy1, qy2; + + point2xy(ch->points[x1][y] ,&qx1, &qy1); + query1.push_back(qx1); + query1.push_back(qy1); + + point2xy(ch->points[x1][y_next] ,&qx2, &qy2); + query2.push_back(qx2); + query2.push_back(qy2); + + kdtree->knnSearch(query1, index1, dist_1, knn, cv::flann::SearchParams(1)); + kdtree->knnSearch(query2, index2, dist_2, knn, cv::flann::SearchParams(1)); + + std::vector x2s; // candidates + while (!index1.empty()) { + size_t xn = ch->places[index1.back()][y_next]; + if (xn != x1) { + x2s.push_back(xn); + } + index1.pop_back(); + } + while (!index2.empty()) { + size_t xn = ch->places[index2.back()][y_next]; + if (xn != x1) { + x2s.push_back(xn); + } + index2.pop_back(); + } + x2s.push_back(x2); + std::uniform_int_distribution uniform_dist_x2s(0, x2s.size() - 1); + x2 = x2s[uniform_dist_x2s(e1)]; + + point **map = ch->points; + + point x1_y_prev = map[x1][y_prev]; + point x2_y_prev = map[x2][y_prev]; + point x1_y = map[x1][y ]; + point x2_y = map[x2][y ]; + point x1_y_next = map[x1][y_next]; + point x2_y_next = map[x2][y_next]; + + double x1_e_before = point_distance(x1_y_prev, x1_y) + point_distance(x1_y, x1_y_next); + double x2_e_before = point_distance(x2_y_prev, x2_y) + point_distance(x2_y, x2_y_next); + double x1_e_after = point_distance(x2_y_prev, x1_y) + point_distance(x1_y, x2_y_next); + double x2_e_after = point_distance(x1_y_prev, x2_y) + point_distance(x2_y, x1_y_next); + + double c1 = x1_e_before + x2_e_before; + double c2 = x1_e_after + x2_e_after; + + if (c1 >= c2) { + // Make sure point map indexes are mapped correctly: + size_t **plm = ch->places; + plm[x2][y] = x1; + plm[x1][y] = x2; + + point buf = map[x2][y]; + map[x2][y] = map[x1][y]; + map[x1][y] = buf; + double gain = c1 - c2; + + chain_map_e -= gain; + if (chain_map_e < 0.0) chain_map_e = 0.0; + } + + return false; +} +#else + +std::mutex morph_mutex; +void morph_asynch(point **map, size_t width, size_t height, size_t repeat, unsigned rng_seed, double *gain) { + std::mt19937 gen(rng_seed); + + std::uniform_int_distribution uniform_dist_x(0, width -1); + std::uniform_int_distribution uniform_dist_y(0, height-1); + + size_t y = uniform_dist_y(gen); + size_t y_next = (y+1) % (height); + size_t y_prev = (y>0 ? y-1 : height-1); + + for (size_t i=0; i= c2) { + std::lock_guard lock(morph_mutex); + + // Make sure no other thread has touched these points yet: + if (sizeof(point) == 8) { + if (map[x1][y].word != x1_y.word + || map[x2][y].word != x2_y.word) continue; + } + else { + if (!std::memcmp(&map[x1][y], &x1_y, sizeof(point)) + || !std::memcmp(&map[x2][y], &x2_y, sizeof(point))) continue; + } + + point buf = map[x2][y]; + map[x2][y] = map[x1][y]; + map[x1][y] = buf; + *gain += c1 - c2; + } + } +} + +bool thread::morph() { + chain *ch = &(chains[counter % blob_map_w]); + if (ch->width <= 1) return false; + std::uniform_int_distribution uniform_dist_seed(0, std::numeric_limits::max()); + + point **map = ch->points; + + double gain = 0.0; + if (thread_count == 0) { + morph_asynch(map, ch->width, ch->height, cycle_length, uniform_dist_seed(e1), &gain); + } + else { + std::vector workers; + for (size_t i=0; iwidth, ch->height, cycle_length, uniform_dist_seed(e1), &gain)); + } + + while (!workers.empty()) { + workers.back().join(); + workers.pop_back(); + } + } + chain_map_e-=gain; + + return false; +} +#endif + +size_t thread::get_blob_count (size_t f) { + if (!has_frame(f)) return 0; + return frames[f].blobs.size(); +} + +size_t thread::get_blob_count () { + size_t count = 0; + std::map::iterator it; + + for (it=frames.begin(); it!=frames.end(); ++it) { + count += get_blob_count(it->first); + } + + return count; +} + +double thread::get_energy(struct blob ***map) { + if (blob_map_h == 0 + || blob_map_w == 0) return 0.0; + + blob *pframe_blob, *cframe_blob; + double e=0.0; + + for (size_t i=0; iwidth; + size_t h = ch->height; + + if (w <= 1 || h == 0) return 0.0; + + point **map = ch->points; + double e=0.0; + for (size_t i=0; i x2 || y1 > y2) return; + + bbox_x1 = x1; + bbox_x2 = x2; + bbox_y1 = y1; + bbox_y2 = y2; + + int dx = bbox_x2 - bbox_x1; + int dy = bbox_y2 - bbox_y1; + bbox_d = dx*dx + dy*dy; +} + +void thread::set_blob_weights(unsigned char rgba, unsigned char size, unsigned char xy) { + if (running && !paused) return; + double sum = rgba*rgba + size*size + xy*xy; + if (sum == 0.0) return; + + blob_rgba_weight = double(rgba*rgba)/sum; + blob_size_weight = double(size*size)/sum; + blob_xy_weight = 1.0 - (blob_rgba_weight + blob_size_weight); +} + +double thread::blob_distance(const blob *b1, const blob *b2) { + size_t sz1 = b1->surface.size(); + size_t sz2 = b2->surface.size(); + size_t szs = sz1+sz2; + double pix_dist = 0.0; + double col_dist = 0.0; + double siz_dist = 0.0; + + if (szs > 0) { + siz_dist = fabs(double(sz1)-sz2)/double(szs); + } + + if (sz1 > 0 && sz2 > 0) { + pixel p1,p2; + p1 = create_pixel(b1->x, b1->y, create_color(b1->r, b1->g, b1->b, b1->a)); + p2 = create_pixel(b2->x, b2->y, create_color(b2->r, b2->g, b2->b, b2->a)); + pix_dist = sqrt(double(pixel_distance(p1, p2))/bbox_d); + col_dist = color_distance(p1.c, p2.c); + } + + return (blob_xy_weight * pix_dist + + blob_rgba_weight * col_dist + + blob_size_weight * siz_dist); +} + +double thread::get_energy() { + if (!paused) return std::numeric_limits::infinity(); + double e = -1.0; + switch (state) { + case STATE_BLOB_MATCHING: e = best_blob_map_e; break; + case STATE_ATOM_MORPHING: e = chain_map_e; break; + default: break; + } + return e; +} + +void thread::fix_volatiles (std::vector *to_be_fixed) { + size_t sz = to_be_fixed->size(); + + if (sz <= 1) return; + + size_t i = 0; + bool started = false; + std::vector volatiles; + + blob *first_static = nullptr; + blob *previous_static = nullptr; + + while (1) { + i = (i+1)%sz; + blob *bl = to_be_fixed->at(i); + bool empty = bl->surface.empty(); + + if (!started) { + if (empty) { + if (i == 0) break; // All are empty. + continue; + } + started = true; + first_static = bl; + previous_static = bl; + continue; + } + + if (empty) { + volatiles.push_back(bl); + continue; + } + + if (!volatiles.empty()) { + // Fix the range between previous_static and bl. + size_t vsz = volatiles.size(); + for (size_t v=0; vx = t*bl->x + (1.0 - t)*previous_static->x; + volatiles[v]->y = t*bl->y + (1.0 - t)*previous_static->y; + } + volatiles.clear(); + } + previous_static = bl; + if (previous_static == first_static) break; // Cycle has ended. + } +} + +} + diff --git a/thread.h b/thread.h new file mode 100644 index 0000000..a4d48c5 --- /dev/null +++ b/thread.h @@ -0,0 +1,134 @@ +/* + * See Copyright Notice in atomorph.h + */ + +#include "atomorph.h" + +namespace am { + +class thread { + public: + thread(); + ~thread(); + + void next_state() {skip_state = true;} + unsigned get_state() {return state;} + size_t get_identifier() {return identifier;} + void set_identifier(size_t id) {if (paused) identifier = id;} + frame *get_frame(size_t nr) {return (has_frame(nr) ? &(frames[nr]) : nullptr);} + const std::map *get_chains() {return (const std::map *) &chains;} + unsigned get_seed() {return seed;} + double get_energy(); + void set_frame(size_t nr, frame* f); + size_t get_blob_count(size_t frame); + size_t get_blob_count(); + void set_bbox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); + void set_blob_weights(unsigned char rgba, unsigned char size, unsigned char xy); + + bool clear(); + void set_seed(unsigned seed); + void set_blob_delimiter(unsigned char d) {if (paused) blob_delimiter = d;} // Color distance formula. + void set_blob_threshold(double t) {if (paused) blob_threshold = t;} // Color difference toleration. + void set_blob_max_size (size_t s) {if (paused) blob_max_size = s;} // Maximum size of a blob. + void set_blob_min_size (size_t s) {if (paused) blob_min_size = s;} // Minimum size of a blob. + void set_blob_box_grip (uint16_t g) {if (paused) blob_box_grip = g;} // Defines the bounding box. + void set_blob_box_samples(size_t s) {if (paused) blob_box_samples=s;} // Number of dust samples. + void set_blob_number (size_t n) {if (paused) blob_number = n;} // Preferred number of blobs. + void set_degeneration (size_t d) {if (paused) degenerate = d;} // Degeneration period. + void set_density (uint16_t d) {if (paused) point_density = d;} // Key points per pixel. + void set_threads (size_t n) {if (paused) thread_count = n;} // Number of threads to spawn. + void set_cycle_length (size_t l) {if (paused) cycle_length = l;} // Steps per iteration to repeat. + + bool is_running() const {return running;} + bool is_paused() const {return paused;} + + void stop() { signal_stop = true; while(running) std::this_thread::sleep_for(std::chrono::milliseconds(0)); step_thread.join();} + void start() { running = true; step_thread = std::thread(&thread::run, this);} + void pause() { signal_pause = true; } + void resume() { paused = false;} + + void start (size_t iterations); + void resume(size_t iterations); + void start (double seconds); + void resume(double seconds); + + private: + double blob_distance(const blob *b1, const blob *b2); + pixel get_pixel(size_t frame, size_t position); + + bool blobify (); + bool unify (); + bool match (); + bool morph (); + bool blobify_frame (size_t f); + bool unify_frame (size_t f); + bool init_morph (); + double get_energy (struct blob ***map); + double get_energy (chain *ch); + void fix_volatiles (std::vector *to_be_fixed); + inline bool has_frame (size_t f ) const {return (frames.find(f) != frames.end());} + inline bool has_pixel (size_t f, size_t pos) {return (has_frame(f) && frames[f].pixels.find(pos) != frames[f].pixels.end());} + inline bool has_blob (size_t f, size_t b ) {return (has_frame(f) && frames[f].blobs.size() > b);} + inline bool can_expand (size_t frame, size_t from_pos, size_t to_pos); + + void run(); + void step(); + + std::map frames; + std::map chains; // Key is the blob's group. + + uint16_t point_density = 1; // How many key points to create per pixel at minimum. + + struct blob *** blob_map; + size_t blob_map_w; // Number of blobs per key frame. + size_t blob_map_h; // Number of key frames. + double blob_map_e; // Energy of the current blob map. + double best_blob_map_e; + + double chain_map_e; + + // Minimum Bounding Box that fits all pixels of all frames: + uint16_t bbox_x1 = UINT16_MAX; + uint16_t bbox_y1 = UINT16_MAX; + uint16_t bbox_x2 = 0; + uint16_t bbox_y2 = 0; + uint32_t bbox_d = 0; // Squared diagonal length. + + unsigned char blob_delimiter = HSP; + double blob_threshold = 1.0; + size_t blob_max_size = SIZE_MAX; + size_t blob_min_size = 1; + uint16_t blob_box_grip = UINT16_MAX; + size_t blob_box_samples = 10; + size_t blob_number = 1; + size_t thread_count = 0; + size_t cycle_length = 1; + + double blob_rgba_weight = 0.33; + double blob_size_weight = 0.33; + double blob_xy_weight = 0.34; + + size_t identifier = SIZE_MAX; + unsigned state = STATE_BLOB_DETECTION; + unsigned seed = 0; + bool skip_state = false; + size_t degenerate = 0; + size_t counter = 0; + double best_e; + bool deviant; // True when a bad solution has been accepted lately. + + std::default_random_engine e1; + + std::atomic iterations; + std::atomic seconds; + + std::atomic signal_stop; + std::atomic signal_pause; + std::atomic running; + std::atomic paused; + std::thread step_thread; +}; + +} + + diff --git a/vec3d.h b/vec3d.h new file mode 100644 index 0000000..90ee9eb --- /dev/null +++ b/vec3d.h @@ -0,0 +1,88 @@ +// ============================================================================ +// Copyright Jean-Charles LAMBERT - 2007-2013 +// e-mail: Jean-Charles.Lambert@oamp.fr +// address: Dynamique des galaxies +// Laboratoire d'Astrophysique de Marseille +// Pôle de l'Etoile, site de Château-Gombert +// 38, rue Frédéric Joliot-Curie +// 13388 Marseille cedex 13 France +// CNRS U.M.R 7326 +// ============================================================================ +// See the complete license in LICENSE and/or "http://www.cecill.info". +// ============================================================================ +#ifndef GLNEMOVEC3D_H +#define GLNEMOVEC3D_H +#include +#include +/** + @author Jean-Charles Lambert +*/ +namespace glnemo { + +class Vec3D{ + public: + ~Vec3D() {}; + + double x, y, z; + Vec3D( double InX, double InY, double InZ ) : x( InX ), y( InY ), z( InZ ) {} + Vec3D( const Vec3D& V) : x( V.x ), y( V.y ), z( V.z ) {} + Vec3D( ) : x(0), y(0), z(0) {} + + inline void set( const double InX, const double InY, const double InZ ) { + x = InX; y = InY; z = InZ; + } + + inline bool operator== (const Vec3D& V2) const { return (x == V2.x && y == V2.y && z == V2.z); } + inline Vec3D operator+ (const Vec3D& V2) const { return Vec3D( x + V2.x, y + V2.y, z + V2.z);} + inline Vec3D operator- (const Vec3D& V2) const { return Vec3D( x - V2.x, y - V2.y, z - V2.z);} + inline Vec3D operator- ( ) const { return Vec3D(-x, -y, -z); } + inline Vec3D operator/ (const Vec3D& V2) const { return Vec3D (x / V2.x, y / V2.y, z / V2.z);} + inline Vec3D operator* (const Vec3D& V2) const { return Vec3D (x * V2.x, y * V2.y, z * V2.z);} + inline Vec3D operator* (double S ) const { return Vec3D (x * S, y * S, z * S); } + inline Vec3D operator/ (double S ) const { double f=1.0/S; return Vec3D(x*f,y*f,z*f); } + inline double operator[] (int i ) { return (i == 0 ? x : (i == 1 ? y : z)); } + inline Vec3D& operator= (const Vec3D& V2) { x=V2.x; y=V2.y; z=V2.z; return *this; } + inline void operator+= (const Vec3D& V2) { x += V2.x; y += V2.y; z += V2.z; } + inline void operator-= (const Vec3D& V2) { x -= V2.x; y -= V2.y; z -= V2.z; } + + inline double Dot( const Vec3D &V1 ) const { + return V1.x*x + V1.y*y + V1.z*z; + } + + inline Vec3D CrossProduct( const Vec3D &V2 ) const { + return Vec3D( y * V2.z - z * V2.y, + z * V2.x - x * V2.z, + x * V2.y - y * V2.x ); + } + + Vec3D RotByMatrix( const double m[16] ) const { + return Vec3D( x*m[0] + y*m[4] + z*m[8], + x*m[1] + y*m[5] + z*m[9], + x*m[2] + y*m[6] + z*m[10] ); + } + + // These require math.h for the sqrtf function + inline double Magnitude( ) const { + return sqrt( x*x + y*y + z*z ); + } + + inline double Distance( const Vec3D &V1 ) const { + return ( *this - V1 ).Magnitude(); + } + + inline void Normalize() { + double fMag = ( x*x + y*y + z*z ); + if (fMag == 0) return; + + double fMult = 1.0/sqrtf(fMag); + x *= fMult; + y *= fMult; + z *= fMult; + return; + } +}; + +} + +#endif +