pixelart 0.1.2 → 0.1.3
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/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
|