pixelart 1.3.6 → 1.3.7
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/README.md +13 -10
- data/Rakefile +3 -3
- data/lib/pixelart/base.rb +6 -0
- data/lib/pixelart/composite.rb +1 -1
- data/lib/pixelart/convert.rb +7 -4
- data/lib/pixelart/image.rb +34 -13
- data/lib/pixelart/invert.rb +40 -0
- data/lib/pixelart/orc721/generator.rb +51 -0
- data/lib/pixelart/sketch.rb +69 -14
- data/lib/pixelart/version.rb +1 -1
- metadata +10 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 931c4aa26d5a0594b4aec85f532d16e93d3dd505f4d2f9729b24e3fd45c662c4
|
4
|
+
data.tar.gz: 5dc8936fc9a0f76b05cf4209ad69ebeba87f25bd3c0290cad59e961760aa5782
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3189094ecb75f30d1ccd52bafc83b6ece3319b0b5c4f769ab02110212b5674adc59a816dc2abfa8be3d9a6a344bd253471677d5802391325b681987eb9d5ece0
|
7
|
+
data.tar.gz: a1e6e2ea6c25ac1ed7f2542ff8039a8ac1b5232001539611a151302959563e623d879e9c6590aa4cc1468d7716eb7ffaa8faeeed9360589570664a94f512aa48
|
data/Manifest.txt
CHANGED
@@ -10,8 +10,10 @@ lib/pixelart/composite.rb
|
|
10
10
|
lib/pixelart/convert.rb
|
11
11
|
lib/pixelart/generator.rb
|
12
12
|
lib/pixelart/image.rb
|
13
|
+
lib/pixelart/invert.rb
|
13
14
|
lib/pixelart/led.rb
|
14
15
|
lib/pixelart/misc.rb
|
16
|
+
lib/pixelart/orc721/generator.rb
|
15
17
|
lib/pixelart/pixelator.rb
|
16
18
|
lib/pixelart/sample.rb
|
17
19
|
lib/pixelart/silhouette.rb
|
data/README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# Pixel Art
|
2
2
|
|
3
|
-
pixelart -
|
3
|
+
pixelart - yes, you can! generate your own pixel art images (off-blockchain) using any design (in ascii text) in any colors; incl. 2x/4x/8x zoom for bigger sizes
|
4
4
|
|
5
5
|
|
6
|
-
* home :: [github.com/
|
7
|
-
* bugs :: [github.com/
|
6
|
+
* home :: [github.com/learnpixelart/pixelart](https://github.com/learnpixelart/pixelart)
|
7
|
+
* bugs :: [github.com/learnpixelart/pixelart/issues](https://github.com/learnpixelart/pixelart/issues)
|
8
8
|
* gem :: [rubygems.org/gems/pixelart](https://rubygems.org/gems/pixelart)
|
9
9
|
* rdoc :: [rubydoc.info/gems/pixelart](http://rubydoc.info/gems/pixelart)
|
10
10
|
|
@@ -71,8 +71,8 @@ img3x.save( './i/mooncat_white-3x.png' )
|
|
71
71
|
|
72
72
|
Voila!
|
73
73
|
|
74
|
-

|
75
|
+

|
76
76
|
|
77
77
|
|
78
78
|
|
@@ -100,8 +100,8 @@ img3x.save( './i/mooncat_black-3x.png' )
|
|
100
100
|
|
101
101
|
Voila! Black is the new White!
|
102
102
|
|
103
|
-

|
104
|
+

|
105
105
|
|
106
106
|
|
107
107
|
|
@@ -227,8 +227,8 @@ img5x.save( './i/vader5x.png' )
|
|
227
227
|
|
228
228
|
Voila!
|
229
229
|
|
230
|
-

|
231
|
+

|
232
232
|
|
233
233
|
|
234
234
|
|
@@ -291,6 +291,9 @@ Use it as you please with no restrictions whatsoever.
|
|
291
291
|
|
292
292
|
|
293
293
|
|
294
|
+
|
294
295
|
## Questions? Comments?
|
295
296
|
|
296
|
-
Post them
|
297
|
+
Post them over at the [Help & Support](https://github.com/geraldb/help) page. Thanks.
|
298
|
+
|
299
|
+
|
data/Rakefile
CHANGED
@@ -5,13 +5,13 @@ Hoe.spec 'pixelart' do
|
|
5
5
|
|
6
6
|
self.version = Pixelart::VERSION
|
7
7
|
|
8
|
-
self.summary = "pixelart -
|
8
|
+
self.summary = "pixelart - yes, you can! generate your own pixel art images (off-blockchain) using any design (in ascii text) in any colors; incl. 2x/4x/8x zoom for bigger sizes"
|
9
9
|
self.description = summary
|
10
10
|
|
11
|
-
self.urls = { home: 'https://github.com/
|
11
|
+
self.urls = { home: 'https://github.com/learnpixelart/pixelart' }
|
12
12
|
|
13
13
|
self.author = 'Gerald Bauer'
|
14
|
-
self.email = '
|
14
|
+
self.email = 'gerald.bauer@gmail.com'
|
15
15
|
|
16
16
|
# switch extension to .markdown for gihub formatting
|
17
17
|
self.readme_file = 'README.md'
|
data/lib/pixelart/base.rb
CHANGED
@@ -42,6 +42,7 @@ require 'pixelart/led'
|
|
42
42
|
require 'pixelart/sketch'
|
43
43
|
require 'pixelart/transparent'
|
44
44
|
require 'pixelart/silhouette'
|
45
|
+
require 'pixelart/invert'
|
45
46
|
require 'pixelart/ukraine'
|
46
47
|
|
47
48
|
|
@@ -69,4 +70,9 @@ require 'pixelart/convert'
|
|
69
70
|
|
70
71
|
|
71
72
|
|
73
|
+
####
|
74
|
+
# add orc-721 - why? why not?
|
75
|
+
require 'pixelart/orc721/generator'
|
76
|
+
|
77
|
+
|
72
78
|
puts Pixelart.banner # say hello
|
data/lib/pixelart/composite.rb
CHANGED
@@ -10,7 +10,7 @@ class ImageComposite < Image # check: (re)name to Collage, Sheet, Sprites, or s
|
|
10
10
|
def self.read( path, width: TILE_WIDTH, height: TILE_WIDTH ) ## convenience helper
|
11
11
|
img = ChunkyPNG::Image.from_file( path )
|
12
12
|
new( img, width: width,
|
13
|
-
height:
|
13
|
+
height: height )
|
14
14
|
end
|
15
15
|
|
16
16
|
|
data/lib/pixelart/convert.rb
CHANGED
@@ -36,15 +36,18 @@ def self.convert( dir, from: 'jpg',
|
|
36
36
|
system( cmd )
|
37
37
|
|
38
38
|
if from == 'gif'
|
39
|
-
##
|
39
|
+
## check for multi-images for gif
|
40
40
|
## save image-0.png to image.png
|
41
41
|
path0 = "#{outdir}/#{basename}-0.#{to}"
|
42
42
|
path = "#{outdir}/#{basename}.#{to}"
|
43
43
|
|
44
|
-
|
44
|
+
## note: image-0.png only exists (gets generated) for multi-images
|
45
|
+
if File.exist?( path0 )
|
46
|
+
puts " saving #{path0} to #{path}..."
|
45
47
|
|
46
|
-
|
47
|
-
|
48
|
+
blob = File.open( path0, 'rb' ) { |f| f.read }
|
49
|
+
File.open( path, 'wb' ) { |f| f.write( blob ) }
|
50
|
+
end
|
48
51
|
end
|
49
52
|
end
|
50
53
|
end
|
data/lib/pixelart/image.rb
CHANGED
@@ -51,7 +51,9 @@ CHARS = '.@xo^~%*+=:' ## todo/check: rename to default chars or such? why? w
|
|
51
51
|
|
52
52
|
## todo/check: support default chars encoding auto-of-the-box always
|
53
53
|
## or require user-defined chars to be passed in - why? why not?
|
54
|
-
def self.parse( pixels, colors:,
|
54
|
+
def self.parse( pixels, colors:,
|
55
|
+
background: Color::TRANSPARENT,
|
56
|
+
chars: CHARS )
|
55
57
|
has_keys = colors.is_a?(Hash) ## check if passed-in user-defined keys (via hash table)?
|
56
58
|
|
57
59
|
colors = parse_colors( colors )
|
@@ -60,6 +62,8 @@ def self.parse( pixels, colors:, chars: CHARS )
|
|
60
62
|
width = pixels.reduce(1) {|width,row| row.size > width ? row.size : width }
|
61
63
|
height = pixels.size
|
62
64
|
|
65
|
+
background = Color.parse( background ) unless background.is_a?( Integer )
|
66
|
+
|
63
67
|
img = new( width, height )
|
64
68
|
|
65
69
|
pixels.each_with_index do |row,y|
|
@@ -77,7 +81,13 @@ def self.parse( pixels, colors:, chars: CHARS )
|
|
77
81
|
end
|
78
82
|
end
|
79
83
|
|
80
|
-
|
84
|
+
|
85
|
+
img[x,y] = if background && background != Color::TRANSPARENT &&
|
86
|
+
pixel == Color::TRANSPARENT
|
87
|
+
background ## note: auto-fill transparent with background color
|
88
|
+
else
|
89
|
+
pixel
|
90
|
+
end
|
81
91
|
end # each row
|
82
92
|
end # each data
|
83
93
|
|
@@ -311,17 +321,28 @@ def image() @img; end
|
|
311
321
|
######
|
312
322
|
# helpers
|
313
323
|
def self.parse_pixels( pixels )
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
324
|
+
if pixels.is_a?( Array ) ## assume array of string (lines)
|
325
|
+
data = []
|
326
|
+
pixels.each do |line|
|
327
|
+
## convert (string) line into indidual chars
|
328
|
+
data << line.each_char.reduce( [] ) { |mem, c| mem << c; mem }
|
329
|
+
end
|
330
|
+
data
|
331
|
+
else ## assume it's a (multi-line) string (with newlines)
|
332
|
+
## assert and throw ArgumentError if not? - why? why not?
|
333
|
+
data = []
|
334
|
+
pixels.each_line do |line|
|
335
|
+
line = line.strip
|
336
|
+
next if line.start_with?( '#' ) || line.empty? ## note: allow comments and empty lines
|
337
|
+
|
338
|
+
## note: allow multiple spaces or tabs
|
339
|
+
## to separate pixel codes
|
340
|
+
## e.g. o o o o o o o o o o o o dg lg w w lg w lg lg dg dg w w lg dg o o o o o o o o o o o
|
341
|
+
## or
|
342
|
+
data << line.split( /[ \t]+/)
|
343
|
+
end
|
344
|
+
data
|
345
|
+
end
|
325
346
|
end
|
326
347
|
|
327
348
|
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Pixelart
|
2
|
+
|
3
|
+
|
4
|
+
## todo/check:
|
5
|
+
## use a different name for invert
|
6
|
+
## - why not - negate ???
|
7
|
+
|
8
|
+
|
9
|
+
class Image
|
10
|
+
## note: invert will only invert r/g/b - and NOT the a(lpha) channel
|
11
|
+
## the a(lpha) channel get passed on as is (1:1)
|
12
|
+
def invert
|
13
|
+
img = Image.new( @img.width, @img.height )
|
14
|
+
|
15
|
+
@img.width.times do |x|
|
16
|
+
@img.height.times do |y|
|
17
|
+
pixel = @img[x,y]
|
18
|
+
|
19
|
+
## note: xor (^) with 0 returns the original value unmodified.
|
20
|
+
## xor (^) with 0xff flips the bits.
|
21
|
+
## that is we are flipping/inverting r, g and b.
|
22
|
+
## and keep the a(lpha) channel as is.
|
23
|
+
|
24
|
+
## hack - why? why not?
|
25
|
+
## if transparent e.g. 0x0 than keep as is
|
26
|
+
## do not use 0xffffff00 - makes a difference?
|
27
|
+
|
28
|
+
img[x,y] = if pixel == Color::TRANSPARENT # transparent (0)
|
29
|
+
Color::TRANSPARENT
|
30
|
+
else
|
31
|
+
pixel ^ 0xffffff00
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
img
|
36
|
+
end
|
37
|
+
|
38
|
+
end # class Image
|
39
|
+
|
40
|
+
end # module Pixelart
|
@@ -0,0 +1,51 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Orc721
|
4
|
+
class Generator
|
5
|
+
###################
|
6
|
+
## convenience setup helper(s)
|
7
|
+
def self.read( path, width: 24, height: 24 )
|
8
|
+
new( Pixelart::ImageComposite.read( path,
|
9
|
+
width: width,
|
10
|
+
height: height ))
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
def initialize( spritesheet )
|
15
|
+
### todo: check for composite image type? - why? why not?
|
16
|
+
@spritesheet = spritesheet
|
17
|
+
end
|
18
|
+
|
19
|
+
def _parse( spec )
|
20
|
+
## for delimiter allow for now: - why? why not?
|
21
|
+
## (multiple) space ( )
|
22
|
+
## command or semicolon
|
23
|
+
spec.strip.split( %r{[ ,;/_-]+} ).map {|v| v.to_i(10) }
|
24
|
+
end
|
25
|
+
|
26
|
+
def parse( spec )
|
27
|
+
## convenience helper
|
28
|
+
## parses g spec in various (delimited) formats
|
29
|
+
g = _parse( spec )
|
30
|
+
generate( *g )
|
31
|
+
end
|
32
|
+
|
33
|
+
def generate( *attributes )
|
34
|
+
img = Pixelart::Image.new( width, height )
|
35
|
+
attributes.each do |num|
|
36
|
+
img.compose!( @spritesheet[ num ] )
|
37
|
+
end
|
38
|
+
img
|
39
|
+
end
|
40
|
+
alias_method :g, :generate
|
41
|
+
|
42
|
+
def width() @spritesheet.tile_width; end
|
43
|
+
def height() @spritesheet.tile_height; end
|
44
|
+
def count() @spritesheet.count; end
|
45
|
+
end # class Generator
|
46
|
+
end # module Orc721
|
47
|
+
|
48
|
+
|
49
|
+
######
|
50
|
+
## add convenience aliases - why? why not?
|
51
|
+
ORC721 = Orc721
|
data/lib/pixelart/sketch.rb
CHANGED
@@ -3,14 +3,24 @@ module Pixelart
|
|
3
3
|
|
4
4
|
|
5
5
|
class Image
|
6
|
-
def sketch( sketch=4, line: 1
|
6
|
+
def sketch( sketch=4, line: 1,
|
7
|
+
line_color: Color::BLACK,
|
8
|
+
colorize: false )
|
9
|
+
## todo/check: rename color option to fill or such - why? why not?
|
10
|
+
|
7
11
|
# todo: line - find a better name eg. line_strenght/width or such?
|
8
12
|
width = @img.width*sketch + (@img.width+1)*line
|
9
13
|
height = @img.height*sketch + (@img.height+1)*line
|
10
14
|
|
11
15
|
puts " #{width}x#{height}"
|
12
16
|
|
13
|
-
|
17
|
+
|
18
|
+
background_color = colorize ? Color::TRANSPARENT
|
19
|
+
: Color::WHITE
|
20
|
+
|
21
|
+
|
22
|
+
img = Image.new( width, height, background_color )
|
23
|
+
|
14
24
|
|
15
25
|
@img.width.times do |x|
|
16
26
|
@img.height.times do |y|
|
@@ -19,12 +29,13 @@ class Image
|
|
19
29
|
## get surrounding pixels - if "out-of-bound" use transparent (0)
|
20
30
|
left = x == 0 ? Color::TRANSPARENT : @img[x-1,y]
|
21
31
|
top = y == 0 ? Color::TRANSPARENT : @img[x ,y-1]
|
32
|
+
diag = (x==0 || y== 0) ? Color::TRANSPARENT : @img[x-1,y-1]
|
22
33
|
|
23
34
|
if pixel != left ## draw vertical line
|
24
|
-
|
25
|
-
|
26
|
-
img[ x*sketch + line*x +
|
27
|
-
|
35
|
+
line.times do |n|
|
36
|
+
(sketch+line*2).times do |m|
|
37
|
+
img[ x*sketch + line*x + n,
|
38
|
+
m + y*sketch + line*y] = line_color
|
28
39
|
end
|
29
40
|
end
|
30
41
|
end
|
@@ -33,7 +44,7 @@ class Image
|
|
33
44
|
(sketch+line*2).times do |n|
|
34
45
|
line.times do |m|
|
35
46
|
img[n + x*sketch + line*x,
|
36
|
-
y*sketch + line*y + m] =
|
47
|
+
y*sketch + line*y + m] = line_color
|
37
48
|
end
|
38
49
|
end
|
39
50
|
end
|
@@ -42,10 +53,10 @@ class Image
|
|
42
53
|
## check special edge case for x and y to add "finish-up" right and bottom line
|
43
54
|
if x == @img.width-1 && pixel != Color::TRANSPARENT
|
44
55
|
## draw vertical line
|
45
|
-
|
46
|
-
line.times do |m|
|
47
|
-
img[ (x+1)*sketch + line*(x+1) +
|
48
|
-
|
56
|
+
line.times do |n|
|
57
|
+
(sketch+line*2).times do |m|
|
58
|
+
img[ (x+1)*sketch + line*(x+1) + n,
|
59
|
+
m + y*sketch + line*y] = line_color
|
49
60
|
end
|
50
61
|
end
|
51
62
|
end
|
@@ -55,12 +66,56 @@ class Image
|
|
55
66
|
(sketch+line*2).times do |n|
|
56
67
|
line.times do |m|
|
57
68
|
img[n + x*sketch + line*x,
|
58
|
-
(y+1)*sketch + line*(y+1) + m] =
|
69
|
+
(y+1)*sketch + line*(y+1) + m] = line_color
|
59
70
|
end
|
60
71
|
end
|
61
72
|
end
|
62
|
-
|
63
|
-
|
73
|
+
|
74
|
+
###############
|
75
|
+
## fill with pixel color if color true (default is false)
|
76
|
+
if colorize && pixel != Color::TRANSPARENT
|
77
|
+
sketch.times do |n|
|
78
|
+
sketch.times do |m|
|
79
|
+
img[x*sketch + line*(x+1) + n,
|
80
|
+
y*sketch + line*(y+1) + m] = pixel
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
if pixel == left ## draw vertical line
|
85
|
+
line.times do |n|
|
86
|
+
sketch.times do |m|
|
87
|
+
img[x*sketch + line*x + n,
|
88
|
+
y*sketch + line*(y+1) + m] = pixel
|
89
|
+
# (y%2==0 ? 0x0000ffff : 0x000088ff ) # (for debugging)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
if pixel == top ## draw horizontal line
|
95
|
+
sketch.times do |n|
|
96
|
+
line.times do |m|
|
97
|
+
img[x*sketch + line*(x+1) + n,
|
98
|
+
y*sketch + line*y + m] = pixel
|
99
|
+
# (x%2==0 ? 0xff0000ff : 0x880000ff ) # (for debugging)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
## check all four same color (00,01)
|
105
|
+
## (10, x) - bingo!
|
106
|
+
if pixel == left && pixel == top && pixel == diag
|
107
|
+
line.times do |n|
|
108
|
+
line.times do |m|
|
109
|
+
img[x*sketch + line*x + n,
|
110
|
+
y*sketch + line*y + m] = pixel
|
111
|
+
# 0xffff00ff # (for debugging)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end # colorize?
|
116
|
+
|
117
|
+
end # height.times
|
118
|
+
end # width.times
|
64
119
|
|
65
120
|
img
|
66
121
|
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: 1.3.
|
4
|
+
version: 1.3.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-06-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cocos
|
@@ -100,9 +100,9 @@ dependencies:
|
|
100
100
|
- - "~>"
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: '3.23'
|
103
|
-
description: pixelart -
|
104
|
-
(in ascii text) in any colors; incl. 2x/4x/8x zoom for bigger sizes
|
105
|
-
email:
|
103
|
+
description: pixelart - yes, you can! generate your own pixel art images (off-blockchain)
|
104
|
+
using any design (in ascii text) in any colors; incl. 2x/4x/8x zoom for bigger sizes
|
105
|
+
email: gerald.bauer@gmail.com
|
106
106
|
executables: []
|
107
107
|
extensions: []
|
108
108
|
extra_rdoc_files:
|
@@ -122,8 +122,10 @@ files:
|
|
122
122
|
- lib/pixelart/convert.rb
|
123
123
|
- lib/pixelart/generator.rb
|
124
124
|
- lib/pixelart/image.rb
|
125
|
+
- lib/pixelart/invert.rb
|
125
126
|
- lib/pixelart/led.rb
|
126
127
|
- lib/pixelart/misc.rb
|
128
|
+
- lib/pixelart/orc721/generator.rb
|
127
129
|
- lib/pixelart/pixelator.rb
|
128
130
|
- lib/pixelart/sample.rb
|
129
131
|
- lib/pixelart/silhouette.rb
|
@@ -134,7 +136,7 @@ files:
|
|
134
136
|
- lib/pixelart/ukraine.rb
|
135
137
|
- lib/pixelart/vector.rb
|
136
138
|
- lib/pixelart/version.rb
|
137
|
-
homepage: https://github.com/
|
139
|
+
homepage: https://github.com/learnpixelart/pixelart
|
138
140
|
licenses:
|
139
141
|
- Public Domain
|
140
142
|
metadata: {}
|
@@ -158,6 +160,6 @@ requirements: []
|
|
158
160
|
rubygems_version: 3.3.7
|
159
161
|
signing_key:
|
160
162
|
specification_version: 4
|
161
|
-
summary: pixelart -
|
162
|
-
ascii text) in any colors; incl. 2x/4x/8x zoom for bigger sizes
|
163
|
+
summary: pixelart - yes, you can! generate your own pixel art images (off-blockchain)
|
164
|
+
using any design (in ascii text) in any colors; incl. 2x/4x/8x zoom for bigger sizes
|
163
165
|
test_files: []
|