peter_pan 1.0.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 +7 -0
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +167 -0
- data/Rakefile +1 -0
- data/examples/dream_cheeky.rb +39 -0
- data/examples/to_screen.rb +34 -0
- data/fonts/transpo.yml +757 -0
- data/lib/peter_pan.rb +246 -0
- data/peter_pan.gemspec +23 -0
- metadata +79 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 692af1cd2a9e3475428ba3ea1a3b432ad130b762
|
4
|
+
data.tar.gz: 187e9b546dec65a4fbd4d380aaeb3dfde279d396
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 767b95aafa0fea9912984b6265fe34fee6157da042dcbf8bd16c370b3b4a239e3d5d712219590c53f9fe7e07a53c5e3699122139e1b048549451378c810201ba
|
7
|
+
data.tar.gz: 99af0967d7d0b82ce6f339b87e19644007db8dd88236a7784c9c83c52f082e690e362884f392e2ff33461552fd91bc71272ab1d03edf6d17176c03807cbba183
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Matthew Nielsen
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,167 @@
|
|
1
|
+
## Peter Pan - a Ruby gem providing a virtual screen buffer with viewport panning. For the Dream Cheeky LED sign and others.
|
2
|
+
|
3
|
+
Peter Pan gives you a large, virtual text frame buffer and a virtual
|
4
|
+
viewport you can move around over it. You can plot points or draw text in the
|
5
|
+
buffer and scroll the viewport over it to simulate scrolling text or scrolling
|
6
|
+
graphics.
|
7
|
+
|
8
|
+
It was written to make it easier to get text on the Dream Cheeky LED sign, but
|
9
|
+
it'll work for any thing that that accepts a formatted text string as input.
|
10
|
+
|
11
|
+
The dream-cheeky-led gem (https://github.com/Aupajo/dream-cheeky-led) is not a
|
12
|
+
dependency, but it can be used in conjunction with this gem to get scrolling
|
13
|
+
text and graphics on your Dream Cheeky LED sign.
|
14
|
+
|
15
|
+
This gem uses the "transpo" font from Lewis Clayton's dcled_ruby project
|
16
|
+
(https://github.com/Lewis-Clayton/dcled_ruby).
|
17
|
+
|
18
|
+
## Installation
|
19
|
+
|
20
|
+
Install normally:
|
21
|
+
|
22
|
+
$ gem install peter_pan
|
23
|
+
|
24
|
+
And then require it normally:
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
require 'peter_pan'
|
28
|
+
```
|
29
|
+
|
30
|
+
To write to a Dream Cheeky LED sign using `examples/dream_cheeky.rb`, also
|
31
|
+
install the dream-cheeky-led gem:
|
32
|
+
|
33
|
+
$ gem install dream-cheeky-led --pre
|
34
|
+
|
35
|
+
## Examples
|
36
|
+
|
37
|
+
There are basic examples in the `examples/` directory:
|
38
|
+
|
39
|
+
dream_cheeky.rb: write to a USB Dream Cheeky Sign
|
40
|
+
to_screen.rb: write to the screen
|
41
|
+
|
42
|
+
These examples show the basic concepts of drawing text to the buffer and
|
43
|
+
panning the viewport over the buffer.
|
44
|
+
|
45
|
+
## Usage
|
46
|
+
|
47
|
+
### Dots
|
48
|
+
|
49
|
+
Print dots to the buffer, render the viewport in two places illustrating how
|
50
|
+
it only shows the area of the newport:
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
> require 'peter_pan'
|
54
|
+
> p = PeterPan.new
|
55
|
+
> p.plot(1,1)
|
56
|
+
> p.plot(3,3)
|
57
|
+
> p.plot(8,8)
|
58
|
+
> p.plot(21,2)
|
59
|
+
> p.plot(25,4)
|
60
|
+
> puts p.pretty_print_buffer
|
61
|
+
+--------------------------+
|
62
|
+
| |
|
63
|
+
| * |
|
64
|
+
| * |
|
65
|
+
| * |
|
66
|
+
| *|
|
67
|
+
| |
|
68
|
+
| |
|
69
|
+
| |
|
70
|
+
| |
|
71
|
+
+--------------------------+
|
72
|
+
> puts p.pretty_print_viewport(0,0)
|
73
|
+
+---------------------+
|
74
|
+
| |
|
75
|
+
| * |
|
76
|
+
| |
|
77
|
+
| * |
|
78
|
+
| |
|
79
|
+
| |
|
80
|
+
| |
|
81
|
+
+---------------------+
|
82
|
+
> puts p.pretty_print_viewport(5,0)
|
83
|
+
+---------------------+
|
84
|
+
| |
|
85
|
+
| |
|
86
|
+
| * |
|
87
|
+
| |
|
88
|
+
| *|
|
89
|
+
| |
|
90
|
+
| |
|
91
|
+
+---------------------+
|
92
|
+
```
|
93
|
+
|
94
|
+
### Text
|
95
|
+
|
96
|
+
Print text to the buffer and render the viewport over a portion.
|
97
|
+
|
98
|
+
```ruby
|
99
|
+
> require 'peter_pan'
|
100
|
+
> p = PeterPan.new
|
101
|
+
> p.write(0, 0, "Hello.")
|
102
|
+
> puts p.pretty_print_buffer
|
103
|
+
+-----------------------------------+
|
104
|
+
|* * ** ** |
|
105
|
+
|* * * * |
|
106
|
+
|* * *** * * *** |
|
107
|
+
|***** * * * * * * |
|
108
|
+
|* * ***** * * * * |
|
109
|
+
|* * * * * * * ** |
|
110
|
+
|* * *** *** *** *** ** |
|
111
|
+
+-----------------------------------+
|
112
|
+
> puts p.pretty_print_viewport(5,0)
|
113
|
+
+---------------------+
|
114
|
+
| ** ** |
|
115
|
+
| * * |
|
116
|
+
| *** * * *|
|
117
|
+
| * * * * * |
|
118
|
+
| ***** * * * |
|
119
|
+
| * * * * |
|
120
|
+
| *** *** *** *|
|
121
|
+
+---------------------+
|
122
|
+
```
|
123
|
+
|
124
|
+
### Change viewport size
|
125
|
+
|
126
|
+
The viewport dimensions default to 21x7, the size of the Dream Cheeky LED,
|
127
|
+
but can be changed by passing arguments to the initializer.
|
128
|
+
|
129
|
+
```ruby
|
130
|
+
> p = PeterPan.new( viewport_width: 5, viewport_height: 5 )
|
131
|
+
> p.write(0, 0, "Hello.")
|
132
|
+
> puts p.pretty_print_viewport(5,0)
|
133
|
+
+-----+
|
134
|
+
| |
|
135
|
+
| |
|
136
|
+
| ***|
|
137
|
+
| * |
|
138
|
+
| ****|
|
139
|
+
+-----+
|
140
|
+
```
|
141
|
+
|
142
|
+
### Printing without ascii borders
|
143
|
+
|
144
|
+
To print the buffer and viewport without the ascii-art borders, replace
|
145
|
+
`pretty_print_viewport` with 'show_viewport` using the same arguments:
|
146
|
+
|
147
|
+
```ruby
|
148
|
+
> p = PeterPan.new( viewport_width: 5, viewport_height: 5 )
|
149
|
+
> p.write(0, 0, "Hello.")
|
150
|
+
> puts p.show_viewport(5,0)
|
151
|
+
|
152
|
+
|
153
|
+
***
|
154
|
+
*
|
155
|
+
****
|
156
|
+
```
|
157
|
+
|
158
|
+
All other `pretty_*` methods have `show_*` counterparts that will return data
|
159
|
+
without the enclosing border.
|
160
|
+
|
161
|
+
### Animated panning the viewport
|
162
|
+
|
163
|
+
Please see the examples in `examples/`.
|
164
|
+
|
165
|
+
## Documentation
|
166
|
+
|
167
|
+
TODO: add link to RDOC here.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Example of using peter_pan with the Dream Cheeky LED display via the
|
4
|
+
# dream-cheeky-led gem (https://github.com/Aupajo/dream-cheeky-led).
|
5
|
+
require 'peter_pan'
|
6
|
+
require 'dream-cheeky/led'
|
7
|
+
|
8
|
+
p = PeterPan.new
|
9
|
+
|
10
|
+
lines = [
|
11
|
+
"One",
|
12
|
+
"Two",
|
13
|
+
"Three",
|
14
|
+
"Four",
|
15
|
+
"Five"
|
16
|
+
]
|
17
|
+
|
18
|
+
lines.each_with_index do |line, i|
|
19
|
+
p.write(0, (i*p.font["height"])+(1*i), line)
|
20
|
+
end
|
21
|
+
|
22
|
+
puts p.pretty_print_buffer
|
23
|
+
|
24
|
+
message_board = DreamCheeky::LEDMessageBoard.first
|
25
|
+
|
26
|
+
loop do
|
27
|
+
coords = [
|
28
|
+
[0,0],
|
29
|
+
[0, p.buffer_height-p.font["height"]],
|
30
|
+
[p.buffer_width-p.viewport_width, p.buffer_height-p.font["height"]],
|
31
|
+
[p.buffer_width-p.viewport_width, 0],
|
32
|
+
[0,0]
|
33
|
+
]
|
34
|
+
|
35
|
+
p.path_viewport(coords).each do |vp|
|
36
|
+
message_board.draw(vp)
|
37
|
+
sleep(0.05)
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Draws words to the virtual butter and then pans the viewport around it.
|
4
|
+
require 'peter_pan'
|
5
|
+
|
6
|
+
p = PeterPan.new
|
7
|
+
|
8
|
+
lines = [
|
9
|
+
"One",
|
10
|
+
"Two",
|
11
|
+
"Three"
|
12
|
+
]
|
13
|
+
|
14
|
+
lines.each_with_index do |line, i|
|
15
|
+
p.write(0, (i*p.font["height"])+(1*i), line)
|
16
|
+
end
|
17
|
+
|
18
|
+
loop do
|
19
|
+
coords = [
|
20
|
+
[0,0],
|
21
|
+
[0, p.buffer_height-p.font["height"]],
|
22
|
+
[p.buffer_width-p.viewport_width, p.buffer_height-p.font["height"]],
|
23
|
+
[p.buffer_width-p.viewport_width, 0],
|
24
|
+
[0,0]
|
25
|
+
]
|
26
|
+
|
27
|
+
p.pretty_pan_viewport(coords).each do |vp|
|
28
|
+
print "\e[2J\e[f" # clear screen
|
29
|
+
puts p.pretty_print_buffer # print whole buffer
|
30
|
+
puts vp # print current viewport frame
|
31
|
+
sleep(0.1)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
data/fonts/transpo.yml
ADDED
@@ -0,0 +1,757 @@
|
|
1
|
+
name: 'transpo'
|
2
|
+
version: '0.0.1'
|
3
|
+
width: 5
|
4
|
+
height: 7
|
5
|
+
characters:
|
6
|
+
' ':
|
7
|
+
- '.....'
|
8
|
+
- '.....'
|
9
|
+
- '.....'
|
10
|
+
- '.....'
|
11
|
+
- '.....'
|
12
|
+
- '.....'
|
13
|
+
- '.....'
|
14
|
+
'!':
|
15
|
+
- '..*..'
|
16
|
+
- '..*..'
|
17
|
+
- '..*..'
|
18
|
+
- '..*..'
|
19
|
+
- '.....'
|
20
|
+
- '..*..'
|
21
|
+
- '..*..'
|
22
|
+
'"':
|
23
|
+
- '.*.*.'
|
24
|
+
- '.*.*.'
|
25
|
+
- '.*.*.'
|
26
|
+
- '.....'
|
27
|
+
- '.....'
|
28
|
+
- '.....'
|
29
|
+
- '.....'
|
30
|
+
'#':
|
31
|
+
- '.*.*.'
|
32
|
+
- '.*.*.'
|
33
|
+
- '*****'
|
34
|
+
- '.*.*.'
|
35
|
+
- '*****'
|
36
|
+
- '.*.*.'
|
37
|
+
- '.*.*.'
|
38
|
+
'$':
|
39
|
+
- '.*...'
|
40
|
+
- '.*.*.'
|
41
|
+
- '.***.'
|
42
|
+
- '...*.'
|
43
|
+
- '...*.'
|
44
|
+
- '.....'
|
45
|
+
- '.....'
|
46
|
+
'%':
|
47
|
+
- '**...'
|
48
|
+
- '**..*'
|
49
|
+
- '...*.'
|
50
|
+
- '..*..'
|
51
|
+
- '.*...'
|
52
|
+
- '*..**'
|
53
|
+
- '...**'
|
54
|
+
'&':
|
55
|
+
- '.*...'
|
56
|
+
- '*.*..'
|
57
|
+
- '*.*..'
|
58
|
+
- '.*...'
|
59
|
+
- '*.*.*'
|
60
|
+
- '*..*.'
|
61
|
+
- '.**.*'
|
62
|
+
"'":
|
63
|
+
- '..*..'
|
64
|
+
- '..*..'
|
65
|
+
- '..*..'
|
66
|
+
- '.....'
|
67
|
+
- '.....'
|
68
|
+
- '.....'
|
69
|
+
- '.....'
|
70
|
+
'(':
|
71
|
+
- '...*.'
|
72
|
+
- '..*..'
|
73
|
+
- '.*...'
|
74
|
+
- '.*...'
|
75
|
+
- '.*...'
|
76
|
+
- '..*..'
|
77
|
+
- '...*.'
|
78
|
+
')':
|
79
|
+
- '.*...'
|
80
|
+
- '..*..'
|
81
|
+
- '...*.'
|
82
|
+
- '...*.'
|
83
|
+
- '...*.'
|
84
|
+
- '..*..'
|
85
|
+
- '.*...'
|
86
|
+
'*':
|
87
|
+
- '.....'
|
88
|
+
- '..*..'
|
89
|
+
- '*.*.*'
|
90
|
+
- '.***.'
|
91
|
+
- '*.*.*'
|
92
|
+
- '..*..'
|
93
|
+
- '.....'
|
94
|
+
'+':
|
95
|
+
- '.....'
|
96
|
+
- '..*..'
|
97
|
+
- '..*..'
|
98
|
+
- '*****'
|
99
|
+
- '..*..'
|
100
|
+
- '..*..'
|
101
|
+
- '.....'
|
102
|
+
',':
|
103
|
+
- '.....'
|
104
|
+
- '.....'
|
105
|
+
- '.....'
|
106
|
+
- '.....'
|
107
|
+
- '.**..'
|
108
|
+
- '..*..'
|
109
|
+
- '.*...'
|
110
|
+
'-':
|
111
|
+
- '.....'
|
112
|
+
- '.....'
|
113
|
+
- '.....'
|
114
|
+
- '*****'
|
115
|
+
- '.....'
|
116
|
+
- '.....'
|
117
|
+
- '.....'
|
118
|
+
'.':
|
119
|
+
- '.....'
|
120
|
+
- '.....'
|
121
|
+
- '.....'
|
122
|
+
- '.....'
|
123
|
+
- '.....'
|
124
|
+
- '.**..'
|
125
|
+
- '.**..'
|
126
|
+
'/':
|
127
|
+
- '.....'
|
128
|
+
- '....*'
|
129
|
+
- '...*.'
|
130
|
+
- '..*..'
|
131
|
+
- '.*...'
|
132
|
+
- '*....'
|
133
|
+
- '.....'
|
134
|
+
'0':
|
135
|
+
- '.***.'
|
136
|
+
- '*...*'
|
137
|
+
- '*..**'
|
138
|
+
- '*.*.*'
|
139
|
+
- '**..*'
|
140
|
+
- '*...*'
|
141
|
+
- '.***.'
|
142
|
+
'1':
|
143
|
+
- '..*..'
|
144
|
+
- '.**..'
|
145
|
+
- '..*..'
|
146
|
+
- '..*..'
|
147
|
+
- '..*..'
|
148
|
+
- '..*..'
|
149
|
+
- '.***.'
|
150
|
+
'2':
|
151
|
+
- '.***.'
|
152
|
+
- '*...*'
|
153
|
+
- '....*'
|
154
|
+
- '...*.'
|
155
|
+
- '..*..'
|
156
|
+
- '.*...'
|
157
|
+
- '*****'
|
158
|
+
'3':
|
159
|
+
- '*****'
|
160
|
+
- '...*.'
|
161
|
+
- '..*..'
|
162
|
+
- '...*.'
|
163
|
+
- '....*'
|
164
|
+
- '*...*'
|
165
|
+
- '.***.'
|
166
|
+
'4':
|
167
|
+
- '...*.'
|
168
|
+
- '..**.'
|
169
|
+
- '.*.*.'
|
170
|
+
- '*..*.'
|
171
|
+
- '*****'
|
172
|
+
- '...*.'
|
173
|
+
- '...*.'
|
174
|
+
'5':
|
175
|
+
- '*****'
|
176
|
+
- '*....'
|
177
|
+
- '****.'
|
178
|
+
- '....*'
|
179
|
+
- '....*'
|
180
|
+
- '*...*'
|
181
|
+
- '.***.'
|
182
|
+
'6':
|
183
|
+
- '..**.'
|
184
|
+
- '.*...'
|
185
|
+
- '*....'
|
186
|
+
- '****.'
|
187
|
+
- '*...*'
|
188
|
+
- '*...*'
|
189
|
+
- '.***.'
|
190
|
+
'7':
|
191
|
+
- '*****'
|
192
|
+
- '....*'
|
193
|
+
- '...*.'
|
194
|
+
- '..*..'
|
195
|
+
- '.*...'
|
196
|
+
- '.*...'
|
197
|
+
- '.*...'
|
198
|
+
'8':
|
199
|
+
- '.***.'
|
200
|
+
- '*...*'
|
201
|
+
- '*...*'
|
202
|
+
- '.***.'
|
203
|
+
- '*...*'
|
204
|
+
- '*...*'
|
205
|
+
- '.***.'
|
206
|
+
'9':
|
207
|
+
- '.***.'
|
208
|
+
- '*...*'
|
209
|
+
- '*...*'
|
210
|
+
- '.****'
|
211
|
+
- '....*'
|
212
|
+
- '...*.'
|
213
|
+
- '.**..'
|
214
|
+
':':
|
215
|
+
- '.....'
|
216
|
+
- '.**..'
|
217
|
+
- '.**..'
|
218
|
+
- '.....'
|
219
|
+
- '.**..'
|
220
|
+
- '.**..'
|
221
|
+
- '.....'
|
222
|
+
';':
|
223
|
+
- '.....'
|
224
|
+
- '.**..'
|
225
|
+
- '.**..'
|
226
|
+
- '.....'
|
227
|
+
- '.**..'
|
228
|
+
- '..*..'
|
229
|
+
- '.*...'
|
230
|
+
'<':
|
231
|
+
- '...*.'
|
232
|
+
- '..*..'
|
233
|
+
- '.*...'
|
234
|
+
- '*....'
|
235
|
+
- '.*...'
|
236
|
+
- '..*..'
|
237
|
+
- '...*.'
|
238
|
+
'=':
|
239
|
+
- '.....'
|
240
|
+
- '.....'
|
241
|
+
- '*****'
|
242
|
+
- '.....'
|
243
|
+
- '*****'
|
244
|
+
- '.....'
|
245
|
+
- '.....'
|
246
|
+
'>':
|
247
|
+
- '.*...'
|
248
|
+
- '..*..'
|
249
|
+
- '...*.'
|
250
|
+
- '....*'
|
251
|
+
- '...*.'
|
252
|
+
- '..*..'
|
253
|
+
- '.*...'
|
254
|
+
'?':
|
255
|
+
- '.***.'
|
256
|
+
- '*...*'
|
257
|
+
- '....*'
|
258
|
+
- '...*.'
|
259
|
+
- '..*..'
|
260
|
+
- '.....'
|
261
|
+
- '..*..'
|
262
|
+
'@':
|
263
|
+
- '.***.'
|
264
|
+
- '*...*'
|
265
|
+
- '*.*.*'
|
266
|
+
- '*.***'
|
267
|
+
- '*.*..'
|
268
|
+
- '*....'
|
269
|
+
- '.****'
|
270
|
+
'A':
|
271
|
+
- '.***.'
|
272
|
+
- '*...*'
|
273
|
+
- '*...*'
|
274
|
+
- '*****'
|
275
|
+
- '*...*'
|
276
|
+
- '*...*'
|
277
|
+
- '*...*'
|
278
|
+
'B':
|
279
|
+
- '****.'
|
280
|
+
- '*...*'
|
281
|
+
- '*...*'
|
282
|
+
- '****.'
|
283
|
+
- '*...*'
|
284
|
+
- '*...*'
|
285
|
+
- '****.'
|
286
|
+
'C':
|
287
|
+
- '.***.'
|
288
|
+
- '*...*'
|
289
|
+
- '*....'
|
290
|
+
- '*....'
|
291
|
+
- '*....'
|
292
|
+
- '*...*'
|
293
|
+
- '.***.'
|
294
|
+
'D':
|
295
|
+
- '****.'
|
296
|
+
- '*...*'
|
297
|
+
- '*...*'
|
298
|
+
- '*...*'
|
299
|
+
- '*...*'
|
300
|
+
- '*...*'
|
301
|
+
- '****.'
|
302
|
+
'E':
|
303
|
+
- '*****'
|
304
|
+
- '*....'
|
305
|
+
- '*....'
|
306
|
+
- '****.'
|
307
|
+
- '*....'
|
308
|
+
- '*....'
|
309
|
+
- '*****'
|
310
|
+
'F':
|
311
|
+
- '*****'
|
312
|
+
- '*....'
|
313
|
+
- '*....'
|
314
|
+
- '****.'
|
315
|
+
- '*....'
|
316
|
+
- '*....'
|
317
|
+
- '*....'
|
318
|
+
'G':
|
319
|
+
- '.***.'
|
320
|
+
- '*...*'
|
321
|
+
- '*....'
|
322
|
+
- '*.***'
|
323
|
+
- '*...*'
|
324
|
+
- '*...*'
|
325
|
+
- '.****'
|
326
|
+
'H':
|
327
|
+
- '*...*'
|
328
|
+
- '*...*'
|
329
|
+
- '*...*'
|
330
|
+
- '*****'
|
331
|
+
- '*...*'
|
332
|
+
- '*...*'
|
333
|
+
- '*...*'
|
334
|
+
'I':
|
335
|
+
- '.***.'
|
336
|
+
- '..*..'
|
337
|
+
- '..*..'
|
338
|
+
- '..*..'
|
339
|
+
- '..*..'
|
340
|
+
- '..*..'
|
341
|
+
- '.***.'
|
342
|
+
'J':
|
343
|
+
- '..***'
|
344
|
+
- '...*.'
|
345
|
+
- '...*.'
|
346
|
+
- '...*.'
|
347
|
+
- '...*.'
|
348
|
+
- '*..*.'
|
349
|
+
- '.**..'
|
350
|
+
'K':
|
351
|
+
- '*...*'
|
352
|
+
- '*..*.'
|
353
|
+
- '*.*..'
|
354
|
+
- '**...'
|
355
|
+
- '*.*..'
|
356
|
+
- '*..*.'
|
357
|
+
- '*...*'
|
358
|
+
'L':
|
359
|
+
- '*....'
|
360
|
+
- '*....'
|
361
|
+
- '*....'
|
362
|
+
- '*....'
|
363
|
+
- '*....'
|
364
|
+
- '*....'
|
365
|
+
- '*****'
|
366
|
+
'M':
|
367
|
+
- '*...*'
|
368
|
+
- '**.**'
|
369
|
+
- '*.*.*'
|
370
|
+
- '*.*.*'
|
371
|
+
- '*...*'
|
372
|
+
- '*...*'
|
373
|
+
- '*...*'
|
374
|
+
'N':
|
375
|
+
- '*...*'
|
376
|
+
- '*...*'
|
377
|
+
- '**..*'
|
378
|
+
- '*.*.*'
|
379
|
+
- '*..**'
|
380
|
+
- '*...*'
|
381
|
+
- '*...*'
|
382
|
+
'O':
|
383
|
+
- '.***.'
|
384
|
+
- '*...*'
|
385
|
+
- '*...*'
|
386
|
+
- '*...*'
|
387
|
+
- '*...*'
|
388
|
+
- '*...*'
|
389
|
+
- '.***.'
|
390
|
+
'P':
|
391
|
+
- '****.'
|
392
|
+
- '*...*'
|
393
|
+
- '*...*'
|
394
|
+
- '****.'
|
395
|
+
- '*....'
|
396
|
+
- '*....'
|
397
|
+
- '*....'
|
398
|
+
'Q':
|
399
|
+
- '.***.'
|
400
|
+
- '*...*'
|
401
|
+
- '*...*'
|
402
|
+
- '*...*'
|
403
|
+
- '*.*.*'
|
404
|
+
- '*..*.'
|
405
|
+
- '.**.*'
|
406
|
+
'R':
|
407
|
+
- '****.'
|
408
|
+
- '*...*'
|
409
|
+
- '*...*'
|
410
|
+
- '****.'
|
411
|
+
- '*.*..'
|
412
|
+
- '*..*.'
|
413
|
+
- '*...*'
|
414
|
+
'S':
|
415
|
+
- '.****'
|
416
|
+
- '*....'
|
417
|
+
- '*....'
|
418
|
+
- '.***.'
|
419
|
+
- '....*'
|
420
|
+
- '....*'
|
421
|
+
- '****.'
|
422
|
+
'T':
|
423
|
+
- '*****'
|
424
|
+
- '..*..'
|
425
|
+
- '..*..'
|
426
|
+
- '..*..'
|
427
|
+
- '..*..'
|
428
|
+
- '..*..'
|
429
|
+
- '..*..'
|
430
|
+
'U':
|
431
|
+
- '*...*'
|
432
|
+
- '*...*'
|
433
|
+
- '*...*'
|
434
|
+
- '*...*'
|
435
|
+
- '*...*'
|
436
|
+
- '*...*'
|
437
|
+
- '.***.'
|
438
|
+
'V':
|
439
|
+
- '*...*'
|
440
|
+
- '*...*'
|
441
|
+
- '*...*'
|
442
|
+
- '*...*'
|
443
|
+
- '.*.*.'
|
444
|
+
- '.*.*.'
|
445
|
+
- '..*..'
|
446
|
+
'W':
|
447
|
+
- '*...*'
|
448
|
+
- '*...*'
|
449
|
+
- '*...*'
|
450
|
+
- '*...*'
|
451
|
+
- '*.*.*'
|
452
|
+
- '*.*.*'
|
453
|
+
- '.*.*.'
|
454
|
+
'X':
|
455
|
+
- '*...*'
|
456
|
+
- '*...*'
|
457
|
+
- '.*.*.'
|
458
|
+
- '..*..'
|
459
|
+
- '.*.*.'
|
460
|
+
- '*...*'
|
461
|
+
- '*...*'
|
462
|
+
'Y':
|
463
|
+
- '*...*'
|
464
|
+
- '*...*'
|
465
|
+
- '*...*'
|
466
|
+
- '.*.*.'
|
467
|
+
- '..*..'
|
468
|
+
- '..*..'
|
469
|
+
- '..*..'
|
470
|
+
'Z':
|
471
|
+
- '*****'
|
472
|
+
- '....*'
|
473
|
+
- '...*.'
|
474
|
+
- '..*..'
|
475
|
+
- '.*...'
|
476
|
+
- '*....'
|
477
|
+
- '*****'
|
478
|
+
'[':
|
479
|
+
- '..**.'
|
480
|
+
- '.*..*'
|
481
|
+
- '*...*'
|
482
|
+
- '*****'
|
483
|
+
- '*...*'
|
484
|
+
- '*..*.'
|
485
|
+
- '.**..'
|
486
|
+
'\':
|
487
|
+
- '.....'
|
488
|
+
- '*....'
|
489
|
+
- '.*...'
|
490
|
+
- '..*..'
|
491
|
+
- '...*.'
|
492
|
+
- '....*'
|
493
|
+
- '.....'
|
494
|
+
']':
|
495
|
+
- '**...'
|
496
|
+
- '..*..'
|
497
|
+
- '..*..'
|
498
|
+
- '...*.'
|
499
|
+
- '..*..'
|
500
|
+
- '..*..'
|
501
|
+
- '**...'
|
502
|
+
'^':
|
503
|
+
- '..*..'
|
504
|
+
- '.*.*.'
|
505
|
+
- '*...*'
|
506
|
+
- '.....'
|
507
|
+
- '.....'
|
508
|
+
- '.....'
|
509
|
+
- '.....'
|
510
|
+
'_':
|
511
|
+
- '.....'
|
512
|
+
- '.....'
|
513
|
+
- '.....'
|
514
|
+
- '.....'
|
515
|
+
- '.....'
|
516
|
+
- '.....'
|
517
|
+
- '*****'
|
518
|
+
'`':
|
519
|
+
- '..*..'
|
520
|
+
- '..*..'
|
521
|
+
- '...*.'
|
522
|
+
- '.....'
|
523
|
+
- '.....'
|
524
|
+
- '.....'
|
525
|
+
- '.....'
|
526
|
+
'a':
|
527
|
+
- '.....'
|
528
|
+
- '.....'
|
529
|
+
- '.***.'
|
530
|
+
- '....*'
|
531
|
+
- '.****'
|
532
|
+
- '*...*'
|
533
|
+
- '.****'
|
534
|
+
'b':
|
535
|
+
- '*....'
|
536
|
+
- '*....'
|
537
|
+
- '*.**.'
|
538
|
+
- '**..*'
|
539
|
+
- '*...*'
|
540
|
+
- '*...*'
|
541
|
+
- '****.'
|
542
|
+
'c':
|
543
|
+
- '.....'
|
544
|
+
- '.....'
|
545
|
+
- '.***.'
|
546
|
+
- '*....'
|
547
|
+
- '*....'
|
548
|
+
- '*...*'
|
549
|
+
- '.***.'
|
550
|
+
'd':
|
551
|
+
- '....*'
|
552
|
+
- '....*'
|
553
|
+
- '.**.*'
|
554
|
+
- '*..**'
|
555
|
+
- '*...*'
|
556
|
+
- '*...*'
|
557
|
+
- '.****'
|
558
|
+
'e':
|
559
|
+
- '.....'
|
560
|
+
- '.....'
|
561
|
+
- '.***.'
|
562
|
+
- '*...*'
|
563
|
+
- '*****'
|
564
|
+
- '*....'
|
565
|
+
- '.***.'
|
566
|
+
'f':
|
567
|
+
- '..**.'
|
568
|
+
- '.*..*'
|
569
|
+
- '.*...'
|
570
|
+
- '***..'
|
571
|
+
- '.*...'
|
572
|
+
- '.*...'
|
573
|
+
- '.*...'
|
574
|
+
'g':
|
575
|
+
- '.....'
|
576
|
+
- '.****'
|
577
|
+
- '*...*'
|
578
|
+
- '*...*'
|
579
|
+
- '.****'
|
580
|
+
- '....*'
|
581
|
+
- '.***.'
|
582
|
+
'h':
|
583
|
+
- '*....'
|
584
|
+
- '*....'
|
585
|
+
- '*.**.'
|
586
|
+
- '**..*'
|
587
|
+
- '*...*'
|
588
|
+
- '*...*'
|
589
|
+
- '*...*'
|
590
|
+
'i':
|
591
|
+
- '..*..'
|
592
|
+
- '.....'
|
593
|
+
- '.**..'
|
594
|
+
- '..*..'
|
595
|
+
- '..*..'
|
596
|
+
- '..*..'
|
597
|
+
- '.***.'
|
598
|
+
'j':
|
599
|
+
- '...*.'
|
600
|
+
- '.....'
|
601
|
+
- '..**.'
|
602
|
+
- '...*.'
|
603
|
+
- '...*.'
|
604
|
+
- '*..*.'
|
605
|
+
- '.**..'
|
606
|
+
'k':
|
607
|
+
- '.*...'
|
608
|
+
- '.*...'
|
609
|
+
- '.*..*'
|
610
|
+
- '.*.*.'
|
611
|
+
- '.**..'
|
612
|
+
- '.*.*.'
|
613
|
+
- '.*..*'
|
614
|
+
'l':
|
615
|
+
- '.**..'
|
616
|
+
- '..*..'
|
617
|
+
- '..*..'
|
618
|
+
- '..*..'
|
619
|
+
- '..*..'
|
620
|
+
- '..*..'
|
621
|
+
- '.***.'
|
622
|
+
'm':
|
623
|
+
- '.....'
|
624
|
+
- '.....'
|
625
|
+
- '**.*.'
|
626
|
+
- '*.*.*'
|
627
|
+
- '*.*.*'
|
628
|
+
- '*...*'
|
629
|
+
- '*...*'
|
630
|
+
'n':
|
631
|
+
- '.....'
|
632
|
+
- '.....'
|
633
|
+
- '*.**.'
|
634
|
+
- '**..*'
|
635
|
+
- '*...*'
|
636
|
+
- '*...*'
|
637
|
+
- '*...*'
|
638
|
+
'o':
|
639
|
+
- '.....'
|
640
|
+
- '.....'
|
641
|
+
- '.***.'
|
642
|
+
- '*...*'
|
643
|
+
- '*...*'
|
644
|
+
- '*...*'
|
645
|
+
- '.***.'
|
646
|
+
'p':
|
647
|
+
- '.....'
|
648
|
+
- '.....'
|
649
|
+
- '****.'
|
650
|
+
- '*...*'
|
651
|
+
- '****.'
|
652
|
+
- '*....'
|
653
|
+
- '*....'
|
654
|
+
'q':
|
655
|
+
- '.....'
|
656
|
+
- '.....'
|
657
|
+
- '.**.*'
|
658
|
+
- '*..**'
|
659
|
+
- '.****'
|
660
|
+
- '....*'
|
661
|
+
- '....*'
|
662
|
+
'r':
|
663
|
+
- '.....'
|
664
|
+
- '.....'
|
665
|
+
- '*.**.'
|
666
|
+
- '**..*'
|
667
|
+
- '*....'
|
668
|
+
- '*....'
|
669
|
+
- '*....'
|
670
|
+
's':
|
671
|
+
- '.....'
|
672
|
+
- '.....'
|
673
|
+
- '.***.'
|
674
|
+
- '*....'
|
675
|
+
- '.***.'
|
676
|
+
- '....*'
|
677
|
+
- '****.'
|
678
|
+
't':
|
679
|
+
- '.*...'
|
680
|
+
- '.*...'
|
681
|
+
- '***..'
|
682
|
+
- '.*...'
|
683
|
+
- '.*...'
|
684
|
+
- '.*..*'
|
685
|
+
- '..**.'
|
686
|
+
'u':
|
687
|
+
- '.....'
|
688
|
+
- '.....'
|
689
|
+
- '*...*'
|
690
|
+
- '*...*'
|
691
|
+
- '*...*'
|
692
|
+
- '*..**'
|
693
|
+
- '.**.*'
|
694
|
+
'v':
|
695
|
+
- '.....'
|
696
|
+
- '.....'
|
697
|
+
- '*...*'
|
698
|
+
- '*...*'
|
699
|
+
- '*...*'
|
700
|
+
- '.*.*.'
|
701
|
+
- '..*..'
|
702
|
+
'w':
|
703
|
+
- '.....'
|
704
|
+
- '.....'
|
705
|
+
- '*...*'
|
706
|
+
- '*...*'
|
707
|
+
- '*.*.*'
|
708
|
+
- '*.*.*'
|
709
|
+
- '.*.*.'
|
710
|
+
'x':
|
711
|
+
- '.....'
|
712
|
+
- '.....'
|
713
|
+
- '*...*'
|
714
|
+
- '.*.*.'
|
715
|
+
- '..*..'
|
716
|
+
- '.*.*.'
|
717
|
+
- '*...*'
|
718
|
+
'y':
|
719
|
+
- '.....'
|
720
|
+
- '.....'
|
721
|
+
- '*...*'
|
722
|
+
- '*...*'
|
723
|
+
- '.****'
|
724
|
+
- '....*'
|
725
|
+
- '.***.'
|
726
|
+
'z':
|
727
|
+
- '.....'
|
728
|
+
- '.....'
|
729
|
+
- '*****'
|
730
|
+
- '...*.'
|
731
|
+
- '..*..'
|
732
|
+
- '.*...'
|
733
|
+
- '*****'
|
734
|
+
'{':
|
735
|
+
- '...**'
|
736
|
+
- '..*..'
|
737
|
+
- '..*..'
|
738
|
+
- '.*...'
|
739
|
+
- '..*..'
|
740
|
+
- '..*..'
|
741
|
+
- '...**'
|
742
|
+
'|':
|
743
|
+
- '..*..'
|
744
|
+
- '..*..'
|
745
|
+
- '..*..'
|
746
|
+
- '..*..'
|
747
|
+
- '..*..'
|
748
|
+
- '..*..'
|
749
|
+
- '..*..'
|
750
|
+
'~':
|
751
|
+
- '.....'
|
752
|
+
- '.*...'
|
753
|
+
- '*.*.*'
|
754
|
+
- '...*.'
|
755
|
+
- '.....'
|
756
|
+
- '.....'
|
757
|
+
- '.....'
|
data/lib/peter_pan.rb
ADDED
@@ -0,0 +1,246 @@
|
|
1
|
+
# Peter Pan - a Ruby gem providing a virtual screen buffer with viewport
|
2
|
+
# panning. For the Dream Cheeky LED sign and others.
|
3
|
+
#
|
4
|
+
# Home page at https://github.com/xunker/peter_pan
|
5
|
+
#
|
6
|
+
# Author:: Matthew Nielsen (mailto:xunker@pyxidis.org)
|
7
|
+
# Copyright:: Copyright (c) 2014
|
8
|
+
# License:: MIT
|
9
|
+
|
10
|
+
require 'yaml'
|
11
|
+
class PeterPan
|
12
|
+
attr_reader :viewport_width, :viewport_height, :empty_point_character
|
13
|
+
|
14
|
+
VERSION = "1.0.0"
|
15
|
+
|
16
|
+
# Possible Options:
|
17
|
+
#
|
18
|
+
# * :viewport_width - Viewport width, integer, default 21
|
19
|
+
# * :viewport_height - Viewport height, integer, default 7
|
20
|
+
# * :empty_point_character - the char of an empty cell (default ' ')
|
21
|
+
# * :buffer_width - Buffer width, integer, default 0
|
22
|
+
# * :buffer_height - Buffer height, integer, default 0
|
23
|
+
#
|
24
|
+
# NOTE: The buffer will automatically expand dimensionally to hold
|
25
|
+
# any point that is #plot()'ed or text written with #write().
|
26
|
+
def initialize(opts={})
|
27
|
+
@viewport_width = (opts[:viewport_width] || 21).to_i # x
|
28
|
+
@viewport_height = (opts[:viewport_height] || 7).to_i # y
|
29
|
+
@font_name = 'transpo' # only font for now
|
30
|
+
@empty_point_character = (opts[:empty_point_character] || ' ')
|
31
|
+
buffer_changed!(false)
|
32
|
+
clear_buffer!(
|
33
|
+
:width => (opts[:buffer_width] || 0),
|
34
|
+
:height => (opts[:buffer_height] || 0)
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Draw a point in the virtual buffer.
|
39
|
+
# The virtual buffer will be enlarged automatically.
|
40
|
+
def plot(x, y, value='*')
|
41
|
+
1.upto(y+1) do |i|
|
42
|
+
@buffer[i-1] ||= []
|
43
|
+
1.upto(x+1) do |ii|
|
44
|
+
@buffer[i-1][ii-1] ||= @empty_point_character
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
@buffer[y][x] = value.to_s.slice(0,1)
|
49
|
+
|
50
|
+
buffer_changed!
|
51
|
+
end
|
52
|
+
|
53
|
+
# Same as #show_buffer but with an ascii-art border around it.
|
54
|
+
def pretty_print_buffer
|
55
|
+
wrap_frame_with_border(show_buffer)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Return the current buffer as a string delimited by "\n" characters
|
59
|
+
def show_buffer
|
60
|
+
normalize_buffer_width
|
61
|
+
|
62
|
+
@buffer.map{|bx| "#{bx.join}\n" }.join
|
63
|
+
end
|
64
|
+
|
65
|
+
# Return an integer of the width of the buffer at it's widest point.
|
66
|
+
def buffer_width
|
67
|
+
if !@buffer_width || buffer_changed?
|
68
|
+
@buffer_width = 0
|
69
|
+
@buffer.each do |by|
|
70
|
+
@buffer_width = by.size if by.size > @buffer_width
|
71
|
+
end
|
72
|
+
end
|
73
|
+
@buffer_width
|
74
|
+
end
|
75
|
+
|
76
|
+
# Return an integer of the height of the buffer at it tallest point
|
77
|
+
def buffer_height
|
78
|
+
@buffer.size
|
79
|
+
end
|
80
|
+
|
81
|
+
# Show a viewport area of the larger buffer.
|
82
|
+
# width and height of the viewport can be set in the object
|
83
|
+
# initialization for defaults, or manually here.
|
84
|
+
# Returns a string delimited by "\n" characters.
|
85
|
+
def show_viewport(x,y,x2=@viewport_width,y2=@viewport_height)
|
86
|
+
normalize_buffer_width
|
87
|
+
|
88
|
+
y.upto((y2-1)+y).map do |i|
|
89
|
+
buffer_row = @buffer[i] || @viewport_width.times.map{@empty_point_character}
|
90
|
+
sprintf("%-#{x2}s", buffer_row[x..((x2-1)+x)].join) + "\n"
|
91
|
+
end.join
|
92
|
+
end
|
93
|
+
|
94
|
+
# Same as #show_viewort, but with an ascii-art border around it.
|
95
|
+
def pretty_print_viewport(x,y,x2=@viewport_width,y2=@viewport_height)
|
96
|
+
wrap_frame_with_border(show_viewport(x,y,x2,y2))
|
97
|
+
end
|
98
|
+
|
99
|
+
# Move the viewport over the buffer from x1/y1 to x2/y2.
|
100
|
+
# Returns an array of strings. Each string is a frame of the pan path
|
101
|
+
# of the kind returned by #show_viewport.
|
102
|
+
def pan_viewport(x1, y1, x2, y2)
|
103
|
+
calculate_integral_points(x1, y1, x2, y2).map do |px, py|
|
104
|
+
show_viewport(px, py)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# Same as #pan_viewport, but with an ascii-art border around each frame.
|
109
|
+
def pretty_pan_viewport(x1, y1, x2, y2)
|
110
|
+
pan_viewport(x1, y1, x2, y2).map{|vp| wrap_frame_with_border(vp) }
|
111
|
+
end
|
112
|
+
|
113
|
+
# Like pan_viewport, but multiple pairs of coordinates can be passed.
|
114
|
+
# The first pair will be used as the start and the viewport will be
|
115
|
+
# panned from coordinate-pair to coordinate-pair.
|
116
|
+
# It expects to be passed an array-like list of coordinate pairs.
|
117
|
+
# It returns an array of string representing the frames of the pathing.
|
118
|
+
def path_viewport(*coordinates)
|
119
|
+
coordinates.flatten!
|
120
|
+
start_x = coordinates.shift
|
121
|
+
start_y = coordinates.shift
|
122
|
+
coordinates.flatten.each_slice(2).map do |x,y|
|
123
|
+
pan = pan_viewport(start_x, start_y, x, y)
|
124
|
+
start_x = x
|
125
|
+
start_y = y
|
126
|
+
pan
|
127
|
+
end.flatten
|
128
|
+
end
|
129
|
+
|
130
|
+
# Same as #path_viewport, but with an ascii-art border around each frame.
|
131
|
+
def pretty_pan_viewport(*coordinates)
|
132
|
+
path_viewport(coordinates).map{|vp| wrap_frame_with_border(vp) }
|
133
|
+
end
|
134
|
+
|
135
|
+
# Draw a text sprint to the buffer at given coordinates.
|
136
|
+
# * sprite is an ARRAY of string representing the image.
|
137
|
+
def plot_sprite(sprite, x, y)
|
138
|
+
sprite.each_with_index do |line, line_y|
|
139
|
+
line.split('').each_with_index do |c, char_x|
|
140
|
+
plot(char_x + x, line_y + y, c)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# Write a string to the buffer at the given coordinates.
|
146
|
+
def write(x, y, message)
|
147
|
+
letter_x = x
|
148
|
+
message.split('').each do |c|
|
149
|
+
char = font['characters'][c].map{|l|l.gsub('.', @empty_point_character)}
|
150
|
+
plot_sprite(char, letter_x, y)
|
151
|
+
letter_x = letter_x + font['width'] + 1
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
# clears everything out of the buffer.
|
156
|
+
# By default, sets the buffer dimensions to 0x0. Optionally, you can pass
|
157
|
+
# :width and :height args and the buffer dimentions will be set accordingly.
|
158
|
+
# By default the buffer will be filled with space character, but you can
|
159
|
+
# set the char to be used by passing :clear_with
|
160
|
+
def clear_buffer!(opts={})
|
161
|
+
opts = { :width => 0, :height => 0, :clear_with => @empty_point_character }.merge(opts)
|
162
|
+
@buffer = [[]]
|
163
|
+
opts[:height].times do |y|
|
164
|
+
@buffer[y] = []
|
165
|
+
opts[:width].times do |x|
|
166
|
+
@buffer[y][x] = opts[:clear_with].to_s.slice(0,1)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
buffer_changed!
|
170
|
+
end
|
171
|
+
|
172
|
+
# returns a data structure representing the current font used by #write.
|
173
|
+
def font
|
174
|
+
@font ||= YAML.load(File.new("./fonts/#{@font_name}.yml").read)
|
175
|
+
end
|
176
|
+
|
177
|
+
private
|
178
|
+
|
179
|
+
def buffer_changed!(val = true)
|
180
|
+
@buffer_changed = val
|
181
|
+
end
|
182
|
+
|
183
|
+
def buffer_changed?
|
184
|
+
!!@buffer_changed
|
185
|
+
end
|
186
|
+
|
187
|
+
def normalize_buffer_width
|
188
|
+
return unless buffer_changed?
|
189
|
+
|
190
|
+
@buffer.each do |by|
|
191
|
+
if by.size < buffer_width
|
192
|
+
(by.size-1).upto(buffer_width-1) do |i|
|
193
|
+
by[i] = @empty_point_character
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
buffer_changed!
|
199
|
+
end
|
200
|
+
|
201
|
+
|
202
|
+
def wrap_frame_with_border(content)
|
203
|
+
content_width = content.index("\n")
|
204
|
+
str = "+#{'-' * content_width}+\n"
|
205
|
+
vp = content
|
206
|
+
str << vp.gsub(/^/, '|').gsub(/$/, '|').gsub(/^\|$/, '')
|
207
|
+
str << "+#{'-' * content_width}+\n"
|
208
|
+
str
|
209
|
+
end
|
210
|
+
|
211
|
+
# Why yes, actually, I did fail Jr. High math. Why do you ask?
|
212
|
+
def calculate_integral_points(x1, y1, x2, y2)
|
213
|
+
x_integrals = calculate_integrals(x1, x2)
|
214
|
+
y_integrals = calculate_integrals(y1, y2)
|
215
|
+
|
216
|
+
(x_integrals, y_integrals) = standardize_integral_lengths(x_integrals, y_integrals)
|
217
|
+
|
218
|
+
x_integrals.zip(y_integrals)
|
219
|
+
end
|
220
|
+
|
221
|
+
def standardize_integral_lengths(one, two)
|
222
|
+
while one.length < two.length
|
223
|
+
one.unshift(one.first)
|
224
|
+
end
|
225
|
+
|
226
|
+
while two.length < one.length
|
227
|
+
two.unshift(two.first)
|
228
|
+
end
|
229
|
+
|
230
|
+
[one, two]
|
231
|
+
end
|
232
|
+
|
233
|
+
def calculate_integrals(starting, ending)
|
234
|
+
integrals = []
|
235
|
+
if starting < ending
|
236
|
+
starting.upto(ending) do |i|
|
237
|
+
integrals << i
|
238
|
+
end
|
239
|
+
else
|
240
|
+
starting.downto(ending) do |i|
|
241
|
+
integrals << i
|
242
|
+
end
|
243
|
+
end
|
244
|
+
integrals
|
245
|
+
end
|
246
|
+
end
|
data/peter_pan.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'peter_pan'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "peter_pan"
|
8
|
+
spec.version = PeterPan::VERSION
|
9
|
+
spec.authors = ["Matthew Nielsen"]
|
10
|
+
spec.email = ["xunker@pyxidis.org"]
|
11
|
+
spec.description = %q{A virtual screen buffer with viewport panning. For the Dream Cheeky LED sign and others.}
|
12
|
+
spec.summary = %q{A virtual screen buffer with viewport panning. For the Dream Cheeky LED sign and others.}
|
13
|
+
spec.homepage = "https://github.com/xunker/peter_pan"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: peter_pan
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Matthew Nielsen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2014-02-05 00:00:00 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
prerelease: false
|
17
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: "1.3"
|
22
|
+
type: :development
|
23
|
+
version_requirements: *id001
|
24
|
+
- !ruby/object:Gem::Dependency
|
25
|
+
name: rake
|
26
|
+
prerelease: false
|
27
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- &id003
|
30
|
+
- ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: "0"
|
33
|
+
type: :development
|
34
|
+
version_requirements: *id002
|
35
|
+
description: A virtual screen buffer with viewport panning. For the Dream Cheeky LED sign and others.
|
36
|
+
email:
|
37
|
+
- xunker@pyxidis.org
|
38
|
+
executables: []
|
39
|
+
|
40
|
+
extensions: []
|
41
|
+
|
42
|
+
extra_rdoc_files: []
|
43
|
+
|
44
|
+
files:
|
45
|
+
- .gitignore
|
46
|
+
- Gemfile
|
47
|
+
- LICENSE.txt
|
48
|
+
- README.md
|
49
|
+
- Rakefile
|
50
|
+
- examples/dream_cheeky.rb
|
51
|
+
- examples/to_screen.rb
|
52
|
+
- fonts/transpo.yml
|
53
|
+
- lib/peter_pan.rb
|
54
|
+
- peter_pan.gemspec
|
55
|
+
homepage: https://github.com/xunker/peter_pan
|
56
|
+
licenses:
|
57
|
+
- MIT
|
58
|
+
metadata: {}
|
59
|
+
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options: []
|
62
|
+
|
63
|
+
require_paths:
|
64
|
+
- lib
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- *id003
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- *id003
|
71
|
+
requirements: []
|
72
|
+
|
73
|
+
rubyforge_project:
|
74
|
+
rubygems_version: 2.0.13
|
75
|
+
signing_key:
|
76
|
+
specification_version: 4
|
77
|
+
summary: A virtual screen buffer with viewport panning. For the Dream Cheeky LED sign and others.
|
78
|
+
test_files: []
|
79
|
+
|