mc_dot_art_maker 0.3.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/Rakefile +7 -0
  4. data/lib/mc_dot_art_maker/block.rb +6 -9
  5. data/lib/mc_dot_art_maker/block_list.rb +2 -2
  6. data/lib/mc_dot_art_maker/dot.rb +51 -18
  7. data/lib/mc_dot_art_maker/extern_lib_extension.rb +11 -0
  8. data/lib/mc_dot_art_maker/maker.rb +118 -97
  9. data/lib/mc_dot_art_maker/schematic_helper.rb +1 -1
  10. data/lib/mc_dot_art_maker/texture_loader.rb +2 -9
  11. data/lib/mc_dot_art_maker/utils.rb +28 -28
  12. data/mc_dot_art_maker.gemspec +1 -1
  13. data/test/images/src/test_image_cat.jpg +0 -0
  14. data/test/images/tmp/normal_conversion_mosaic.png +0 -0
  15. data/test/images/tmp/normal_conversion_mosaic_with_magick__image.png +0 -0
  16. data/test/images/tmp/normal_conversion_schematic.schematic +0 -0
  17. data/test/images/tmp/{dither_methods_RiemersmaDitherMethod.png → normal_conversion_texture.png} +0 -0
  18. data/test/images/tmp/normal_conversion_texture_with_magick__image.png +0 -0
  19. data/test/test_block_list.rb +8 -0
  20. data/test/test_dither_method.rb +5 -5
  21. data/test/test_dot.rb +44 -0
  22. data/test/test_maker.rb +74 -0
  23. data/test/test_normal_conversion.rb +67 -14
  24. data/test/test_texture_loader.rb +9 -1
  25. metadata +10 -448
  26. data/lib/mc_dot_art_maker/textures/brick.png +0 -0
  27. data/lib/mc_dot_art_maker/textures/clay.png +0 -0
  28. data/lib/mc_dot_art_maker/textures/coal_block.png +0 -0
  29. data/lib/mc_dot_art_maker/textures/diamond_block.png +0 -0
  30. data/lib/mc_dot_art_maker/textures/emerald_block.png +0 -0
  31. data/lib/mc_dot_art_maker/textures/glowstone.png +0 -0
  32. data/lib/mc_dot_art_maker/textures/gold_block.png +0 -0
  33. data/lib/mc_dot_art_maker/textures/hardened_clay.png +0 -0
  34. data/lib/mc_dot_art_maker/textures/hardened_clay_stained_black.png +0 -0
  35. data/lib/mc_dot_art_maker/textures/hardened_clay_stained_blue.png +0 -0
  36. data/lib/mc_dot_art_maker/textures/hardened_clay_stained_brown.png +0 -0
  37. data/lib/mc_dot_art_maker/textures/hardened_clay_stained_cyan.png +0 -0
  38. data/lib/mc_dot_art_maker/textures/hardened_clay_stained_gray.png +0 -0
  39. data/lib/mc_dot_art_maker/textures/hardened_clay_stained_green.png +0 -0
  40. data/lib/mc_dot_art_maker/textures/hardened_clay_stained_light_blue.png +0 -0
  41. data/lib/mc_dot_art_maker/textures/hardened_clay_stained_lime.png +0 -0
  42. data/lib/mc_dot_art_maker/textures/hardened_clay_stained_magenta.png +0 -0
  43. data/lib/mc_dot_art_maker/textures/hardened_clay_stained_orange.png +0 -0
  44. data/lib/mc_dot_art_maker/textures/hardened_clay_stained_pink.png +0 -0
  45. data/lib/mc_dot_art_maker/textures/hardened_clay_stained_purple.png +0 -0
  46. data/lib/mc_dot_art_maker/textures/hardened_clay_stained_red.png +0 -0
  47. data/lib/mc_dot_art_maker/textures/hardened_clay_stained_silver.png +0 -0
  48. data/lib/mc_dot_art_maker/textures/hardened_clay_stained_white.png +0 -0
  49. data/lib/mc_dot_art_maker/textures/hardened_clay_stained_yellow.png +0 -0
  50. data/lib/mc_dot_art_maker/textures/hay_block_top.png +0 -0
  51. data/lib/mc_dot_art_maker/textures/ice.png +0 -0
  52. data/lib/mc_dot_art_maker/textures/iron_block.png +0 -0
  53. data/lib/mc_dot_art_maker/textures/lapis_block.png +0 -0
  54. data/lib/mc_dot_art_maker/textures/melon_top.png +0 -0
  55. data/lib/mc_dot_art_maker/textures/nether_brick.png +0 -0
  56. data/lib/mc_dot_art_maker/textures/obsidian.png +0 -0
  57. data/lib/mc_dot_art_maker/textures/planks_birch.png +0 -0
  58. data/lib/mc_dot_art_maker/textures/planks_jungle.png +0 -0
  59. data/lib/mc_dot_art_maker/textures/planks_oak.png +0 -0
  60. data/lib/mc_dot_art_maker/textures/planks_spruce.png +0 -0
  61. data/lib/mc_dot_art_maker/textures/quartz_block_chiseled_top.png +0 -0
  62. data/lib/mc_dot_art_maker/textures/redstone_block.png +0 -0
  63. data/lib/mc_dot_art_maker/textures/sandstone_top.png +0 -0
  64. data/lib/mc_dot_art_maker/textures/soul_sand.png +0 -0
  65. data/lib/mc_dot_art_maker/textures/sponge.png +0 -0
  66. data/lib/mc_dot_art_maker/textures/stonebrick_carved.png +0 -0
  67. data/lib/mc_dot_art_maker/textures/stonebrick_mossy.png +0 -0
  68. data/lib/mc_dot_art_maker/textures/tmp/1.9.jar +0 -0
  69. data/lib/mc_dot_art_maker/textures/wool_colored_black.png +0 -0
  70. data/lib/mc_dot_art_maker/textures/wool_colored_blue.png +0 -0
  71. data/lib/mc_dot_art_maker/textures/wool_colored_brown.png +0 -0
  72. data/lib/mc_dot_art_maker/textures/wool_colored_cyan.png +0 -0
  73. data/lib/mc_dot_art_maker/textures/wool_colored_gray.png +0 -0
  74. data/lib/mc_dot_art_maker/textures/wool_colored_green.png +0 -0
  75. data/lib/mc_dot_art_maker/textures/wool_colored_light_blue.png +0 -0
  76. data/lib/mc_dot_art_maker/textures/wool_colored_lime.png +0 -0
  77. data/lib/mc_dot_art_maker/textures/wool_colored_magenta.png +0 -0
  78. data/lib/mc_dot_art_maker/textures/wool_colored_orange.png +0 -0
  79. data/lib/mc_dot_art_maker/textures/wool_colored_pink.png +0 -0
  80. data/lib/mc_dot_art_maker/textures/wool_colored_purple.png +0 -0
  81. data/lib/mc_dot_art_maker/textures/wool_colored_red.png +0 -0
  82. data/lib/mc_dot_art_maker/textures/wool_colored_silver.png +0 -0
  83. data/lib/mc_dot_art_maker/textures/wool_colored_white.png +0 -0
  84. data/lib/mc_dot_art_maker/textures/wool_colored_yellow.png +0 -0
  85. data/test/images/tmp/dither_methods_FloydSteinbergDitherMethod.png +0 -0
  86. data/test/images/tmp/dither_methods_NoDitherMethod.png +0 -0
  87. data/test/test_block_palette.rb +0 -29
  88. data/textures/anvil_base.png +0 -0
  89. data/textures/anvil_top_damaged_0.png +0 -0
  90. data/textures/anvil_top_damaged_1.png +0 -0
  91. data/textures/anvil_top_damaged_2.png +0 -0
  92. data/textures/beacon.png +0 -0
  93. data/textures/bed_feet_end.png +0 -0
  94. data/textures/bed_feet_side.png +0 -0
  95. data/textures/bed_feet_top.png +0 -0
  96. data/textures/bed_head_end.png +0 -0
  97. data/textures/bed_head_side.png +0 -0
  98. data/textures/bed_head_top.png +0 -0
  99. data/textures/bedrock.png +0 -0
  100. data/textures/bookshelf.png +0 -0
  101. data/textures/brewing_stand.png +0 -0
  102. data/textures/brewing_stand_base.png +0 -0
  103. data/textures/brick.png +0 -0
  104. data/textures/cactus_bottom.png +0 -0
  105. data/textures/cactus_side.png +0 -0
  106. data/textures/cactus_top.png +0 -0
  107. data/textures/cake_bottom.png +0 -0
  108. data/textures/cake_inner.png +0 -0
  109. data/textures/cake_side.png +0 -0
  110. data/textures/cake_top.png +0 -0
  111. data/textures/carrots_stage_0.png +0 -0
  112. data/textures/carrots_stage_1.png +0 -0
  113. data/textures/carrots_stage_2.png +0 -0
  114. data/textures/carrots_stage_3.png +0 -0
  115. data/textures/cauldron_bottom.png +0 -0
  116. data/textures/cauldron_inner.png +0 -0
  117. data/textures/cauldron_side.png +0 -0
  118. data/textures/cauldron_top.png +0 -0
  119. data/textures/clay.png +0 -0
  120. data/textures/coal_block.png +0 -0
  121. data/textures/coal_ore.png +0 -0
  122. data/textures/coarse_dirt.png +0 -0
  123. data/textures/cobblestone.png +0 -0
  124. data/textures/cobblestone_mossy.png +0 -0
  125. data/textures/cocoa_stage_0.png +0 -0
  126. data/textures/cocoa_stage_1.png +0 -0
  127. data/textures/cocoa_stage_2.png +0 -0
  128. data/textures/command_block.png +0 -0
  129. data/textures/comparator_off.png +0 -0
  130. data/textures/comparator_on.png +0 -0
  131. data/textures/crafting_table_front.png +0 -0
  132. data/textures/crafting_table_side.png +0 -0
  133. data/textures/crafting_table_top.png +0 -0
  134. data/textures/daylight_detector_inverted_top.png +0 -0
  135. data/textures/daylight_detector_side.png +0 -0
  136. data/textures/daylight_detector_top.png +0 -0
  137. data/textures/deadbush.png +0 -0
  138. data/textures/destroy_stage_0.png +0 -0
  139. data/textures/destroy_stage_1.png +0 -0
  140. data/textures/destroy_stage_2.png +0 -0
  141. data/textures/destroy_stage_3.png +0 -0
  142. data/textures/destroy_stage_4.png +0 -0
  143. data/textures/destroy_stage_5.png +0 -0
  144. data/textures/destroy_stage_6.png +0 -0
  145. data/textures/destroy_stage_7.png +0 -0
  146. data/textures/destroy_stage_8.png +0 -0
  147. data/textures/destroy_stage_9.png +0 -0
  148. data/textures/diamond_block.png +0 -0
  149. data/textures/diamond_ore.png +0 -0
  150. data/textures/dirt.png +0 -0
  151. data/textures/dirt_podzol_side.png +0 -0
  152. data/textures/dirt_podzol_top.png +0 -0
  153. data/textures/dispenser_front_horizontal.png +0 -0
  154. data/textures/dispenser_front_vertical.png +0 -0
  155. data/textures/door_acacia_lower.png +0 -0
  156. data/textures/door_acacia_upper.png +0 -0
  157. data/textures/door_birch_lower.png +0 -0
  158. data/textures/door_birch_upper.png +0 -0
  159. data/textures/door_dark_oak_lower.png +0 -0
  160. data/textures/door_dark_oak_upper.png +0 -0
  161. data/textures/door_iron_lower.png +0 -0
  162. data/textures/door_iron_upper.png +0 -0
  163. data/textures/door_jungle_lower.png +0 -0
  164. data/textures/door_jungle_upper.png +0 -0
  165. data/textures/door_spruce_lower.png +0 -0
  166. data/textures/door_spruce_upper.png +0 -0
  167. data/textures/door_wood_lower.png +0 -0
  168. data/textures/door_wood_upper.png +0 -0
  169. data/textures/double_plant_fern_bottom.png +0 -0
  170. data/textures/double_plant_fern_top.png +0 -0
  171. data/textures/double_plant_grass_bottom.png +0 -0
  172. data/textures/double_plant_grass_top.png +0 -0
  173. data/textures/double_plant_paeonia_bottom.png +0 -0
  174. data/textures/double_plant_paeonia_top.png +0 -0
  175. data/textures/double_plant_rose_bottom.png +0 -0
  176. data/textures/double_plant_rose_top.png +0 -0
  177. data/textures/double_plant_sunflower_back.png +0 -0
  178. data/textures/double_plant_sunflower_bottom.png +0 -0
  179. data/textures/double_plant_sunflower_front.png +0 -0
  180. data/textures/double_plant_sunflower_top.png +0 -0
  181. data/textures/double_plant_syringa_bottom.png +0 -0
  182. data/textures/double_plant_syringa_top.png +0 -0
  183. data/textures/dragon_egg.png +0 -0
  184. data/textures/dropper_front_horizontal.png +0 -0
  185. data/textures/dropper_front_vertical.png +0 -0
  186. data/textures/emerald_block.png +0 -0
  187. data/textures/emerald_ore.png +0 -0
  188. data/textures/enchanting_table_bottom.png +0 -0
  189. data/textures/enchanting_table_side.png +0 -0
  190. data/textures/enchanting_table_top.png +0 -0
  191. data/textures/end_stone.png +0 -0
  192. data/textures/endframe_eye.png +0 -0
  193. data/textures/endframe_side.png +0 -0
  194. data/textures/endframe_top.png +0 -0
  195. data/textures/farmland_dry.png +0 -0
  196. data/textures/farmland_wet.png +0 -0
  197. data/textures/fern.png +0 -0
  198. data/textures/fire_layer_0.png +0 -0
  199. data/textures/fire_layer_0.png.mcmeta +0 -38
  200. data/textures/fire_layer_1.png +0 -0
  201. data/textures/fire_layer_1.png.mcmeta +0 -3
  202. data/textures/flower_allium.png +0 -0
  203. data/textures/flower_blue_orchid.png +0 -0
  204. data/textures/flower_dandelion.png +0 -0
  205. data/textures/flower_houstonia.png +0 -0
  206. data/textures/flower_oxeye_daisy.png +0 -0
  207. data/textures/flower_paeonia.png +0 -0
  208. data/textures/flower_pot.png +0 -0
  209. data/textures/flower_rose.png +0 -0
  210. data/textures/flower_tulip_orange.png +0 -0
  211. data/textures/flower_tulip_pink.png +0 -0
  212. data/textures/flower_tulip_red.png +0 -0
  213. data/textures/flower_tulip_white.png +0 -0
  214. data/textures/furnace_front_off.png +0 -0
  215. data/textures/furnace_front_on.png +0 -0
  216. data/textures/furnace_side.png +0 -0
  217. data/textures/furnace_top.png +0 -0
  218. data/textures/glass.png +0 -0
  219. data/textures/glass_black.png +0 -0
  220. data/textures/glass_blue.png +0 -0
  221. data/textures/glass_brown.png +0 -0
  222. data/textures/glass_cyan.png +0 -0
  223. data/textures/glass_gray.png +0 -0
  224. data/textures/glass_green.png +0 -0
  225. data/textures/glass_light_blue.png +0 -0
  226. data/textures/glass_lime.png +0 -0
  227. data/textures/glass_magenta.png +0 -0
  228. data/textures/glass_orange.png +0 -0
  229. data/textures/glass_pane_top.png +0 -0
  230. data/textures/glass_pane_top_black.png +0 -0
  231. data/textures/glass_pane_top_blue.png +0 -0
  232. data/textures/glass_pane_top_brown.png +0 -0
  233. data/textures/glass_pane_top_cyan.png +0 -0
  234. data/textures/glass_pane_top_gray.png +0 -0
  235. data/textures/glass_pane_top_green.png +0 -0
  236. data/textures/glass_pane_top_light_blue.png +0 -0
  237. data/textures/glass_pane_top_lime.png +0 -0
  238. data/textures/glass_pane_top_magenta.png +0 -0
  239. data/textures/glass_pane_top_orange.png +0 -0
  240. data/textures/glass_pane_top_pink.png +0 -0
  241. data/textures/glass_pane_top_purple.png +0 -0
  242. data/textures/glass_pane_top_red.png +0 -0
  243. data/textures/glass_pane_top_silver.png +0 -0
  244. data/textures/glass_pane_top_white.png +0 -0
  245. data/textures/glass_pane_top_yellow.png +0 -0
  246. data/textures/glass_pink.png +0 -0
  247. data/textures/glass_purple.png +0 -0
  248. data/textures/glass_red.png +0 -0
  249. data/textures/glass_silver.png +0 -0
  250. data/textures/glass_white.png +0 -0
  251. data/textures/glass_yellow.png +0 -0
  252. data/textures/glowstone.png +0 -0
  253. data/textures/gold_block.png +0 -0
  254. data/textures/gold_ore.png +0 -0
  255. data/textures/grass_side.png +0 -0
  256. data/textures/grass_side_overlay.png +0 -0
  257. data/textures/grass_side_snowed.png +0 -0
  258. data/textures/grass_top.png +0 -0
  259. data/textures/gravel.png +0 -0
  260. data/textures/hardened_clay.png +0 -0
  261. data/textures/hardened_clay_stained_black.png +0 -0
  262. data/textures/hardened_clay_stained_blue.png +0 -0
  263. data/textures/hardened_clay_stained_brown.png +0 -0
  264. data/textures/hardened_clay_stained_cyan.png +0 -0
  265. data/textures/hardened_clay_stained_gray.png +0 -0
  266. data/textures/hardened_clay_stained_green.png +0 -0
  267. data/textures/hardened_clay_stained_light_blue.png +0 -0
  268. data/textures/hardened_clay_stained_lime.png +0 -0
  269. data/textures/hardened_clay_stained_magenta.png +0 -0
  270. data/textures/hardened_clay_stained_orange.png +0 -0
  271. data/textures/hardened_clay_stained_pink.png +0 -0
  272. data/textures/hardened_clay_stained_purple.png +0 -0
  273. data/textures/hardened_clay_stained_red.png +0 -0
  274. data/textures/hardened_clay_stained_silver.png +0 -0
  275. data/textures/hardened_clay_stained_white.png +0 -0
  276. data/textures/hardened_clay_stained_yellow.png +0 -0
  277. data/textures/hay_block_side.png +0 -0
  278. data/textures/hay_block_top.png +0 -0
  279. data/textures/hopper_inside.png +0 -0
  280. data/textures/hopper_outside.png +0 -0
  281. data/textures/hopper_top.png +0 -0
  282. data/textures/ice.png +0 -0
  283. data/textures/ice_packed.png +0 -0
  284. data/textures/iron_bars.png +0 -0
  285. data/textures/iron_block.png +0 -0
  286. data/textures/iron_ore.png +0 -0
  287. data/textures/iron_trapdoor.png +0 -0
  288. data/textures/itemframe_background.png +0 -0
  289. data/textures/jukebox_side.png +0 -0
  290. data/textures/jukebox_top.png +0 -0
  291. data/textures/ladder.png +0 -0
  292. data/textures/lapis_block.png +0 -0
  293. data/textures/lapis_ore.png +0 -0
  294. data/textures/lava_flow.png +0 -0
  295. data/textures/lava_flow.png.mcmeta +0 -5
  296. data/textures/lava_still.png +0 -0
  297. data/textures/lava_still.png.mcmeta +0 -45
  298. data/textures/leaves_acacia.png +0 -0
  299. data/textures/leaves_big_oak.png +0 -0
  300. data/textures/leaves_birch.png +0 -0
  301. data/textures/leaves_jungle.png +0 -0
  302. data/textures/leaves_oak.png +0 -0
  303. data/textures/leaves_spruce.png +0 -0
  304. data/textures/lever.png +0 -0
  305. data/textures/log_acacia.png +0 -0
  306. data/textures/log_acacia_top.png +0 -0
  307. data/textures/log_big_oak.png +0 -0
  308. data/textures/log_big_oak_top.png +0 -0
  309. data/textures/log_birch.png +0 -0
  310. data/textures/log_birch_top.png +0 -0
  311. data/textures/log_jungle.png +0 -0
  312. data/textures/log_jungle_top.png +0 -0
  313. data/textures/log_oak.png +0 -0
  314. data/textures/log_oak_top.png +0 -0
  315. data/textures/log_spruce.png +0 -0
  316. data/textures/log_spruce_top.png +0 -0
  317. data/textures/melon_side.png +0 -0
  318. data/textures/melon_stem_connected.png +0 -0
  319. data/textures/melon_stem_disconnected.png +0 -0
  320. data/textures/melon_top.png +0 -0
  321. data/textures/mob_spawner.png +0 -0
  322. data/textures/mushroom_block_inside.png +0 -0
  323. data/textures/mushroom_block_skin_brown.png +0 -0
  324. data/textures/mushroom_block_skin_red.png +0 -0
  325. data/textures/mushroom_block_skin_stem.png +0 -0
  326. data/textures/mushroom_brown.png +0 -0
  327. data/textures/mushroom_red.png +0 -0
  328. data/textures/mycelium_side.png +0 -0
  329. data/textures/mycelium_top.png +0 -0
  330. data/textures/nether_brick.png +0 -0
  331. data/textures/nether_wart_stage_0.png +0 -0
  332. data/textures/nether_wart_stage_1.png +0 -0
  333. data/textures/nether_wart_stage_2.png +0 -0
  334. data/textures/netherrack.png +0 -0
  335. data/textures/noteblock.png +0 -0
  336. data/textures/obsidian.png +0 -0
  337. data/textures/piston_bottom.png +0 -0
  338. data/textures/piston_inner.png +0 -0
  339. data/textures/piston_side.png +0 -0
  340. data/textures/piston_top_normal.png +0 -0
  341. data/textures/piston_top_sticky.png +0 -0
  342. data/textures/planks_acacia.png +0 -0
  343. data/textures/planks_big_oak.png +0 -0
  344. data/textures/planks_birch.png +0 -0
  345. data/textures/planks_jungle.png +0 -0
  346. data/textures/planks_oak.png +0 -0
  347. data/textures/planks_spruce.png +0 -0
  348. data/textures/portal.png +0 -0
  349. data/textures/portal.png.mcmeta +0 -3
  350. data/textures/potatoes_stage_0.png +0 -0
  351. data/textures/potatoes_stage_1.png +0 -0
  352. data/textures/potatoes_stage_2.png +0 -0
  353. data/textures/potatoes_stage_3.png +0 -0
  354. data/textures/prismarine_bricks.png +0 -0
  355. data/textures/prismarine_dark.png +0 -0
  356. data/textures/prismarine_rough.png +0 -0
  357. data/textures/prismarine_rough.png.mcmeta +0 -30
  358. data/textures/pumpkin_face_off.png +0 -0
  359. data/textures/pumpkin_face_on.png +0 -0
  360. data/textures/pumpkin_side.png +0 -0
  361. data/textures/pumpkin_stem_connected.png +0 -0
  362. data/textures/pumpkin_stem_disconnected.png +0 -0
  363. data/textures/pumpkin_top.png +0 -0
  364. data/textures/quartz_block_bottom.png +0 -0
  365. data/textures/quartz_block_chiseled.png +0 -0
  366. data/textures/quartz_block_chiseled_top.png +0 -0
  367. data/textures/quartz_block_lines.png +0 -0
  368. data/textures/quartz_block_lines_top.png +0 -0
  369. data/textures/quartz_block_side.png +0 -0
  370. data/textures/quartz_block_top.png +0 -0
  371. data/textures/quartz_ore.png +0 -0
  372. data/textures/rail_activator.png +0 -0
  373. data/textures/rail_activator_powered.png +0 -0
  374. data/textures/rail_detector.png +0 -0
  375. data/textures/rail_detector_powered.png +0 -0
  376. data/textures/rail_golden.png +0 -0
  377. data/textures/rail_golden_powered.png +0 -0
  378. data/textures/rail_normal.png +0 -0
  379. data/textures/rail_normal_turned.png +0 -0
  380. data/textures/red_sand.png +0 -0
  381. data/textures/red_sandstone_bottom.png +0 -0
  382. data/textures/red_sandstone_carved.png +0 -0
  383. data/textures/red_sandstone_normal.png +0 -0
  384. data/textures/red_sandstone_smooth.png +0 -0
  385. data/textures/red_sandstone_top.png +0 -0
  386. data/textures/redstone_block.png +0 -0
  387. data/textures/redstone_dust_cross.png +0 -0
  388. data/textures/redstone_dust_cross_overlay.png +0 -0
  389. data/textures/redstone_dust_line.png +0 -0
  390. data/textures/redstone_dust_line_overlay.png +0 -0
  391. data/textures/redstone_lamp_off.png +0 -0
  392. data/textures/redstone_lamp_on.png +0 -0
  393. data/textures/redstone_ore.png +0 -0
  394. data/textures/redstone_torch_off.png +0 -0
  395. data/textures/redstone_torch_on.png +0 -0
  396. data/textures/reeds.png +0 -0
  397. data/textures/repeater_off.png +0 -0
  398. data/textures/repeater_on.png +0 -0
  399. data/textures/sand.png +0 -0
  400. data/textures/sandstone_bottom.png +0 -0
  401. data/textures/sandstone_carved.png +0 -0
  402. data/textures/sandstone_normal.png +0 -0
  403. data/textures/sandstone_smooth.png +0 -0
  404. data/textures/sandstone_top.png +0 -0
  405. data/textures/sapling_acacia.png +0 -0
  406. data/textures/sapling_birch.png +0 -0
  407. data/textures/sapling_jungle.png +0 -0
  408. data/textures/sapling_oak.png +0 -0
  409. data/textures/sapling_roofed_oak.png +0 -0
  410. data/textures/sapling_spruce.png +0 -0
  411. data/textures/sea_lantern.png +0 -0
  412. data/textures/sea_lantern.png.mcmeta +0 -5
  413. data/textures/slime.png +0 -0
  414. data/textures/snow.png +0 -0
  415. data/textures/soul_sand.png +0 -0
  416. data/textures/sponge.png +0 -0
  417. data/textures/sponge_wet.png +0 -0
  418. data/textures/stone.png +0 -0
  419. data/textures/stone_andesite.png +0 -0
  420. data/textures/stone_andesite_smooth.png +0 -0
  421. data/textures/stone_diorite.png +0 -0
  422. data/textures/stone_diorite_smooth.png +0 -0
  423. data/textures/stone_granite.png +0 -0
  424. data/textures/stone_granite_smooth.png +0 -0
  425. data/textures/stone_slab_side.png +0 -0
  426. data/textures/stone_slab_top.png +0 -0
  427. data/textures/stonebrick.png +0 -0
  428. data/textures/stonebrick_carved.png +0 -0
  429. data/textures/stonebrick_cracked.png +0 -0
  430. data/textures/stonebrick_mossy.png +0 -0
  431. data/textures/tallgrass.png +0 -0
  432. data/textures/tnt_bottom.png +0 -0
  433. data/textures/tnt_side.png +0 -0
  434. data/textures/tnt_top.png +0 -0
  435. data/textures/torch_on.png +0 -0
  436. data/textures/trapdoor.png +0 -0
  437. data/textures/trip_wire.png +0 -0
  438. data/textures/trip_wire_source.png +0 -0
  439. data/textures/vine.png +0 -0
  440. data/textures/water_flow.png +0 -0
  441. data/textures/water_flow.png.mcmeta +0 -3
  442. data/textures/water_still.png +0 -0
  443. data/textures/water_still.png.mcmeta +0 -5
  444. data/textures/waterlily.png +0 -0
  445. data/textures/web.png +0 -0
  446. data/textures/wheat_stage_0.png +0 -0
  447. data/textures/wheat_stage_1.png +0 -0
  448. data/textures/wheat_stage_2.png +0 -0
  449. data/textures/wheat_stage_3.png +0 -0
  450. data/textures/wheat_stage_4.png +0 -0
  451. data/textures/wheat_stage_5.png +0 -0
  452. data/textures/wheat_stage_6.png +0 -0
  453. data/textures/wheat_stage_7.png +0 -0
  454. data/textures/wool_colored_black.png +0 -0
  455. data/textures/wool_colored_blue.png +0 -0
  456. data/textures/wool_colored_brown.png +0 -0
  457. data/textures/wool_colored_cyan.png +0 -0
  458. data/textures/wool_colored_gray.png +0 -0
  459. data/textures/wool_colored_green.png +0 -0
  460. data/textures/wool_colored_light_blue.png +0 -0
  461. data/textures/wool_colored_lime.png +0 -0
  462. data/textures/wool_colored_magenta.png +0 -0
  463. data/textures/wool_colored_orange.png +0 -0
  464. data/textures/wool_colored_pink.png +0 -0
  465. data/textures/wool_colored_purple.png +0 -0
  466. data/textures/wool_colored_red.png +0 -0
  467. data/textures/wool_colored_silver.png +0 -0
  468. data/textures/wool_colored_white.png +0 -0
  469. data/textures/wool_colored_yellow.png +0 -0
  470. data/textures.zip +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 29209338abdd7386e898607c46898dd765a38b38
4
- data.tar.gz: 0eb73d7e9430fc8409baafcb98439dd5bfd911b8
3
+ metadata.gz: 144001b6a79d4c4e769f79d4945856ba6378316d
4
+ data.tar.gz: fa4e456ade60eadeaafa495078341cad8c1dba22
5
5
  SHA512:
6
- metadata.gz: 732f0c6f2af76cdfd3623d659610a5d700c1a48d9fcd455306b69eac12256f9e4eda5729fe48ff5a070e298b8a5c8ef7b0bcffad774a22bb441c81bddbe68ccc
7
- data.tar.gz: b926da55c0212274c490f0a932e8292f54eacc1381dcc57158d117a30f2e596f5b1bbd1018fa04ca13e0dad3ed139d7a217bb94ca33211f028ebb7c872fa23ca
6
+ metadata.gz: de51d06a5c62a7dda4b4c086bbefb0ed1eb88aa08575e31d44e13129c6cdf309825f8ff167278c951952e17d071ccdc7ed30d57d37ac8a7851e7f1a74ab9cc19
7
+ data.tar.gz: fdc48d92deb4ab917cdbb8ebc71d1f5535424e87c3ca4d2f9595f62618ee5d9319aa3e1e0aec6470d64b8f6439ee3cff3ada893a2cd61279a3014f14bd2b8568
data/.gitignore CHANGED
@@ -10,7 +10,7 @@
10
10
  /test/tmp/
11
11
  /test/version_tmp/
12
12
  /tmp/
13
-
13
+ /lib/mc_dot_art_maker/textures/
14
14
 
15
15
 
16
16
 
data/Rakefile CHANGED
@@ -1,6 +1,13 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
+ require 'rake/testtask'
3
4
 
4
5
  RSpec::Core::RakeTask.new(:spec)
5
6
 
6
7
  task :default => :spec
8
+
9
+ Rake::TestTask.new do |t|
10
+ t.libs << "test"
11
+ t.test_files = FileList['test/test*.rb']
12
+ t.verbose = true
13
+ end
@@ -21,21 +21,18 @@ module MCDotArtMaker
21
21
  @texture
22
22
  end
23
23
  end
24
- # def to_lab
25
- # @color.to_lab
26
- # end
24
+
27
25
  def to_rmagic_color
28
- # p "calc color :#{@color.r} #{@color.g} #{@color.b}"
29
26
  Magick::Pixel.new(@color.r*257, @color.g*257, @color.b*257)
30
27
  end
31
28
 
32
29
  def hash
33
30
  code = 17
34
- code = 37*code + @name.hash
35
- code = 37*code + @id.hash
36
- code = 37*code + @data.hash
37
- code = 37*code + @texture.hash
38
- code = 37*code + @color.hash
31
+ code = 37 * code + @name.hash
32
+ code = 37 * code + @id.hash
33
+ code = 37 * code + @data.hash
34
+ code = 37 * code + @texture.hash
35
+ code = 37 * code + @color.hash
39
36
  code
40
37
  end
41
38
  def eql?(other)
@@ -471,8 +471,8 @@ module MCDotArtMaker
471
471
  MCDotArtMaker.puts "Block #{name} registered: #{color}"
472
472
  end
473
473
 
474
- def calc_average_color(arg)
475
- pixels = arg.get_pixels(0,0,arg.columns,arg.rows)
474
+ def calc_average_color(image)
475
+ pixels = image.get_pixels(0,0,image.columns,image.rows)
476
476
 
477
477
  sum_r = pixels.reduce(0) do |a,elem|
478
478
  a+elem.red/257
@@ -1,30 +1,63 @@
1
1
  module MCDotArtMaker
2
+ class InternalError < StandardError; end
2
3
  class Dot
3
- attr_reader :color
4
+ attr_reader :color, :x, :y
4
5
  attr_accessor :block
5
- def initialize(image,x,y)
6
- pixel = image.pixel_color(x,y)
7
- r = pixel.red / 257
8
- g = pixel.green / 257
9
- b = pixel.blue / 257
10
- @color = Color::RGB.new(r, g, b)
6
+
7
+ def initialize(color, x, y)
8
+ @color = color
9
+ @x = x
10
+ @y = y
11
11
  end
12
- # def set_color(r,g,b)
13
- # @color = Color::RGB.new(r, g, b)
14
- # # p "set color #{r} #{g} #{b}"
15
- # end
16
- # def to_lab
17
- # @color.to_lab
18
- # end
12
+
19
13
  def to_rmagic_color
20
14
  # p "calc color :#{@color.r} #{@color.g} #{@color.b}"
21
15
  Magick::Pixel.new(@color.r*257, @color.g*257, @color.b*257)
22
16
  end
23
- def comparitor
24
- Color::Comparison.new(@color)
17
+
18
+ # def determine_block(block_list)
19
+ def determine_block
20
+ # comparitor = self.comparitor
21
+ # block_distance_list = {}
22
+ # block_list.each do |block|
23
+ # block_distance_list[block] = comparitor.compare(block.color)
24
+ # end
25
+ # nearest_block = block_distance_list.min{ |x, y| x[1] <=> y[1] }[0] #[0]: key [1]: value
26
+ #
27
+ # self.block = nearest_block
28
+ # nearest_block
29
+
30
+
31
+ # clocest_block = block_list.select{ |block|
32
+ # comparitor.compare(block.color) == 0
33
+ # }.first
34
+ # raise(InternalError, "An error occured while determine clocest block...") if clocest_block.nil?
35
+ #
36
+ # @block = clocest_block
37
+
38
+
39
+ @block = self.class.color_block_table[@color]
25
40
  end
26
- # def image=(other)
27
- # @image = other.resize(16,16)
41
+
42
+ private
43
+ # def comparitor
44
+ # @comparitor || begin
45
+ # @comparitor = Color::Comparison.new(@color)
46
+ # end
28
47
  # end
48
+
49
+ class << self
50
+ def set_color_palette(cp)
51
+ @block_list = cp
52
+
53
+ @color_block_table = @block_list.reduce({}) do |hash, block|
54
+ hash.store(block.color,block)
55
+ hash
56
+ end
57
+ end
58
+ def color_block_table
59
+ @color_block_table
60
+ end
61
+ end
29
62
  end
30
63
  end
@@ -1,6 +1,17 @@
1
1
  #
2
2
  # Add some features to extern gem.
3
3
  #
4
+ module Magick
5
+ class Image
6
+ def get_color_rgb_at(x, y)
7
+ pixel = self.pixel_color(x,y)
8
+ r = pixel.red / 257
9
+ g = pixel.green / 257
10
+ b = pixel.blue / 257
11
+ ::Color::RGB.new(r, g, b)
12
+ end
13
+ end
14
+ end
4
15
 
5
16
  module Color
6
17
  class RGB
@@ -1,105 +1,74 @@
1
1
  module MCDotArtMaker
2
+ class CannotModifyImageError < StandardError; end
3
+
2
4
  class Maker
3
- attr_reader :width, :height, :cells, :image
4
- # include Enumerable
5
-
6
- def initialize(filename,dither_method = RiemersmaDitherMethod)
7
- # モザイクにしたい元画像をセット
8
- if filename.instance_of? String
9
- @image = Magick::ImageList.new(filename).first
10
- elsif filename.instance_of? Magick::Image
11
- @image = filename
12
- end
5
+ attr_reader :width, :height, :dots, :image
6
+
7
+ def initialize(filename_or_image,dither_method = RiemersmaDitherMethod)
8
+ @image =
9
+ case filename_or_image
10
+ when String
11
+ Magick::ImageList.new(filename_or_image).first
12
+ when Magick::Image
13
+ filename_or_image
14
+ end
13
15
  @dither_method = dither_method
14
16
 
15
- @schematic_helper = MCDotArtMaker::SchematicHelper.instance
16
- @schematic_helper.read File.expand_path('../seed.schematic', __FILE__)
17
+ @schematic_helper = MCDotArtMaker::SchematicHelper.new
18
+ @schematic_helper.read(File.expand_path('../seed.schematic', __FILE__))
17
19
  @block_list = MCDotArtMaker::BlockList.instance
18
20
 
19
21
  @calculation_count = 0 # 近似ブロック計算が終わったらインクリメント
20
- end
21
- def resize_to_fit(width, height)
22
- @image = @image.resize_to_fit(width, height)
22
+ @is_locked = false
23
23
 
24
- # reset
25
- @cells = nil
24
+ MCDotArtMaker::Dot.set_color_palette(@block_list)
26
25
  end
27
- def [](row,col)
28
- load_image unless image_loaded?
29
- @cells[row*@width + col]
30
- end
31
- def []=(row,col,newValue)
32
- load_image unless image_loaded?
33
- @cells[row*@width + col] = newValue
34
- end
35
- def each(size = 1)
36
- load_image unless image_loaded?
37
- @cells.each_with_index do |c,i|
38
- x = (i % @width) * size #列番号・横方向: x
39
- y = (i/@width) * size #行番号・縦方向: y
40
- yield c,x,y
41
- # cell,cellの左上のx座標 ,cellの左上のy座標
42
- end
43
- end
44
- def each_with_index(size = 1)
45
- load_image unless image_loaded?
46
- @cells.each_with_index do |c,i|
47
- x = (i % @width) * size #列番号・横方向: x
48
- y = (i/@width) * size #行番号・縦方向: y
49
- yield c,i,x,y
50
- # cell,cellの左上のx座標 ,cellの左上のy座標
51
- end
52
- end
53
- def block_ids
54
- load_image unless image_loaded?
55
- tmp = []
56
- each do |c|
57
- tmp << c.block.id
58
- end
59
- tmp
26
+ # def resize_to_fit(width, height)
27
+ # check_not_locked
28
+ # # @image = @image.resize_to_fit(width, height)
29
+ # @image.resize_to_fit!(width, height)
30
+ # end
31
+
32
+ def manipulate
33
+ check_not_locked
34
+ image = yield @image
35
+ raise(ArgumentError,"Should return Magick::Image object") unless image.class == Magick::Image
36
+ @image = image
60
37
  end
61
- def block_data
62
- load_image unless image_loaded?
63
- tmp = []
64
- each do |c|
65
- tmp << c.block.data
66
- end
67
- tmp
38
+
39
+ def calculate
40
+ # load_image unless image_loaded?
41
+ load_image unless image_locked?
42
+ calc_nearest_block unless calculation_done?
43
+ lock_image
68
44
  end
45
+
69
46
  def mosaic_image(size = 1)
70
47
  # モザイク化した画像を返す
71
- calculate
48
+ # calculate
72
49
 
73
50
  new_image = Magick::Image.new(@width*size, @height*size){ self.background_color = "white" }
74
- each(size) do |c,x,y|
51
+
52
+ @dots.each do |c|
75
53
  idr = Magick::Draw.new
76
54
  idr.fill = c.block.to_rmagic_color
77
- idr.rectangle(x, y, x + size, y + size)
55
+ idr.rectangle(c.x, c.y, c.x + size, c.y + size)
78
56
  idr.draw(new_image)
79
57
  end
80
58
  new_image
81
59
  end
82
- def calculate
83
- load_image unless image_loaded?
84
- calc_nearest_block unless calculation_done?
85
- end
86
- def reset
87
- load_image
88
- end
89
-
90
60
  def texture_image(size = TEXTURE_SIZE)
91
61
  # 近似ブロック色でのモザイク画像を返す
92
- calculate
62
+ # calculate
93
63
 
94
64
  new_image = Magick::Image.new(@width*size, @height*size){ self.background_color = "white" }
95
- each(size) do |c,x,y|
96
- new_image.composite!(c.block.texture(size), x, y, Magick::OverCompositeOp)
65
+ @dots.each do |c|
66
+ new_image.composite!(c.block.texture(size), c.x*size, c.y*size, Magick::OverCompositeOp)
97
67
  end
98
68
  new_image
99
69
  end
100
-
101
70
  def write_schematic(filename)
102
- calculate
71
+ # calculate
103
72
 
104
73
  @schematic_helper.blocks = block_ids
105
74
  @schematic_helper.data = block_data
@@ -117,31 +86,35 @@ module MCDotArtMaker
117
86
 
118
87
  private
119
88
  def calc_nearest_block
89
+ # MCDotArtMaker.puts "Calc nearest block...."
90
+ # @nearest_color_cache ||= {}
91
+ #
92
+ # @dots.each_with_index do |cell,index|
93
+ # puts "Calculating #{index+1} of #{@dots.size}" if ((index+1) % 10000 == 0)|| (index+1 == @dots.size)
94
+ # if @nearest_color_cache.include?(cell.color)
95
+ # cell.block = @nearest_color_cache[cell.color]
96
+ # else
97
+ # @nearest_color_cache[cell.color] = cell.determine_block(@block_list)
98
+ #
99
+ # MCDotArtMaker.puts "Cashed new color #{@nearest_color_cache.size} of #{@block_list.size}"
100
+ # end
101
+ # @calculation_count += 1
102
+ # end
103
+ # MCDotArtMaker.puts "Done!"
104
+
105
+
106
+
120
107
  MCDotArtMaker.puts "Calc nearest block...."
121
- @nearest_color_cash ||= {}
122
-
123
- each_with_index do |cell,index|
124
- puts "Calculating #{index+1} of #{@cells.size}" if ((index+1) % 10000 == 0)|| (index+1 == @cells.size)
125
- if @nearest_color_cash.include?(cell.color)
126
- cell.block = @nearest_color_cash[cell.color]
127
- else
128
- comparitor = cell.comparitor
129
- block_distance_list = {}
130
- @block_list.each do |block|
131
- block_distance_list[block] = comparitor.compare(block.color)
132
- end
133
- nearest_block = block_distance_list.min{ |x, y| x[1] <=> y[1] }[0] #[0]: key [1]: value
134
- @nearest_color_cash[cell.color] = nearest_block
135
- cell.block = nearest_block
136
108
 
137
- MCDotArtMaker.puts "Cashed new color #{@nearest_color_cash.size} of #{@block_list.size}"
138
- end
109
+ @dots.each_with_index do |dot,index|
110
+ puts "Calculating #{index+1} of #{@dots.size}" if ((index+1) % 10000 == 0)|| (index+1 == @dots.size)
111
+ dot.determine_block
139
112
  @calculation_count += 1
140
113
  end
141
114
  MCDotArtMaker.puts "Done!"
142
115
  end
143
116
  def calculation_done?
144
- @cells.size == @calculation_count
117
+ @dots.size == @calculation_count
145
118
  end
146
119
  def load_image
147
120
  # - width - 絵の横方向の大きさ
@@ -149,26 +122,74 @@ module MCDotArtMaker
149
122
  # 端っこは切り捨てる
150
123
  @width = @image.columns
151
124
  @height = @image.rows
152
- @cells = []
125
+ @dots = []
153
126
 
154
127
 
155
128
  MCDotArtMaker.puts "remapping..."
156
129
  @image = @image.remap(@block_list.color_palette,@dither_method)
157
130
  MCDotArtMaker.puts "Done!"
158
131
 
159
- MCDotArtMaker.puts "Registering cells..."
132
+ MCDotArtMaker.puts "Registering dots..."
160
133
  (@width*@height).times do |i|
161
134
  x = i % @width #列番号・横方向: x
162
135
  y = i / @width #行番号・縦方向: y
163
- # @cells << Cell.new(@image,x,y)
164
- @cells << Dot.new(@image,x,y)
136
+ @dots << Dot.new(@image.get_color_rgb_at(x,y),x,y)
165
137
  end
166
138
  MCDotArtMaker.puts "Done!"
167
139
 
168
140
  @calculation_count = 0
169
141
  end
170
- def image_loaded?
171
- !@cells.nil?
142
+ # def image_loaded?
143
+ # !@dots.nil?
144
+ # end
145
+
146
+ def block_ids
147
+ # calculate
148
+
149
+ @dots.reduce([]) do |list, cell|
150
+ list << cell.block.id
151
+ end
152
+ end
153
+ def block_data
154
+ # calculate
155
+
156
+ @dots.reduce([]) do |list, cell|
157
+ list << cell.block.data
158
+ end
159
+ end
160
+ def check_not_locked
161
+ raise(CannotModifyImageError,"You cannot modifiy the image after calculation.") if @is_locked
162
+ end
163
+ def lock_image
164
+ @is_locked = true
165
+ end
166
+ def image_locked?
167
+ @is_locked
168
+ end
169
+
170
+ class << self
171
+ def calculate_before(*_methods)
172
+ methods = Array(_methods)
173
+ methods.each do |method|
174
+ alias_method("#{method}_without_calculation",method)
175
+ define_method(method) do |*args|
176
+ calculate
177
+ self.send("#{method}_without_calculation",*args)
178
+ end
179
+ end
180
+ end
181
+
182
+ def generate_rmagick_delegation_methods(*_methods)
183
+ methods = Array(_methods)
184
+ methods.each do |method|
185
+ define_method(method) do |*args|
186
+ check_not_locked
187
+ @image.send("#{method}!",*args)
188
+ end
189
+ end
190
+ end
172
191
  end
192
+ calculate_before :mosaic_image, :texture_image, :write_schematic, :block_ids, :block_data
193
+ generate_rmagick_delegation_methods :resize_to_fit, :resize_to_fill
173
194
  end
174
195
  end
@@ -4,7 +4,7 @@ module MCDotArtMaker
4
4
  #= .schematicを処理するためのクラス
5
5
  # nbt_utilsをラップして書き込み機能を追加する
6
6
  class SchematicHelper
7
- include Singleton
7
+ # include Singleton
8
8
  attr_reader :blocks,:data
9
9
  attr_reader :weOffsetX,:weOffsetY,:weOffsetZ
10
10
  attr_reader :weOriginX,:weOriginY,:weOriginZ
@@ -7,7 +7,7 @@ module MCDotArtMaker
7
7
  class TextureLoader
8
8
  TEXTURE_DIR = File.join(File.dirname(__FILE__),"textures")
9
9
  TEXTURE_TMP_DIR = File.join(TEXTURE_DIR,"tmp")
10
-
10
+
11
11
  def initialize(jar = nil)
12
12
  @jar = jar || jars.last
13
13
  end
@@ -32,13 +32,6 @@ module MCDotArtMaker
32
32
 
33
33
  Zip::File.open(jar_file_path) do |zip|
34
34
  zip.each do |entry|
35
- # puts "entry #{entry.to_s}"
36
-
37
- # if md = /\Aassets\/minecraft\/textures\/blocks\/(.*).png\Z/.match(entry.to_s)
38
- # # p md[1]
39
- # entry.extract(File.join("textures", md[1]) + ".png")
40
- # end
41
-
42
35
  if md = /\Aassets\/minecraft\/textures\/blocks\/#{filename}\Z/.match(entry.to_s)
43
36
  entry.extract(File.join(TEXTURE_DIR, filename))
44
37
  return Magick::ImageList.new(File.join(TEXTURE_DIR,filename)).first
@@ -61,7 +54,7 @@ module MCDotArtMaker
61
54
  end
62
55
 
63
56
 
64
- # private
57
+ private
65
58
  def os
66
59
  @os ||= (
67
60
  host_os = RbConfig::CONFIG['host_os']
@@ -1,32 +1,32 @@
1
1
  module MCDotArtMaker
2
- def self.calc_average_color(arg)
3
- pixels = nil
4
- if arg.instance_of? Magick::Image or arg.instance_of? Magick::ImageList
5
- pixels = arg.get_pixels(0,0,arg.columns,arg.rows)
6
- elsif arg.instance_of? Array
7
- pixels = arg
8
- end
9
-
10
- if pixels.size == 1
11
- return pixels[0].red/257, pixels[0].green/257, pixels[0].blue/257
12
- end
13
- sum_r = pixels.reduce(0) do |a,elem|
14
- a+elem.red/257
15
- end
16
- ave_r = sum_r/pixels.size
17
-
18
- sum_g = pixels.reduce(0) do |a,elem|
19
- a+elem.green/257
20
- end
21
- ave_g = sum_g/pixels.size
22
-
23
- sum_b = pixels.reduce(0) do |a,elem|
24
- a+elem.blue/257
25
- end
26
- ave_b = sum_b/pixels.size
27
-
28
- [ave_r, ave_g, ave_b]
29
- end
2
+ # def self.calc_average_color(arg)
3
+ # pixels = nil
4
+ # if arg.instance_of? Magick::Image or arg.instance_of? Magick::ImageList
5
+ # pixels = arg.get_pixels(0,0,arg.columns,arg.rows)
6
+ # elsif arg.instance_of? Array
7
+ # pixels = arg
8
+ # end
9
+ #
10
+ # if pixels.size == 1
11
+ # return pixels[0].red/257, pixels[0].green/257, pixels[0].blue/257
12
+ # end
13
+ # sum_r = pixels.reduce(0) do |a,elem|
14
+ # a+elem.red/257
15
+ # end
16
+ # ave_r = sum_r/pixels.size
17
+ #
18
+ # sum_g = pixels.reduce(0) do |a,elem|
19
+ # a+elem.green/257
20
+ # end
21
+ # ave_g = sum_g/pixels.size
22
+ #
23
+ # sum_b = pixels.reduce(0) do |a,elem|
24
+ # a+elem.blue/257
25
+ # end
26
+ # ave_b = sum_b/pixels.size
27
+ #
28
+ # [ave_r, ave_g, ave_b]
29
+ # end
30
30
 
31
31
  def self.puts(*args)
32
32
  Kernel.puts *args if DEBUG
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'mc_dot_art_maker'
3
- s.version = '0.3.3'
3
+ s.version = '0.4.0'
4
4
  s.licenses = ['MIT']
5
5
  s.summary = 'Dot Art Maker for Minecraft'
6
6
  s.description = 'Converting images to mosaic arts using Minecraft textures and .schematic files.'
Binary file
@@ -24,4 +24,12 @@ class BlockListTest < Test::Unit::TestCase
24
24
  assert_equal(16, block.texture.columns)
25
25
  end
26
26
  end
27
+
28
+ def test_color_palette
29
+ @block_list.color_palette.write("test/images/tmp/palette.png")
30
+
31
+ assert_equal(Magick::Image, @block_list.color_palette.class)
32
+ assert_equal(Digest::MD5.file("test/images/sample/palette.png"),
33
+ Digest::MD5.file("test/images/tmp/palette.png"))
34
+ end
27
35
  end
@@ -4,7 +4,7 @@ require "digest/md5"
4
4
 
5
5
 
6
6
  class BlockPaletteTest < Test::Unit::TestCase
7
- TMP_DIR = "images/tmp"
7
+ TMP_DIR = "test/images/tmp"
8
8
  METHODS = [MCDotArtMaker::NoDitherMethod,MCDotArtMaker::RiemersmaDitherMethod,MCDotArtMaker::FloydSteinbergDitherMethod]
9
9
 
10
10
  class << self
@@ -15,15 +15,15 @@ class BlockPaletteTest < Test::Unit::TestCase
15
15
  end
16
16
  def setup
17
17
  METHODS.each do |m|
18
- maker = MCDotArtMaker::Maker.new("images/src/test_image.jpg",m)
19
- maker.texture_image.write "images/tmp/dither_methods_#{m}.png"
18
+ maker = MCDotArtMaker::Maker.new("test/images/src/test_image.jpg",m)
19
+ maker.texture_image.write "test/images/tmp/dither_methods_#{m}.png"
20
20
  end
21
21
  end
22
22
 
23
23
  def test_dither_methods
24
24
  METHODS.each do |m|
25
- assert_equal(Digest::MD5.file("images/sample/dither_methods_#{m}.png"),
26
- Digest::MD5.file("images/tmp/dither_methods_#{m}.png"))
25
+ assert_equal(Digest::MD5.file("test/images/sample/dither_methods_#{m}.png"),
26
+ Digest::MD5.file("test/images/tmp/dither_methods_#{m}.png"))
27
27
  end
28
28
  end
29
29
  end
data/test/test_dot.rb ADDED
@@ -0,0 +1,44 @@
1
+ require_relative '../lib/mc_dot_art_maker'
2
+ require 'test/unit'
3
+
4
+ class DotTest < Test::Unit::TestCase
5
+ def setup
6
+ @block_list = MCDotArtMaker::BlockList.instance
7
+ MCDotArtMaker::Dot.set_color_palette(@block_list)
8
+ end
9
+
10
+ def test_determine_block
11
+ dots = []
12
+ dots << MCDotArtMaker::Dot.new(Color::RGB.new(221, 221, 221),0,0)
13
+ dots << MCDotArtMaker::Dot.new(Color::RGB.new(231, 228, 219),0,0)
14
+ dots << MCDotArtMaker::Dot.new(Color::RGB.new(231, 228, 219),0,0)
15
+ dots << MCDotArtMaker::Dot.new(Color::RGB.new(114, 119, 106),0,0)
16
+ dots << MCDotArtMaker::Dot.new(Color::RGB.new(249, 236, 78),0,0)
17
+
18
+ expected_blocks =[]
19
+ expected_blocks << :white_wool
20
+ expected_blocks << :chiseled_quartz_block
21
+ expected_blocks << :chiseled_quartz_block
22
+ expected_blocks << :mossy_stone_bricks
23
+ expected_blocks << :gold_block
24
+ # blocks = dots.map do |dot|
25
+ # dot.determine_block
26
+ # end
27
+ blocks = dots.map(&:determine_block)
28
+
29
+ blocks.each do |block|
30
+ assert_equal(MCDotArtMaker::Block, block.class)
31
+ end
32
+
33
+ blocks.zip(expected_blocks) do |block, expectation|
34
+ assert_equal(expectation, block.name)
35
+ end
36
+ end
37
+
38
+ def test_determin_block_for_all_colors
39
+ @block_list.each do |block|
40
+ dot = MCDotArtMaker::Dot.new(block.color,0,0)
41
+ assert_equal(MCDotArtMaker::Block, dot.determine_block.class)
42
+ end
43
+ end
44
+ end