shattered_machine 0.0.3 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +37 -0
- data/README.md +7 -0
- data/icon.png +0 -0
- data/icon.svg +122 -0
- data/lib/shattered_machine.rb +2 -1
- data/lib/shattered_machine/glitcher.rb +8 -0
- data/lib/shattered_machine/io.rb +4 -4
- data/lib/shattered_machine/sampler.rb +6 -5
- data/lib/shattered_machine/transpose.rb +2 -2
- data/shattered_machine.gemspec +12 -3
- metadata +22 -25
- data/spec/brush_spec.rb +0 -25
- data/spec/change_byte_spec.rb +0 -25
- data/spec/converter_spec.rb +0 -23
- data/spec/defect_spec.rb +0 -25
- data/spec/exchange_spec.rb +0 -25
- data/spec/glitcher_spec.rb +0 -25
- data/spec/images/bar.PNG +0 -0
- data/spec/images/bar.jpeg +0 -0
- data/spec/images/foo.jpg +0 -0
- data/spec/images/foo.png +0 -0
- data/spec/images/fuzz.JPG +0 -0
- data/spec/images/pouet.JPEG +0 -0
- data/spec/io_spec.rb +0 -73
- data/spec/pixel_sorter_spec.rb +0 -25
- data/spec/sampler_spec.rb +0 -37
- data/spec/slim_spec.rb +0 -25
- data/spec/spec_helper.rb +0 -27
- data/spec/transpose_spec.rb +0 -25
- data/spec/wrong_filter_spec.rb +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ad75dfc5905cdbc60e533414420bd7846cf67017db482afe5878b7118f9445f
|
4
|
+
data.tar.gz: f0b8f2fcb73d96d7f402064e9d4fd0c766158b44ec382665c89020951a28f5ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c3bc4229e1f96bca2d135e157f62dd37b74ca28e2f5f8451fee4a57058f01807a78559ded829ed6815150c2a5a86f4778586e1918161c680838f056740a67fd6
|
7
|
+
data.tar.gz: 3e3d91ac8f54480c1179888aff957990d1ce61b65ed262b261589aa00d8ac1445d3c61a40d3133d0bb2d8eec5ae2575da7f778a20ea2893ba06f869ed0342789
|
data/CHANGELOG
CHANGED
@@ -4,6 +4,43 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
5
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
+
## [0.0.8] - 2021-07-01
|
8
|
+
### Added
|
9
|
+
- Icon
|
10
|
+
|
11
|
+
### Changed
|
12
|
+
- Url of the project
|
13
|
+
- In sampler use Io output_filename instead of base_output_filename
|
14
|
+
|
15
|
+
## [0.0.7] - 2021-06-06
|
16
|
+
### Changed
|
17
|
+
- Privatise PNG_EXTENSIONS, JPG_EXTENSIONS and Paths in Io
|
18
|
+
|
19
|
+
### Fixed
|
20
|
+
- Transpose algorithm
|
21
|
+
- Include missing required files in glitcher
|
22
|
+
|
23
|
+
### Removed
|
24
|
+
- Spec files from the gem
|
25
|
+
|
26
|
+
## [0.0.6] - 2021-05-28
|
27
|
+
### Added
|
28
|
+
- Add Sampler in the main lib
|
29
|
+
|
30
|
+
## [0.0.5] - 2021-05-28
|
31
|
+
### Added
|
32
|
+
- Rusty Engine dependency in gemspec file
|
33
|
+
|
34
|
+
## [0.0.4] - 2021-05-28
|
35
|
+
### Added
|
36
|
+
- Acknowledgements section in README
|
37
|
+
|
38
|
+
### Changed
|
39
|
+
- The following Sampler constant are not publically available anymore : FILTERS, SLIM_DIRECTION and BRUSH_DIRECTION
|
40
|
+
|
41
|
+
### Fixed
|
42
|
+
- By default the Sampler now also run the Brush algorithm
|
43
|
+
|
7
44
|
## [0.0.3] - 2021-05-26
|
8
45
|
### Changed
|
9
46
|
- Replaces Rusty Engine library with the gem encapsulating those files
|
data/README.md
CHANGED
@@ -52,4 +52,11 @@ To install the needed dependencies you need to install the [Ruby language](https
|
|
52
52
|
Then run `bundle install` to fetch the needed gems.
|
53
53
|
|
54
54
|
### Specs
|
55
|
+
|
55
56
|
This project uses [Rspec](https://rspec.info/) for writting specs, to run them simply run `bundle rspec`
|
57
|
+
|
58
|
+
## Acknowledgements
|
59
|
+
|
60
|
+
This gem is relying heavily on the [pnglitch gem](https://github.com/ucnv/pnglitch) and the [rusty engine gem](https://framagit.org/Radoteur/rusty_engine).
|
61
|
+
The png image used in the specs has been created with [Ronin](https://100r.co/site/ronin.html) while the jpg one is painting from Karl Wiener.
|
62
|
+
Icons made by [Freepik](http://www.freepik.com/) from [www.flaticon.com](https://www.flaticon.com/)
|
data/icon.png
ADDED
Binary file
|
data/icon.svg
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
+
<svg
|
3
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
4
|
+
xmlns:cc="http://creativecommons.org/ns#"
|
5
|
+
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
6
|
+
xmlns:svg="http://www.w3.org/2000/svg"
|
7
|
+
xmlns="http://www.w3.org/2000/svg"
|
8
|
+
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
9
|
+
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
10
|
+
id="Layer_1"
|
11
|
+
enable-background="new 0 0 512 512"
|
12
|
+
height="512"
|
13
|
+
viewBox="0 0 512 512"
|
14
|
+
width="512"
|
15
|
+
version="1.1"
|
16
|
+
sodipodi:docname="ice.svg"
|
17
|
+
inkscape:version="1.0.2 (e86c8708, 2021-01-15)">
|
18
|
+
<metadata
|
19
|
+
id="metadata49">
|
20
|
+
<rdf:RDF>
|
21
|
+
<cc:Work
|
22
|
+
rdf:about="">
|
23
|
+
<dc:format>image/svg+xml</dc:format>
|
24
|
+
<dc:type
|
25
|
+
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
26
|
+
</cc:Work>
|
27
|
+
</rdf:RDF>
|
28
|
+
</metadata>
|
29
|
+
<defs
|
30
|
+
id="defs47" />
|
31
|
+
<sodipodi:namedview
|
32
|
+
pagecolor="#ffffff"
|
33
|
+
bordercolor="#666666"
|
34
|
+
borderopacity="1"
|
35
|
+
objecttolerance="10"
|
36
|
+
gridtolerance="10"
|
37
|
+
guidetolerance="10"
|
38
|
+
inkscape:pageopacity="0"
|
39
|
+
inkscape:pageshadow="2"
|
40
|
+
inkscape:window-width="1440"
|
41
|
+
inkscape:window-height="847"
|
42
|
+
id="namedview45"
|
43
|
+
showgrid="false"
|
44
|
+
inkscape:zoom="1.2480469"
|
45
|
+
inkscape:cx="256"
|
46
|
+
inkscape:cy="256"
|
47
|
+
inkscape:window-x="0"
|
48
|
+
inkscape:window-y="25"
|
49
|
+
inkscape:window-maximized="1"
|
50
|
+
inkscape:current-layer="g42" />
|
51
|
+
<g
|
52
|
+
id="g42">
|
53
|
+
<path
|
54
|
+
d="m235.462 7.504h-146.462l-81.5 72.994v135.887l149.808 69.115 86.841-203.064z"
|
55
|
+
fill="#bdf9ff"
|
56
|
+
id="path10"
|
57
|
+
style="fill:#aa0000" />
|
58
|
+
<path
|
59
|
+
d="m235.462 7.504h-30l8.687 74.932-80.922 191.954 24.081 11.11 86.841-203.064z"
|
60
|
+
fill="#8cf2ff"
|
61
|
+
id="path12"
|
62
|
+
style="fill:#550000" />
|
63
|
+
<path
|
64
|
+
d="m275.462 7.504 13.372 79.391-82.185 211.264 181.633 29.648 116.218-64.465v-166.494l-82.059-89.348z"
|
65
|
+
fill="#bdf9ff"
|
66
|
+
id="path14"
|
67
|
+
style="fill:#aa0000" />
|
68
|
+
<path
|
69
|
+
d="m422.441 7.5h-29.999l82.058 89.348-2.708 158.005-114.938 67.824 31.428 5.13 116.218-64.465v-166.494z"
|
70
|
+
fill="#8cf2ff"
|
71
|
+
id="path16"
|
72
|
+
style="fill:#550000" />
|
73
|
+
<path
|
74
|
+
d="m7.5 247.633 139.06 75.852 36.622 181.015h-131.72l-43.962-81.962z"
|
75
|
+
fill="#bdf9ff"
|
76
|
+
id="path18"
|
77
|
+
style="fill:#aa0000" />
|
78
|
+
<path
|
79
|
+
d="m146.56 323.485-139.06-75.852v32.359l109.06 59.488 36.622 165.02h30z"
|
80
|
+
fill="#8cf2ff"
|
81
|
+
id="path20"
|
82
|
+
style="fill:#550000" />
|
83
|
+
<path
|
84
|
+
d="m213.103 504.5-6.454-162.167 160.3 39.66 21.333 122.507z"
|
85
|
+
fill="#bdf9ff"
|
86
|
+
id="path22"
|
87
|
+
style="fill:#aa0000" />
|
88
|
+
<path
|
89
|
+
d="m366.949 381.993-160.3-39.66.803 20.176 132.305 35.608 18.525 106.383h30z"
|
90
|
+
fill="#8cf2ff"
|
91
|
+
id="path24"
|
92
|
+
style="fill:#550000" />
|
93
|
+
<path
|
94
|
+
d="m416.599 504.5-10.266-129.107 98.167-59.726v111.936l-49.083 76.897z"
|
95
|
+
fill="#bdf9ff"
|
96
|
+
id="path26"
|
97
|
+
style="fill:#aa0000" />
|
98
|
+
<path
|
99
|
+
d="m474.5 333.919v93.684l-49.083 76.897h30l49.083-76.897v-111.936z"
|
100
|
+
fill="#8cf2ff"
|
101
|
+
id="path28"
|
102
|
+
style="fill:#550000" />
|
103
|
+
<g
|
104
|
+
id="g40">
|
105
|
+
<path
|
106
|
+
d="m4.358 223.195 149.808 69.115c3.844 1.773 8.382.012 10.037-3.861l11.452-26.779c1.629-3.809-.138-8.217-3.946-9.845-3.812-1.633-8.218.139-9.845 3.946l-8.419 19.687-138.445-63.873v-127.736l76.867-68.845h136.914l7.688 66.315-62.02 145.023c-1.629 3.809.138 8.217 3.946 9.845 3.81 1.632 8.217-.14 9.845-3.946l62.804-146.856c.514-1.201.705-2.516.555-3.813l-8.687-74.932c-.438-3.783-3.643-6.637-7.45-6.637h-146.462c-1.847 0-3.628.682-5.004 1.913l-81.5 72.994c-1.588 1.424-2.496 3.455-2.496 5.588v135.887c0 2.926 1.701 5.584 4.358 6.81z"
|
107
|
+
id="path30" />
|
108
|
+
<path
|
109
|
+
d="m510.023 91.774-28.973-31.546c-2.801-3.051-7.546-3.253-10.597-.45-3.051 2.802-3.252 7.546-.45 10.597l26.997 29.395v159.156l-110.079 61.06-169.925-27.736 78.828-202.635c.49-1.261.63-2.631.405-3.965l-11.898-70.646 134.815-.004 29.222 31.816c2.801 3.051 7.546 3.253 10.597.45 3.051-2.802 3.252-7.546.45-10.597l-31.45-34.243c-1.421-1.546-3.425-2.426-5.525-2.426l-146.978.004c-4.63 0-8.168 4.165-7.396 8.746l13.028 77.353-81.434 209.337c-1.73 4.447 1.081 9.352 5.781 10.121l181.633 29.647c.401.065.806.098 1.208.098 1.267 0 2.52-.32 3.638-.941l116.218-64.465c2.384-1.322 3.862-3.833 3.862-6.559v-166.493c0-1.879-.705-3.69-1.977-5.074z"
|
110
|
+
id="path32" />
|
111
|
+
<path
|
112
|
+
d="m153.91 321.997c-.438-2.171-1.814-4.036-3.759-5.097l-139.06-75.852c-2.323-1.267-5.145-1.216-7.42.135-2.275 1.352-3.671 3.802-3.671 6.45v174.905c0 1.237.306 2.455.891 3.545l43.962 81.962c1.307 2.436 3.846 3.955 6.609 3.955h131.72c2.25 0 4.381-1.01 5.806-2.752 1.424-1.741 1.991-4.03 1.546-6.235zm-97.96 175.003-40.95-76.347v-160.386l124.901 68.129 34.112 168.604z"
|
113
|
+
id="path34" />
|
114
|
+
<path
|
115
|
+
d="m374.337 380.706c-.51-2.929-2.701-5.279-5.587-5.993l-160.299-39.66c-4.842-1.197-9.494 2.586-9.296 7.578l6.453 162.167c.16 4.023 3.468 7.202 7.494 7.202h42.898c4.143 0 7.5-3.357 7.5-7.5s-3.357-7.5-7.5-7.5h-35.69l-5.77-144.988 145.858 36.087 18.965 108.901h-90.773c-4.143 0-7.5 3.357-7.5 7.5s3.357 7.5 7.5 7.5h99.692c2.214 0 4.315-.979 5.74-2.673s2.028-3.933 1.648-6.114z"
|
116
|
+
id="path36" />
|
117
|
+
<path
|
118
|
+
d="m508.175 309.129c-2.363-1.327-5.257-1.278-7.573.131l-98.167 59.726c-2.419 1.472-3.803 4.18-3.578 7.002l10.266 129.107c.311 3.899 3.565 6.905 7.477 6.905h38.818c2.561 0 4.944-1.307 6.322-3.465l49.083-76.897c.769-1.205 1.178-2.605 1.178-4.035v-111.936c-.001-2.71-1.463-5.21-3.826-6.538zm-11.175 116.284-45.693 71.587h-27.78l-9.351-117.6 82.824-50.391z"
|
119
|
+
id="path38" />
|
120
|
+
</g>
|
121
|
+
</g>
|
122
|
+
</svg>
|
data/lib/shattered_machine.rb
CHANGED
@@ -3,10 +3,11 @@
|
|
3
3
|
require 'shattered_machine/converter'
|
4
4
|
require 'shattered_machine/glitcher'
|
5
5
|
require 'shattered_machine/io'
|
6
|
+
require 'shattered_machine/sampler'
|
6
7
|
|
7
8
|
# main file for ShatteredMachine gem
|
8
9
|
module ShatteredMachine
|
9
|
-
VERSION = '0.0.
|
10
|
+
VERSION = '0.0.8'
|
10
11
|
|
11
12
|
class << self
|
12
13
|
end
|
@@ -1,5 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative 'brush'
|
4
|
+
require_relative 'change_byte'
|
5
|
+
require_relative 'defect'
|
6
|
+
require_relative 'exchange'
|
7
|
+
require_relative 'pixel_sorter'
|
8
|
+
require_relative 'slim'
|
9
|
+
require_relative 'transpose'
|
10
|
+
require_relative 'wrong_filter'
|
3
11
|
module ShatteredMachine
|
4
12
|
# Main class to call from glitching image.
|
5
13
|
class Glitcher
|
data/lib/shattered_machine/io.rb
CHANGED
@@ -6,10 +6,6 @@ module ShatteredMachine
|
|
6
6
|
class Io
|
7
7
|
attr_accessor :output_filename
|
8
8
|
|
9
|
-
PNG_EXTENSIONS = ['.png', '.PNG'].freeze
|
10
|
-
JPG_EXTENSIONS = ['.jpg', '.jpeg', '.JPG', '.JPEG'].freeze
|
11
|
-
Paths = Struct.new(:input, :output)
|
12
|
-
|
13
9
|
# @param input_path [string] input file or directory
|
14
10
|
# @param output_folder [string] output directory
|
15
11
|
# @param output_filename [string] output file name
|
@@ -39,6 +35,10 @@ module ShatteredMachine
|
|
39
35
|
|
40
36
|
private
|
41
37
|
|
38
|
+
PNG_EXTENSIONS = ['.png', '.PNG'].freeze
|
39
|
+
JPG_EXTENSIONS = ['.jpg', '.jpeg', '.JPG', '.JPEG'].freeze
|
40
|
+
Paths = Struct.new(:input, :output)
|
41
|
+
|
42
42
|
def single_image_io
|
43
43
|
[Paths.new(@input_path, generate_output_filename)]
|
44
44
|
end
|
@@ -5,16 +5,13 @@ module ShatteredMachine
|
|
5
5
|
# A simple weay ro run one, many or all glitch algotirhm on one specific image.
|
6
6
|
# This create a quick overview of the effect of each algo for the given image.
|
7
7
|
class Sampler
|
8
|
-
|
9
|
-
SLIM_DIRECTION = %w[up_to_down down_to_up left_to_right right_to_left].freeze
|
10
|
-
BRUSH_DIRECTION = %w[vertical vertical_inverted horizontal horizontal_inverted].freeze
|
11
|
-
ALL_ALGORITHMS = %w[exchange transpose wrong_filter slim brus change_byte defect].freeze
|
8
|
+
ALL_ALGORITHMS = %w[brush change_byte defect exchange slim transpose wrong_filter].freeze
|
12
9
|
|
13
10
|
# @param io [ShatteredMachine::Io] Io containing paths for images to sample
|
14
11
|
# @param options [Hash] options for specifying which
|
15
12
|
def initialize(io, options = {})
|
16
13
|
@io = io
|
17
|
-
@base_output_filename =
|
14
|
+
@base_output_filename = io.output_filename || 'sample'
|
18
15
|
@algorithms_to_sample = options[:algorithms_to_sample] || ALL_ALGORITHMS
|
19
16
|
end
|
20
17
|
|
@@ -32,6 +29,10 @@ module ShatteredMachine
|
|
32
29
|
|
33
30
|
private
|
34
31
|
|
32
|
+
FILTERS = %w[none sub up average paeth].freeze
|
33
|
+
SLIM_DIRECTION = %w[up_to_down down_to_up left_to_right right_to_left].freeze
|
34
|
+
BRUSH_DIRECTION = %w[vertical vertical_inverted horizontal horizontal_inverted].freeze
|
35
|
+
|
35
36
|
def update_io(output_filename_appendix)
|
36
37
|
@io.output_filename = "#{@base_output_filename}_#{output_filename_appendix}"
|
37
38
|
end
|
@@ -47,11 +47,11 @@ module ShatteredMachine
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def half_transpose(data, qis)
|
50
|
-
data[0, qis] + data[qis * 2, qis] + data[qis * 1, qis] + data[qis * 3
|
50
|
+
data[0, qis] + data[qis * 2, qis] + data[qis * 1, qis] + data[qis * 3..-1]
|
51
51
|
end
|
52
52
|
|
53
53
|
def full_transpose(data, qis)
|
54
|
-
data[qis * 2, qis] + data[0, qis] + data[qis * 3
|
54
|
+
data[qis * 2, qis] + data[0, qis] + data[qis * 3..-1] + data[qis * 1, qis]
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
data/shattered_machine.gemspec
CHANGED
@@ -1,16 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'English'
|
4
|
+
|
1
5
|
Gem::Specification.new do |s|
|
2
6
|
s.name = 'shattered_machine'
|
3
|
-
s.version = '0.0.
|
7
|
+
s.version = '0.0.8'
|
8
|
+
s.required_ruby_version = '>= 2.0.0'
|
9
|
+
s.required_rubygems_version = '>= 1.8.11'
|
4
10
|
s.summary = 'Shattered Machine core engine'
|
5
11
|
s.description = 'Shattered Machine is an easy way to glitch PNG images using different algorithms'
|
6
12
|
s.authors = ['Flo Girardo']
|
7
13
|
s.email = 'florian@barbrousse.net'
|
8
|
-
s.files
|
14
|
+
s.files = `git ls-files`.split($RS).reject do |file|
|
15
|
+
file =~ %r{^spec/}
|
16
|
+
end
|
9
17
|
s.test_files = ['spec']
|
10
18
|
s.require_paths = ['lib']
|
11
19
|
s.homepage =
|
12
|
-
'https://
|
20
|
+
'https://git.sr.ht/~pouet/shattered_machine'
|
13
21
|
s.license = 'MIT'
|
22
|
+
s.add_dependency 'rusty_engine_ffi', '>=0.0.2'
|
14
23
|
s.add_development_dependency('rspec', '~> 3')
|
15
24
|
s.add_development_dependency('yard', '~> 0.9')
|
16
25
|
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shattered_machine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Flo Girardo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-07-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rusty_engine_ffi
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.0.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.0.2
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: rspec
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -78,6 +92,8 @@ files:
|
|
78
92
|
- doc/js/jquery.js
|
79
93
|
- doc/method_list.html
|
80
94
|
- doc/top-level-namespace.html
|
95
|
+
- icon.png
|
96
|
+
- icon.svg
|
81
97
|
- lib/shattered_machine.rb
|
82
98
|
- lib/shattered_machine/brush.rb
|
83
99
|
- lib/shattered_machine/change_byte.rb
|
@@ -92,26 +108,7 @@ files:
|
|
92
108
|
- lib/shattered_machine/transpose.rb
|
93
109
|
- lib/shattered_machine/wrong_filter.rb
|
94
110
|
- shattered_machine.gemspec
|
95
|
-
|
96
|
-
- spec/change_byte_spec.rb
|
97
|
-
- spec/converter_spec.rb
|
98
|
-
- spec/defect_spec.rb
|
99
|
-
- spec/exchange_spec.rb
|
100
|
-
- spec/glitcher_spec.rb
|
101
|
-
- spec/images/bar.PNG
|
102
|
-
- spec/images/bar.jpeg
|
103
|
-
- spec/images/foo.jpg
|
104
|
-
- spec/images/foo.png
|
105
|
-
- spec/images/fuzz.JPG
|
106
|
-
- spec/images/pouet.JPEG
|
107
|
-
- spec/io_spec.rb
|
108
|
-
- spec/pixel_sorter_spec.rb
|
109
|
-
- spec/sampler_spec.rb
|
110
|
-
- spec/slim_spec.rb
|
111
|
-
- spec/spec_helper.rb
|
112
|
-
- spec/transpose_spec.rb
|
113
|
-
- spec/wrong_filter_spec.rb
|
114
|
-
homepage: https://framagit.org/Radoteur/shattered-machine
|
111
|
+
homepage: https://git.sr.ht/~pouet/shattered_machine
|
115
112
|
licenses:
|
116
113
|
- MIT
|
117
114
|
metadata: {}
|
@@ -123,14 +120,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
123
120
|
requirements:
|
124
121
|
- - ">="
|
125
122
|
- !ruby/object:Gem::Version
|
126
|
-
version:
|
123
|
+
version: 2.0.0
|
127
124
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
125
|
requirements:
|
129
126
|
- - ">="
|
130
127
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
128
|
+
version: 1.8.11
|
132
129
|
requirements: []
|
133
|
-
rubygems_version: 3.
|
130
|
+
rubygems_version: 3.2.18
|
134
131
|
signing_key:
|
135
132
|
specification_version: 4
|
136
133
|
summary: Shattered Machine core engine
|
data/spec/brush_spec.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe ShatteredMachine::Brush do
|
6
|
-
describe '#call' do
|
7
|
-
let(:output_file) { 'spec/images/brush.png' }
|
8
|
-
let(:input_file) { 'spec/images/foo.png' }
|
9
|
-
let(:io) do
|
10
|
-
ShatteredMachine::Io.new(input_file, 'spec/images', 'brush')
|
11
|
-
end
|
12
|
-
let(:in_img) { io.png_images.first.input }
|
13
|
-
let(:out_img) { io.png_images.first.output }
|
14
|
-
subject { ShatteredMachine::Brush.new.call(in_img, out_img) }
|
15
|
-
|
16
|
-
after do
|
17
|
-
File.delete(output_file) if File.exist?(output_file)
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'brush image' do
|
21
|
-
subject
|
22
|
-
expect(File.exist?(output_file)).to be true
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/spec/change_byte_spec.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe ShatteredMachine::ChangeByte do
|
6
|
-
describe '#call' do
|
7
|
-
let(:output_file) { 'spec/images/change_byte.png' }
|
8
|
-
let(:input_file) { 'spec/images/foo.png' }
|
9
|
-
let(:io) do
|
10
|
-
ShatteredMachine::Io.new(input_file, 'spec/images', 'change_byte')
|
11
|
-
end
|
12
|
-
let(:in_img) { io.png_images.first.input }
|
13
|
-
let(:out_img) { io.png_images.first.output }
|
14
|
-
subject { ShatteredMachine::ChangeByte.new.call(in_img, out_img) }
|
15
|
-
|
16
|
-
after do
|
17
|
-
File.delete(output_file) if File.exist?(output_file)
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'change byte on image' do
|
21
|
-
subject
|
22
|
-
expect(File.exist?(output_file)).to be true
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/spec/converter_spec.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe ShatteredMachine::Converter do
|
6
|
-
describe '#call' do
|
7
|
-
let(:converted_file) { 'spec/images/converted.png' }
|
8
|
-
let(:input_file) { 'spec/images/foo.jpg' }
|
9
|
-
let(:io) do
|
10
|
-
ShatteredMachine::Io.new(input_file, 'spec/images', 'converted')
|
11
|
-
end
|
12
|
-
subject { ShatteredMachine::Converter.new(io).call }
|
13
|
-
|
14
|
-
after do
|
15
|
-
File.delete(converted_file) if File.exist?(converted_file)
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'convert image' do
|
19
|
-
subject
|
20
|
-
expect(File.exist?(converted_file)).to be true
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
data/spec/defect_spec.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe ShatteredMachine::Defect do
|
6
|
-
describe '#call' do
|
7
|
-
let(:output_file) { 'spec/images/defect.png' }
|
8
|
-
let(:input_file) { 'spec/images/foo.png' }
|
9
|
-
let(:io) do
|
10
|
-
ShatteredMachine::Io.new(input_file, 'spec/images', 'defect')
|
11
|
-
end
|
12
|
-
let(:in_img) { io.png_images.first.input }
|
13
|
-
let(:out_img) { io.png_images.first.output }
|
14
|
-
subject { ShatteredMachine::Defect.new.call(in_img, out_img) }
|
15
|
-
|
16
|
-
after do
|
17
|
-
File.delete(output_file) if File.exist?(output_file)
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'defect image' do
|
21
|
-
subject
|
22
|
-
expect(File.exist?(output_file)).to be true
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/spec/exchange_spec.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe ShatteredMachine::Exchange do
|
6
|
-
describe '#call' do
|
7
|
-
let(:output_file) { 'spec/images/exchange.png' }
|
8
|
-
let(:input_file) { 'spec/images/foo.png' }
|
9
|
-
let(:io) do
|
10
|
-
ShatteredMachine::Io.new(input_file, 'spec/images', 'exchange')
|
11
|
-
end
|
12
|
-
let(:in_img) { io.png_images.first.input }
|
13
|
-
let(:out_img) { io.png_images.first.output }
|
14
|
-
subject { ShatteredMachine::Exchange.new.call(in_img, out_img) }
|
15
|
-
|
16
|
-
after do
|
17
|
-
File.delete(output_file) if File.exist?(output_file)
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'exchange image' do
|
21
|
-
subject
|
22
|
-
expect(File.exist?(output_file)).to be true
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/spec/glitcher_spec.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe ShatteredMachine::Glitcher do
|
6
|
-
describe '#call' do
|
7
|
-
let(:output_file) { 'spec/images/glitch.png' }
|
8
|
-
let(:input_file) { 'spec/images/foo.png' }
|
9
|
-
let(:io) do
|
10
|
-
ShatteredMachine::Io.new(input_file, 'spec/images', 'glitch')
|
11
|
-
end
|
12
|
-
subject do
|
13
|
-
ShatteredMachine::Glitcher.new('Slim', io).call
|
14
|
-
end
|
15
|
-
|
16
|
-
after do
|
17
|
-
File.delete(output_file) if File.exist?(output_file)
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'slim image' do
|
21
|
-
subject
|
22
|
-
expect(File.exist?(output_file)).to be true
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/spec/images/bar.PNG
DELETED
Binary file
|
data/spec/images/bar.jpeg
DELETED
Binary file
|
data/spec/images/foo.jpg
DELETED
Binary file
|
data/spec/images/foo.png
DELETED
Binary file
|
data/spec/images/fuzz.JPG
DELETED
Binary file
|
data/spec/images/pouet.JPEG
DELETED
Binary file
|
data/spec/io_spec.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe ShatteredMachine::Io do
|
6
|
-
describe '#png_images' do
|
7
|
-
subject do
|
8
|
-
ShatteredMachine::Io.new(input_path, 'spec/images', output_filename).png_images
|
9
|
-
end
|
10
|
-
|
11
|
-
context 'input path is a directory' do
|
12
|
-
let(:input_path) { 'spec/images' }
|
13
|
-
let(:output_filename) { 'pif' }
|
14
|
-
|
15
|
-
it 'find two png images' do
|
16
|
-
expect(subject.count).to eq(2)
|
17
|
-
expect(subject.first.input).to eq('spec/images/foo.png')
|
18
|
-
expect(subject.first.output).to eq('spec/images/piffoo.png')
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
context 'input path is an image' do
|
23
|
-
context 'output path is available' do
|
24
|
-
let(:input_path) { 'spec/images/foo.png' }
|
25
|
-
let(:output_filename) { 'paf' }
|
26
|
-
|
27
|
-
it 'find the correct png image' do
|
28
|
-
expect(subject.count).to eq(1)
|
29
|
-
expect(subject.first.input).to eq('spec/images/foo.png')
|
30
|
-
expect(subject.first.output).to eq('spec/images/paf.png')
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
context 'output path is not available' do
|
35
|
-
let(:input_path) { 'spec/images/foo.png' }
|
36
|
-
let(:output_filename) { 'foo' }
|
37
|
-
|
38
|
-
it 'find the correct png image' do
|
39
|
-
expect(subject.count).to eq(1)
|
40
|
-
expect(subject.first.output).to match %r(spec/images/foo_(\d{8})_(\d{6}).png)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
describe '#jpg_images' do
|
47
|
-
subject do
|
48
|
-
ShatteredMachine::Io.new(input_path, 'spec/images', output_filename).jpg_images
|
49
|
-
end
|
50
|
-
|
51
|
-
context 'input path is a directory' do
|
52
|
-
let(:input_path) { 'spec/images' }
|
53
|
-
let(:output_filename) { 'pouf' }
|
54
|
-
|
55
|
-
it 'find four jpg images' do
|
56
|
-
expect(subject.count).to eq(4)
|
57
|
-
expect(subject.first.input).to eq('spec/images/fuzz.JPG')
|
58
|
-
expect(subject.first.output).to eq('spec/images/pouffuzz.png')
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
context 'input path is an image' do
|
63
|
-
let(:input_path) { 'spec/images/foo.jpg' }
|
64
|
-
let(:output_filename) { 'pouet' }
|
65
|
-
|
66
|
-
it 'find the correct jpg image' do
|
67
|
-
expect(subject.count).to eq(1)
|
68
|
-
expect(subject.first.input).to eq('spec/images/foo.jpg')
|
69
|
-
expect(subject.first.output).to eq('spec/images/pouet.png')
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
data/spec/pixel_sorter_spec.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe ShatteredMachine::PixelSorter do
|
6
|
-
describe '#call' do
|
7
|
-
let(:output_file) { 'spec/images/sorter.png' }
|
8
|
-
let(:input_file) { 'spec/images/foo.png' }
|
9
|
-
let(:io) do
|
10
|
-
ShatteredMachine::Io.new(input_file, 'spec/images', 'sorter')
|
11
|
-
end
|
12
|
-
let(:in_img) { io.png_images.first.input }
|
13
|
-
let(:out_img) { io.png_images.first.output }
|
14
|
-
subject { ShatteredMachine::PixelSorter.new.call(in_img, out_img) }
|
15
|
-
|
16
|
-
after do
|
17
|
-
File.delete(output_file) if File.exist?(output_file)
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'sort image' do
|
21
|
-
subject
|
22
|
-
expect(File.exist?(output_file)).to be true
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/spec/sampler_spec.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe ShatteredMachine::Sampler do
|
6
|
-
describe '#call' do
|
7
|
-
let(:created_files) do
|
8
|
-
%w[sample_exchange_average.png sample_exchange_up.png sample_slim_up_to_down.png sample_transpose_sub.png
|
9
|
-
sample_wrong_filter_paeth.png sample_exchange_none.png sample_slim_down_to_up.png sample_transpose_average.png
|
10
|
-
sample_transpose_up.png sample_wrong_filter_sub.png sample_change_byte.png sample_exchange_paeth.png
|
11
|
-
sample_slim_left_to_right.png sample_transpose_none.png sample_wrong_filter_average.png
|
12
|
-
sample_wrong_filter_up.png sample_defect.png sample_exchange_sub.png sample_slim_right_to_left.png
|
13
|
-
sample_transpose_paeth.png sample_wrong_filter_none.png]
|
14
|
-
end
|
15
|
-
let(:output_file) { 'spec/images/sample.png' }
|
16
|
-
let(:input_file) { 'spec/images/foo.png' }
|
17
|
-
let(:io) { ShatteredMachine::Io.new(input_file, 'spec/images', 'sample') }
|
18
|
-
subject { ShatteredMachine::Sampler.new(io).call }
|
19
|
-
|
20
|
-
def output_image_full_path(file)
|
21
|
-
"spec/images/#{file}"
|
22
|
-
end
|
23
|
-
|
24
|
-
after do
|
25
|
-
created_files.each do |file|
|
26
|
-
File.delete(output_image_full_path(file)) if File.exist?(output_image_full_path(file))
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'call sampler' do
|
31
|
-
subject
|
32
|
-
created_files.each do |file|
|
33
|
-
expect(File.exist?(output_image_full_path(file))).to be true
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
data/spec/slim_spec.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe ShatteredMachine::Slim do
|
6
|
-
describe '#call' do
|
7
|
-
let(:output_file) { 'spec/images/slim.png' }
|
8
|
-
let(:input_file) { 'spec/images/foo.png' }
|
9
|
-
let(:io) do
|
10
|
-
ShatteredMachine::Io.new(input_file, 'spec/images', 'slim')
|
11
|
-
end
|
12
|
-
let(:in_img) { io.png_images.first.input }
|
13
|
-
let(:out_img) { io.png_images.first.output }
|
14
|
-
subject { ShatteredMachine::Slim.new.call(in_img, out_img) }
|
15
|
-
|
16
|
-
after do
|
17
|
-
File.delete(output_file) if File.exist?(output_file)
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'slim image' do
|
21
|
-
subject
|
22
|
-
expect(File.exist?(output_file)).to be true
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.configure do |config|
|
4
|
-
config.expect_with :rspec do |expectations|
|
5
|
-
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
6
|
-
end
|
7
|
-
|
8
|
-
config.mock_with :rspec do |mocks|
|
9
|
-
mocks.verify_partial_doubles = true
|
10
|
-
end
|
11
|
-
|
12
|
-
config.shared_context_metadata_behavior = :apply_to_host_groups
|
13
|
-
|
14
|
-
$LOAD_PATH.unshift File.expand_path('..', __dir__)
|
15
|
-
require 'lib/shattered_machine/converter'
|
16
|
-
require 'lib/shattered_machine/brush'
|
17
|
-
require 'lib/shattered_machine/change_byte'
|
18
|
-
require 'lib/shattered_machine/defect'
|
19
|
-
require 'lib/shattered_machine/exchange'
|
20
|
-
require 'lib/shattered_machine/io'
|
21
|
-
require 'lib/shattered_machine/glitcher'
|
22
|
-
require 'lib/shattered_machine/pixel_sorter'
|
23
|
-
require 'lib/shattered_machine/sampler'
|
24
|
-
require 'lib/shattered_machine/slim'
|
25
|
-
require 'lib/shattered_machine/transpose'
|
26
|
-
require 'lib/shattered_machine/wrong_filter'
|
27
|
-
end
|
data/spec/transpose_spec.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe ShatteredMachine::Transpose do
|
6
|
-
describe '#call' do
|
7
|
-
let(:output_file) { 'spec/images/transpose.png' }
|
8
|
-
let(:input_file) { 'spec/images/foo.png' }
|
9
|
-
let(:io) do
|
10
|
-
ShatteredMachine::Io.new(input_file, 'spec/images', 'transpose')
|
11
|
-
end
|
12
|
-
let(:in_img) { io.png_images.first.input }
|
13
|
-
let(:out_img) { io.png_images.first.output }
|
14
|
-
subject { ShatteredMachine::Transpose.new.call(in_img, out_img) }
|
15
|
-
|
16
|
-
after do
|
17
|
-
File.delete(output_file) if File.exist?(output_file)
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'transpose image' do
|
21
|
-
subject
|
22
|
-
expect(File.exist?(output_file)).to be true
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/spec/wrong_filter_spec.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe ShatteredMachine::WrongFilter do
|
6
|
-
describe '#call' do
|
7
|
-
let(:output_file) { 'spec/images/wrong_filter.png' }
|
8
|
-
let(:input_file) { 'spec/images/foo.png' }
|
9
|
-
let(:io) do
|
10
|
-
ShatteredMachine::Io.new(input_file, 'spec/images', 'wrong_filter')
|
11
|
-
end
|
12
|
-
let(:in_img) { io.png_images.first.input }
|
13
|
-
let(:out_img) { io.png_images.first.output }
|
14
|
-
subject { ShatteredMachine::WrongFilter.new.call(in_img, out_img) }
|
15
|
-
|
16
|
-
after do
|
17
|
-
File.delete(output_file) if File.exist?(output_file)
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'wrong filter image' do
|
21
|
-
subject
|
22
|
-
expect(File.exist?(output_file)).to be true
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|