ruby_spriter 0.6.7 → 0.7.0.1

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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +3 -3
  3. data/CHANGELOG.md +1035 -405
  4. data/Gemfile +17 -17
  5. data/LICENSE +21 -21
  6. data/README.md +183 -902
  7. data/bin/ruby_spriter +20 -20
  8. data/lib/ruby_spriter/background_sampler.rb +140 -0
  9. data/lib/ruby_spriter/batch_processor.rb +268 -212
  10. data/lib/ruby_spriter/cell_cleanup_config.rb +21 -0
  11. data/lib/ruby_spriter/cell_cleanup_gimp_script.rb +123 -0
  12. data/lib/ruby_spriter/cell_cleanup_processor.rb +230 -0
  13. data/lib/ruby_spriter/cli.rb +676 -612
  14. data/lib/ruby_spriter/compression_manager.rb +101 -101
  15. data/lib/ruby_spriter/consolidator.rb +179 -179
  16. data/lib/ruby_spriter/dependency_checker.rb +224 -174
  17. data/lib/ruby_spriter/ghost_edge_cleaner.rb +164 -0
  18. data/lib/ruby_spriter/gimp_processor.rb +1188 -667
  19. data/lib/ruby_spriter/metadata_manager.rb +117 -116
  20. data/lib/ruby_spriter/platform.rb +137 -82
  21. data/lib/ruby_spriter/processor.rb +1230 -886
  22. data/lib/ruby_spriter/smoke_detector.rb +223 -0
  23. data/lib/ruby_spriter/threshold_stepper.rb +227 -0
  24. data/lib/ruby_spriter/utils/file_helper.rb +82 -82
  25. data/lib/ruby_spriter/utils/image_helper.rb +16 -0
  26. data/lib/ruby_spriter/utils/output_formatter.rb +65 -65
  27. data/lib/ruby_spriter/utils/path_helper.rb +59 -59
  28. data/lib/ruby_spriter/utils/spritesheet_splitter.rb +86 -86
  29. data/lib/ruby_spriter/version.rb +6 -7
  30. data/lib/ruby_spriter/video_processor.rb +357 -139
  31. data/lib/ruby_spriter.rb +38 -34
  32. data/ruby_spriter.gemspec +44 -42
  33. data/spec/fixtures/centered_sprite_with_inner_bg.png +0 -0
  34. data/spec/fixtures/centered_sprite_with_inner_bg_inner_removed.png +0 -0
  35. data/spec/fixtures/centered_sprite_with_inner_bg_threshold_stepped.png +0 -0
  36. data/spec/fixtures/complex_background_sprite.png +0 -0
  37. data/spec/fixtures/death - bloodborne rekconing.mp4 +0 -0
  38. data/spec/fixtures/death - bloodborne rekconing_spritesheet-nobg-global.png +0 -0
  39. data/spec/fixtures/death - bloodborne rekconing_spritesheet.png +0 -0
  40. data/spec/fixtures/death - bloodborne rekconing_spritesheet_20251110_185027_431-nobg-global.png +0 -0
  41. data/spec/fixtures/death - bloodborne rekconing_spritesheet_20251110_185027_431.png +0 -0
  42. data/spec/fixtures/death - bloodborne rekconing_spritesheet_20251110_185125_738-nobg-global.png +0 -0
  43. data/spec/fixtures/death - bloodborne rekconing_spritesheet_20251110_185125_738.png +0 -0
  44. data/spec/fixtures/has_inner_bg.png +0 -0
  45. data/spec/fixtures/has_small_inner_bg.png +0 -0
  46. data/spec/fixtures/smoke_effect_sprite.png +0 -0
  47. data/spec/fixtures/spritesheet_with_metadata.png +0 -0
  48. data/spec/fixtures/test_sprite.png +0 -0
  49. data/spec/fixtures/test_sprite_smoke_processed.png +0 -0
  50. data/spec/fixtures/test_video_spritesheet.png +0 -0
  51. data/spec/fixtures/transparent_bg_sprite.png +0 -0
  52. data/spec/fixtures/walk_north_sprite-sheet.png +0 -0
  53. data/spec/integration/no_fuzzy_mode_spec.rb +100 -0
  54. data/spec/ruby_spriter/batch_processor_spec.rb +509 -200
  55. data/spec/ruby_spriter/cli_spec.rb +2026 -1892
  56. data/spec/ruby_spriter/compression_manager_spec.rb +157 -157
  57. data/spec/ruby_spriter/consolidator_spec.rb +538 -538
  58. data/spec/ruby_spriter/gimp_processor_spec.rb +523 -425
  59. data/spec/ruby_spriter/platform_spec.rb +92 -82
  60. data/spec/ruby_spriter/processor_spec.rb +911 -735
  61. data/spec/ruby_spriter/utils/file_helper_spec.rb +150 -150
  62. data/spec/ruby_spriter/utils/path_helper_spec.rb +78 -78
  63. data/spec/ruby_spriter/utils/spritesheet_splitter_spec.rb +104 -104
  64. data/spec/ruby_spriter/video_processor_spec.rb +346 -29
  65. data/spec/spec_helper.rb +41 -41
  66. data/spec/tmp/cli_test_output.png +0 -0
  67. data/spec/tmp/cli_test_output_20251105_114647_395.png +0 -0
  68. data/spec/tmp/combined_test.png +0 -0
  69. data/spec/tmp/compat_test.png +0 -0
  70. data/spec/tmp/compat_test_20251030_174233_361.png +0 -0
  71. data/spec/tmp/final_all_features.png +0 -0
  72. data/spec/tmp/final_test_all_features.png +0 -0
  73. data/spec/tmp/full_pipeline_test.png +0 -0
  74. data/spec/tmp/inner_test.png +0 -0
  75. data/spec/tmp/integration_test.png +0 -0
  76. data/spec/tmp/validation_test.png +0 -0
  77. data/spec/unit/background_sampler_spec.rb +132 -0
  78. data/spec/unit/cell_cleanup_config_spec.rb +32 -0
  79. data/spec/unit/cell_cleanup_gimp_script_spec.rb +59 -0
  80. data/spec/unit/cell_cleanup_processor_spec.rb +261 -0
  81. data/spec/unit/ghost_edge_cleaner_spec.rb +223 -0
  82. data/spec/unit/gimp_processor_single_point_selection_spec.rb +81 -0
  83. data/spec/unit/smoke_detector_spec.rb +246 -0
  84. data/spec/unit/threshold_stepper_spec.rb +195 -0
  85. metadata +56 -10
Binary file
Binary file
@@ -0,0 +1,100 @@
1
+ require 'spec_helper'
2
+ require 'ruby_spriter/gimp_processor'
3
+ require 'ruby_spriter/background_sampler'
4
+
5
+ RSpec.describe 'No-Fuzzy Mode Integration' do
6
+ let(:gimp_path) { 'gimp-console' }
7
+ let(:input_file) { 'spec/fixtures/walk_north_sprite-sheet.png' }
8
+ let(:output_file) { 'spec/tmp/no_fuzzy_output.png' }
9
+
10
+ before do
11
+ FileUtils.mkdir_p(File.dirname(output_file))
12
+ end
13
+
14
+ after do
15
+ FileUtils.rm_f(output_file) if File.exist?(output_file)
16
+ end
17
+
18
+ describe 'GimpProcessor with --no-fuzzy mode' do
19
+ it 'generates script with global select at (5,5) plus additional background colors' do
20
+ options = {
21
+ remove_bg: true,
22
+ fuzzy_select: false,
23
+ bg_sample_offset: 5,
24
+ bg_sample_count: 10
25
+ }
26
+
27
+ processor = RubySpriter::GimpProcessor.new(gimp_path, options)
28
+
29
+ # Collect background colors
30
+ sampler = RubySpriter::BackgroundSampler.new(input_file, 5, 10, 20)
31
+ background_colors = sampler.collect_unique_colors
32
+
33
+ expect(background_colors).not_to be_empty
34
+
35
+ # Generate script with background colors
36
+ script = processor.send(:generate_remove_bg_script, input_file, output_file, background_colors)
37
+
38
+ # Should include single-point global select at (5,5)
39
+ expect(script).to include('x = 5')
40
+ expect(script).to include('y = 5')
41
+ expect(script).to include('gimp-image-select-color')
42
+
43
+ # Should include global color select for inner backgrounds
44
+ expect(script).to include('Selecting inner background colors')
45
+ expect(script).to include('gimp-image-select-color')
46
+ expect(script).to include('Gimp.ChannelOps.ADD')
47
+
48
+ # Should include the background colors in Python dict format
49
+ colors_pattern = background_colors.map { |c| "{'r': #{c[:r]}, 'g': #{c[:g]}, 'b': #{c[:b]}}" }.join(', ')
50
+ expect(script).to include("[#{colors_pattern}]")
51
+ end
52
+
53
+ it 'does not include global select when fuzzy_select is true' do
54
+ options = {
55
+ remove_bg: true,
56
+ fuzzy_select: true
57
+ }
58
+
59
+ processor = RubySpriter::GimpProcessor.new(gimp_path, options)
60
+ script = processor.send(:generate_remove_bg_script, input_file, output_file, nil)
61
+
62
+ # Should include fuzzy select
63
+ expect(script).to include('gimp-image-select-contiguous-color')
64
+
65
+ # Should NOT include global color select for inner backgrounds
66
+ expect(script).not_to include('Selecting inner background colors')
67
+ end
68
+
69
+ it 'handles empty background_colors array gracefully' do
70
+ options = {
71
+ remove_bg: true,
72
+ fuzzy_select: false
73
+ }
74
+
75
+ processor = RubySpriter::GimpProcessor.new(gimp_path, options)
76
+ script = processor.send(:generate_remove_bg_script, input_file, output_file, [])
77
+
78
+ # Should still work with just global select at (5,5)
79
+ expect(script).to include('gimp-image-select-color')
80
+ expect(script).not_to include('Selecting inner background colors')
81
+ end
82
+ end
83
+
84
+ describe 'BackgroundSampler integration' do
85
+ it 'collects colors from the test image' do
86
+ sampler = RubySpriter::BackgroundSampler.new(input_file, 5, 10, 20)
87
+ colors = sampler.collect_unique_colors
88
+
89
+ expect(colors).to be_an(Array)
90
+ expect(colors.length).to be > 0
91
+ expect(colors.length).to be <= 10
92
+
93
+ colors.each do |color|
94
+ expect(color).to have_key(:r)
95
+ expect(color).to have_key(:g)
96
+ expect(color).to have_key(:b)
97
+ end
98
+ end
99
+ end
100
+ end