image_filter_dsl 0.0.6 → 0.1.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.
- checksums.yaml +4 -4
- data/README.md +45 -32
- data/lib/image_filter_dsl/binary/struct.rb +1 -1
- data/lib/image_filter_dsl/dsl/filter_instructions.rb +48 -2
- metadata +4 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 64f070bf94d94ef0c6e0de6a78fa7ccd8f29f181e866d4aa374f26a4e427f18f
|
4
|
+
data.tar.gz: 6347c8d1b350387e369e2e56d023f0fa944dd70a4870035af55619287e11bd7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8c55bf124bf7e454021ec8b644373566467eeec81786875bc9fa4d89ee0fa86e7e7044c71c83aa0396a3e97c7b0347d3cdd55e952e98c256c02b9f48a524d4e
|
7
|
+
data.tar.gz: 4590228397df810c7b75a5c59c1a4a1510e4e7ce723dd36e168f7a9f377dc6decf1b434cdca926e0c6ecc7a4196dae96b7ba6d0beda91b3743994b6e96bd910d
|
data/README.md
CHANGED
@@ -18,23 +18,23 @@ _An Image Filter DSL (duh)_
|
|
18
18
|
|
19
19
|
Using `ImageFilterDsl::Dsl::Filter`
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
21
|
+
```ruby
|
22
|
+
# - First array contains input variables
|
23
|
+
# x, y, r, g, b, a, :width and :hght are automatically
|
24
|
+
# populated by image filter process
|
25
|
+
# - Second array contains output vars; r,g,b,a and optionally
|
26
|
+
# x,y for images
|
27
|
+
filter = Filter.define [:x,:y,:r,:g,:b], [:r,:g,:b] do
|
28
|
+
# Instructions go here
|
29
|
+
# instruction [input(s)], output
|
30
|
+
add [:x,:r], :g
|
31
|
+
|
32
|
+
# output can be an existing symbol in out, or a custom one up to 5 letters
|
33
|
+
# long (longer will be trimmed if serialized to a binary file)
|
34
|
+
|
35
|
+
# input can be any declared input or custom variable
|
36
|
+
end
|
37
|
+
```
|
38
38
|
|
39
39
|
### Instructions
|
40
40
|
|
@@ -47,19 +47,19 @@ __Math__
|
|
47
47
|
- `add` add 2 or more input values, storing in output (<code>a+b</code>)
|
48
48
|
|
49
49
|
```ruby
|
50
|
-
|
50
|
+
add [:r,5], :r # replace r with r + 5
|
51
51
|
```
|
52
52
|
|
53
53
|
- `mult` add 2 or more inputs, storing in out (<code>a*b</code>)
|
54
54
|
|
55
55
|
```ruby
|
56
|
-
|
56
|
+
mult [:r,2], :r # Replace r with r * 2
|
57
57
|
```
|
58
58
|
|
59
59
|
- `div` divide 2 inputs
|
60
60
|
|
61
61
|
```ruby
|
62
|
-
|
62
|
+
div [:r, 2], :g # Write r/2 to g
|
63
63
|
```
|
64
64
|
|
65
65
|
- `mod` store modulo of two inputs in output
|
@@ -97,20 +97,29 @@ __Collection__
|
|
97
97
|
|
98
98
|
__Logic/Conversion/Memory__
|
99
99
|
|
100
|
-
- `above` choose one of two values based on greater than comparison (4 values) `[n1,n1,true_val,false_val]`
|
100
|
+
- `above` choose one of two values based on greater than comparison (2 or 4 values) `[n1,n1,true_val,false_val]` (If not specified, `true_val` is 1 and `false_val` is 0)
|
101
101
|
|
102
102
|
```ruby
|
103
103
|
# if r > g, store 0 in g, else store g in g (keep g the same)
|
104
104
|
above [:r,:g,0,:g], :g
|
105
105
|
```
|
106
106
|
|
107
|
-
- `below` choose one of two values based on less than comparison (4 values) `[n1,n1,true_val,false_val]`
|
107
|
+
- `below` choose one of two values based on less than comparison (2 or 4 values) `[n1,n1,true_val,false_val]` (If not specified, `true_val` is 1 and `false_val` is 0)
|
108
108
|
|
109
109
|
```ruby
|
110
110
|
# if r < g, store 0 in r, else store r in r (keep r the same)
|
111
111
|
below [:r,:g,0,:r], :r
|
112
112
|
```
|
113
113
|
|
114
|
+
- `between` choose one of two values based on whether value is between two others (3 or 5 values) `[min,max,value,true_val,false_val]` (If not specified, `true_val` is 1 and `false_val` is 0)
|
115
|
+
|
116
|
+
```ruby
|
117
|
+
# Returns value since val > 1 && val < 3
|
118
|
+
below [1,3,2], :r
|
119
|
+
# Returns 1 since -1 < 1
|
120
|
+
below [1,-1,5], :r
|
121
|
+
```
|
122
|
+
|
114
123
|
- `switch` choose one of two values based on condition value (1/1.0 = true, 0/0.0 = false) `[cond,true_val,false_val]`
|
115
124
|
|
116
125
|
```ruby
|
@@ -118,11 +127,15 @@ __Logic/Conversion/Memory__
|
|
118
127
|
switch [:c,:r,:g], :a
|
119
128
|
```
|
120
129
|
|
121
|
-
- `eq` if two input values are equal, store 1, else 0 (`[val1,val2]`)
|
122
|
-
- `bnot` if input is 1 or 1.0, store 0, else 1 (`[bool]`)
|
130
|
+
- `eq` if two input values are equal, store 1, else 0 (_2 values_) (`[val1,val2]`)
|
131
|
+
- `bnot` if input is 1 or 1.0, store 0, else 1 (_1 value_) (`[bool]`)
|
132
|
+
- `band` if _all_ input values are 1 or 1.0, store 1, else 0 (_1+ values_) (`[val1,val2,...]`)
|
133
|
+
- `bor` if _any_ input values are 1 or 1.0, store 1, else 0 (_1+ values_) (`[val1,val2,...]`)
|
123
134
|
- `copy` copy input directly to output (`[src]`)
|
124
|
-
- `ceil` nearest whole integer of input, rounded up (`[val]`)
|
125
|
-
- `
|
135
|
+
- `ceil` nearest whole integer of input, rounded up (_1 value_) (`[val]`)
|
136
|
+
- `floor` nearest whole integer of input, rounded down (_1 value_) (`[val]`)
|
137
|
+
- `clamp` input clamped to be no less than min, no greater than max (`[min,max,val]`)
|
138
|
+
- `float` cast input to float (_1 value_) (`[val]`)
|
126
139
|
- `round` round first input value to second value decimals (`[value,decimal_count]`)
|
127
140
|
- `mix` Mix two values together with a ratio (0*a + (1-r)*b) (`[ratio,a,b]`)
|
128
141
|
|
@@ -142,24 +155,24 @@ __Generators__
|
|
142
155
|
|
143
156
|
Define filter
|
144
157
|
|
145
|
-
|
158
|
+
```
|
146
159
|
swizzle = Filter.define [:r,:g,:b], [:r,:g,:b] do
|
147
160
|
copy [:g], :t # copy green to temp
|
148
161
|
copy [:r], :g # copy red to green
|
149
162
|
copy [:b], :r # copy blue to red
|
150
163
|
copy [:t], :b # copy temp (original green) to blue
|
151
164
|
end
|
152
|
-
|
165
|
+
```
|
153
166
|
|
154
167
|
Optionally write filter kernal to binary file on disk
|
155
168
|
|
156
|
-
|
169
|
+
```ruby
|
157
170
|
ImageFilterDsl::Engine::IO.write("./swizzle.ifdk", swizzle)
|
158
|
-
|
171
|
+
```
|
159
172
|
|
160
173
|
Use filter kernal to process image
|
161
174
|
|
162
|
-
|
175
|
+
```ruby
|
163
176
|
# From binary kernal file
|
164
177
|
processor = ImageFilterDsl::Engine::ImageProcessor.new('./swizzle.ifdk')
|
165
178
|
# OR from filter object
|
@@ -169,7 +182,7 @@ Use filter kernal to process image
|
|
169
182
|
|
170
183
|
# Process image and store output
|
171
184
|
processor.process_image('./my_source.png', './my_output.png')
|
172
|
-
|
185
|
+
```
|
173
186
|
|
174
187
|
- See `./sample_filters/samples.rb` for sample filters
|
175
188
|
- See Also: [image_filter_dsl_samples](https://bitbucket.org/WadeH/image_filter_dsl_samples/src/master/) for more samples
|
@@ -36,6 +36,10 @@ module ImageFilterDsl
|
|
36
36
|
eq: 0xd8,
|
37
37
|
bnot: 0xd9,
|
38
38
|
mix: 0xda,
|
39
|
+
between: 0xdb,
|
40
|
+
clamp: 0xdc,
|
41
|
+
band: 0xdd,
|
42
|
+
bor: 0xde,
|
39
43
|
# generation
|
40
44
|
rand: 0xf0,
|
41
45
|
sin: 0xf1,
|
@@ -122,9 +126,11 @@ module ImageFilterDsl
|
|
122
126
|
|
123
127
|
##
|
124
128
|
# Above instruction
|
125
|
-
# @param [Array] i input values (a,b,trueVal,falseVal)
|
129
|
+
# @param [Array] i input values `(a,b,trueVal,falseVal)`
|
130
|
+
# `trueVal` defaults to `1`, `falseVal` defaults to `0`
|
126
131
|
# @return [Integer|Float] output value
|
127
132
|
def self.above(i)
|
133
|
+
i = [i,1,0].flatten if i.length == 2
|
128
134
|
if(i[0]>i[1])
|
129
135
|
if i.length < 3
|
130
136
|
1
|
@@ -142,9 +148,11 @@ module ImageFilterDsl
|
|
142
148
|
|
143
149
|
##
|
144
150
|
# Below instruction
|
145
|
-
# @param [Array] i input values (a,b,trueVal,falseVal)
|
151
|
+
# @param [Array] i input values `(a,b,trueVal,falseVal)`
|
152
|
+
# `trueVal` defaults to `1`, `falseVal` defaults to `0`
|
146
153
|
# @return [Integer|Float] output value
|
147
154
|
def self.below(i)
|
155
|
+
i = [i,1,0].flatten if i.length == 2
|
148
156
|
if(i[0]<i[1])
|
149
157
|
if i.length < 3
|
150
158
|
1
|
@@ -160,6 +168,28 @@ module ImageFilterDsl
|
|
160
168
|
end
|
161
169
|
end
|
162
170
|
|
171
|
+
##
|
172
|
+
# Between instruction (check if value is between two others)
|
173
|
+
# @param [Array] i input values `[min, max, value, trueVal, falseVal]`
|
174
|
+
# `trueVal` defaults to `1`, `falseVal` defaults to `0`
|
175
|
+
# @return [Integer] 1 if true, 0 if false
|
176
|
+
def self.between(i)
|
177
|
+
i = [i,1,0].flatten if i.length == 3
|
178
|
+
a,b,v,t,f = i
|
179
|
+
r = (v>=a) && (v<=b)
|
180
|
+
(r)? t : f
|
181
|
+
end
|
182
|
+
|
183
|
+
##
|
184
|
+
# Clamp value between a min and a max
|
185
|
+
# @param [Array] i input values `[min,max,val]`
|
186
|
+
# @return [Integer|Float] Value forced to be no greater than `max`
|
187
|
+
# and no less than `min`
|
188
|
+
def self.clamp(i)
|
189
|
+
a,b,v = i
|
190
|
+
[b,[a,v].max].min
|
191
|
+
end
|
192
|
+
|
163
193
|
##
|
164
194
|
# Floor instruction
|
165
195
|
# @param [Array] i input value (v)
|
@@ -230,6 +260,22 @@ module ImageFilterDsl
|
|
230
260
|
end
|
231
261
|
end
|
232
262
|
|
263
|
+
##
|
264
|
+
# Logical AND instruction
|
265
|
+
# @param [Array] i input values (ints or floats)
|
266
|
+
# @return [Integer] 1 if all values are `1` or `1.0`, else 0
|
267
|
+
def self.band(i)
|
268
|
+
(i.reduce(:+).to_i == i.length)? 1 : 0
|
269
|
+
end
|
270
|
+
|
271
|
+
##
|
272
|
+
# Logical OR instruction
|
273
|
+
# @param [Array] i input values (ints or floats)
|
274
|
+
# @return [Integer] 1 if any values are `1` or `1.0`, else 0
|
275
|
+
def self.bor(i)
|
276
|
+
(i.reduce(:+).to_i > 0)? 1 : 0
|
277
|
+
end
|
278
|
+
|
233
279
|
##
|
234
280
|
# Mix two values with a ratio
|
235
281
|
# @param [Array] i input values (ratio (0-1.0), a, b)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: image_filter_dsl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wade H.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chunky_png
|
@@ -96,7 +96,7 @@ licenses:
|
|
96
96
|
- MIT
|
97
97
|
metadata:
|
98
98
|
source_code_uri: https://bitbucket.org/WadeH/image_filter_dsl
|
99
|
-
documentation_uri: https://rubydoc.info/gems/image_filter_dsl/0.0
|
99
|
+
documentation_uri: https://rubydoc.info/gems/image_filter_dsl/0.1.0
|
100
100
|
post_install_message:
|
101
101
|
rdoc_options: []
|
102
102
|
require_paths:
|
@@ -112,8 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
112
|
- !ruby/object:Gem::Version
|
113
113
|
version: '0'
|
114
114
|
requirements: []
|
115
|
-
|
116
|
-
rubygems_version: 2.7.8
|
115
|
+
rubygems_version: 3.0.1
|
117
116
|
signing_key:
|
118
117
|
specification_version: 4
|
119
118
|
summary: Image Filter DSL
|