pixelart 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Manifest.txt +2 -0
- data/lib/pixelart.rb +2 -0
- data/lib/pixelart/color.rb +62 -0
- data/lib/pixelart/gradient.rb +96 -0
- data/lib/pixelart/image.rb +2 -54
- data/lib/pixelart/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5cc4a5d1c756256a1162bdab5208ff01549b7e2543ccb301457845dd1f393b48
|
4
|
+
data.tar.gz: 1f07a5a8203fc4b4fc93446bc52d6abf8ca1b94368c48952649c423ef0100b15
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6031f337310c6935841ae3a9c2528f4aa6179c8a5b6b9a4b4aa21d0f98b9a9dd5a0578792cce660be1f15c11d95e35785efa80547e1950d28cf8e3ff21a05243
|
7
|
+
data.tar.gz: 4615099b098378c2eee14cb854c2ee67237a278172b3c789be1de72a59c9ba6779e8dc2a4e9a4384c93b2771d5c8f31a8cf1f51cff308d6bf0e27468a50d0cb3
|
data/Manifest.txt
CHANGED
data/lib/pixelart.rb
CHANGED
@@ -0,0 +1,62 @@
|
|
1
|
+
module Pixelart
|
2
|
+
|
3
|
+
|
4
|
+
class Color
|
5
|
+
TRANSPARENT = 0 # rgba( 0, 0, 0, 0)
|
6
|
+
BLACK = 0xff # rgba( 0, 0, 0,255)
|
7
|
+
WHITE = 0xffffffff # rgba(255,255,255,255)
|
8
|
+
|
9
|
+
|
10
|
+
def self.parse( color )
|
11
|
+
if color.is_a?( Integer ) ## e.g. assumes ChunkyPNG::Color.rgb() or such
|
12
|
+
color ## pass through as is 1:1
|
13
|
+
elsif color.is_a?( Array ) ## assume array of hsl(a) e. g. [180, 0.86, 0.88]
|
14
|
+
from_hsl( *color )
|
15
|
+
elsif color.is_a?( String )
|
16
|
+
if color.downcase == 'transparent' ## special case for builtin colors
|
17
|
+
TRANSPARENT
|
18
|
+
else
|
19
|
+
## note: return an Integer !!! (not a Color class or such!!! )
|
20
|
+
from_hex( color )
|
21
|
+
end
|
22
|
+
else
|
23
|
+
raise ArgumentError, "unknown color format; cannot parse - expected rgb hex string e.g. d3d3d3"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.from_hex( hex )
|
28
|
+
## Creates a color by converting it from a string in hex notation.
|
29
|
+
##
|
30
|
+
## It supports colors with (#rrggbbaa) or without (#rrggbb)
|
31
|
+
## alpha channel as well as the 3-digit short format (#rgb)
|
32
|
+
## for those without. Color strings may include
|
33
|
+
## the prefix "0x" or "#"".
|
34
|
+
ChunkyPNG::Color.from_hex( hex )
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.from_hsl( hue, saturation, lightness, alpha=255)
|
38
|
+
ChunkyPNG::Color.from_hsl( hue,
|
39
|
+
saturation,
|
40
|
+
lightness,
|
41
|
+
alpha )
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
def self.to_hex( color, include_alpha: true )
|
46
|
+
ChunkyPNG::Color.to_hex( color, include_alpha )
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.to_hsl( color, include_alpha: true )
|
50
|
+
# Returns an array with the separate HSL components of a color.
|
51
|
+
ChunkyPNG::Color.to_hsl( color, include_alpha )
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.r( color ) ChunkyPNG::Color.r( color ); end
|
55
|
+
def self.g( color ) ChunkyPNG::Color.g( color ); end
|
56
|
+
def self.b( color ) ChunkyPNG::Color.b( color ); end
|
57
|
+
|
58
|
+
def self.rgb( r, g, b ) ChunkyPNG::Color.rgb( r, g, b); end
|
59
|
+
end # class Color
|
60
|
+
end # module Pixelart
|
61
|
+
|
62
|
+
|
@@ -0,0 +1,96 @@
|
|
1
|
+
|
2
|
+
## inspired by
|
3
|
+
## https://en.wikipedia.org/wiki/List_of_software_palettes#Color_gradient_palettes
|
4
|
+
## https://github.com/mistic100/tinygradient
|
5
|
+
## https://mistic100.github.io/tinygradient/
|
6
|
+
|
7
|
+
|
8
|
+
module Pixelart
|
9
|
+
|
10
|
+
class Gradient
|
11
|
+
|
12
|
+
def initialize( *stops )
|
13
|
+
## note: convert stop colors to rgb triplets e.g.
|
14
|
+
## from #ffffff to [255,255,255]
|
15
|
+
## #000000 to [0,0,0] etc.
|
16
|
+
@stops = stops.map do |stop|
|
17
|
+
stop = Color.parse( stop )
|
18
|
+
[Color.r(stop), Color.g(stop), Color.b(stop)]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def colors( steps )
|
24
|
+
## note: for now only support two colors
|
25
|
+
## note: gradient will include start (first)
|
26
|
+
## AND stop color (last) - stop color is NOT excluded for now!!
|
27
|
+
start = @stops[0]
|
28
|
+
stop = @stops[1]
|
29
|
+
|
30
|
+
step = stepize( start, stop, steps-1 )
|
31
|
+
## pp step
|
32
|
+
|
33
|
+
gradient = [start]
|
34
|
+
|
35
|
+
1.upto(steps-2).each do |i|
|
36
|
+
color = interpolate( step, start, i )
|
37
|
+
gradient << color
|
38
|
+
end
|
39
|
+
## note: use original passed in stop color (should match calculated)
|
40
|
+
gradient << stop
|
41
|
+
|
42
|
+
## convert to color (Integer)
|
43
|
+
gradient.map do |color|
|
44
|
+
Color.rgb( *color )
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
##
|
49
|
+
# Linearly compute the step size between start and end
|
50
|
+
## (not normalized)
|
51
|
+
# @param {StepValue} start
|
52
|
+
# @param {StepValue} end
|
53
|
+
# @param {number} steps - number of desired steps
|
54
|
+
#@return {StepValue}
|
55
|
+
|
56
|
+
def stepize(start, stop, steps)
|
57
|
+
step = []
|
58
|
+
|
59
|
+
[0,1,2].each do |k|
|
60
|
+
step << Float(stop[k] - start[k]) / Float(steps)
|
61
|
+
end
|
62
|
+
|
63
|
+
step
|
64
|
+
end
|
65
|
+
|
66
|
+
##
|
67
|
+
# Compute the final step color
|
68
|
+
# @param {StepValue} step - from `stepize`
|
69
|
+
# @param {StepValue} start
|
70
|
+
# @param {number} i - color index
|
71
|
+
# @return {StepValue}
|
72
|
+
|
73
|
+
RGB_MAX = [256, 256, 256]
|
74
|
+
def interpolate( step, start, i )
|
75
|
+
color = []
|
76
|
+
|
77
|
+
[0,1,2].each do |k|
|
78
|
+
color[k] = step[k]*i + start[k]
|
79
|
+
|
80
|
+
color[k] = if color[k] < 0.0
|
81
|
+
color[k] + RGB_MAX[k]
|
82
|
+
else
|
83
|
+
color[k] % RGB_MAX[k]
|
84
|
+
end
|
85
|
+
|
86
|
+
## convert back to Integer from Float
|
87
|
+
## add 0.5 for rounding up (starting with 0.5) - why? why not?
|
88
|
+
color[k] = (color[k]+0.5).to_i
|
89
|
+
end
|
90
|
+
color
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
end # class Gradient
|
95
|
+
end # module Pixelart
|
96
|
+
|
data/lib/pixelart/image.rb
CHANGED
@@ -1,57 +1,5 @@
|
|
1
1
|
module Pixelart
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
class Color
|
7
|
-
def self.parse( color )
|
8
|
-
if color.is_a?( Integer ) ## e.g. assumes ChunkyPNG::Color.rgb() or such
|
9
|
-
color ## pass through as is 1:1
|
10
|
-
elsif color.is_a?( Array ) ## assume array of hsl(a) e. g. [180, 0.86, 0.88]
|
11
|
-
ChunkyPNG::Color.from_hsl( *color )
|
12
|
-
elsif color.is_a?( String )
|
13
|
-
if color.downcase == 'transparent' ## special case for builtin colors
|
14
|
-
ChunkyPNG::Color::TRANSPARENT
|
15
|
-
else
|
16
|
-
## note: return an Integer !!! (not a Color class or such!!! )
|
17
|
-
ChunkyPNG::Color.from_hex( color )
|
18
|
-
end
|
19
|
-
else
|
20
|
-
raise ArgumentError, "unknown color format; cannot parse - expected rgb hex string e.g. d3d3d3"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.from_hex( hex )
|
25
|
-
## Creates a color by converting it from a string in hex notation.
|
26
|
-
##
|
27
|
-
## It supports colors with (#rrggbbaa) or without (#rrggbb)
|
28
|
-
## alpha channel as well as the 3-digit short format (#rgb)
|
29
|
-
## for those without. Color strings may include
|
30
|
-
## the prefix "0x" or "#"".
|
31
|
-
ChunkyPNG::Color.from_hex( hex )
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.from_hsl( hue, saturation, lightness, alpha=255)
|
35
|
-
ChunkyPNG::Color.from_hsl( hue,
|
36
|
-
saturation,
|
37
|
-
lightness,
|
38
|
-
alpha )
|
39
|
-
end
|
40
|
-
|
41
|
-
|
42
|
-
def self.to_hex( color, include_alpha: true )
|
43
|
-
ChunkyPNG::Color.to_hex( color, include_alpha )
|
44
|
-
end
|
45
|
-
|
46
|
-
def self.to_hsl( color, include_alpha: true )
|
47
|
-
# Returns an array with the separate HSL components of a color.
|
48
|
-
ChunkyPNG::Color.to_hsl( color, include_alpha )
|
49
|
-
end
|
50
|
-
end # class Color
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
3
|
class Image
|
56
4
|
|
57
5
|
def self.read( path ) ## convenience helper
|
@@ -82,7 +30,7 @@ end
|
|
82
30
|
|
83
31
|
|
84
32
|
|
85
|
-
def initialize( width, height, initial=
|
33
|
+
def initialize( width, height, initial=Color::TRANSPARENT )
|
86
34
|
|
87
35
|
if initial.is_a?( ChunkyPNG::Image )
|
88
36
|
@img = initial
|
@@ -204,7 +152,7 @@ end
|
|
204
152
|
def self.parse_colors( colors )
|
205
153
|
if colors.is_a?( Array ) ## convenience shortcut
|
206
154
|
## note: always auto-add color 0 as pre-defined transparent - why? why not?
|
207
|
-
h = { '0' =>
|
155
|
+
h = { '0' => Color::TRANSPARENT }
|
208
156
|
colors.each_with_index do |color, i|
|
209
157
|
h[ (i+1).to_s ] = Color.parse( color )
|
210
158
|
end
|
data/lib/pixelart/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pixelart
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-04-
|
11
|
+
date: 2021-04-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chunky_png
|
@@ -73,6 +73,8 @@ files:
|
|
73
73
|
- README.md
|
74
74
|
- Rakefile
|
75
75
|
- lib/pixelart.rb
|
76
|
+
- lib/pixelart/color.rb
|
77
|
+
- lib/pixelart/gradient.rb
|
76
78
|
- lib/pixelart/image.rb
|
77
79
|
- lib/pixelart/version.rb
|
78
80
|
homepage: https://github.com/cryptocopycats/mooncats
|