barby 0.6.2 → 0.6.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +107 -0
- data/lib/barby/barcode/bookland.rb +0 -1
- data/lib/barby/barcode/code_128.rb +11 -2
- data/lib/barby/barcode/code_25.rb +6 -3
- data/lib/barby/barcode/code_25_interleaved.rb +2 -2
- data/lib/barby/barcode/code_39.rb +2 -1
- data/lib/barby/barcode/data_matrix.rb +1 -1
- data/lib/barby/barcode/ean_13.rb +1 -1
- data/lib/barby/barcode/gs1_128.rb +5 -1
- data/lib/barby/barcode/qr_code.rb +1 -0
- data/lib/barby/outputter/cairo_outputter.rb +5 -0
- data/lib/barby/outputter/png_outputter.rb +5 -1
- data/lib/barby/outputter/prawn_outputter.rb +6 -1
- data/lib/barby/outputter/rmagick_outputter.rb +11 -6
- data/lib/barby/outputter/svg_outputter.rb +5 -0
- data/lib/barby/version.rb +1 -1
- metadata +6 -15
- data/README +0 -93
- data/lib/barby/outputter/point_matrix.rb +0 -211
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8062a4f8a077022c7b52a7fc23d73886bbdf9e96
|
4
|
+
data.tar.gz: 80ab18bc484c11d6044b5c7aa683dc65f316b359
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e99ce1411282a91273107da8b5ef1963baaa7b04c107132c33dedb463669d77172968dfc6d357c480ce633b7db79c24f62f49ff91de8bf9a9192d428c099c5b2
|
7
|
+
data.tar.gz: 0ff28cc5b9eac5a16bfe2eacde4b3dcd275d57840e28d3aeecdc3cf8d4a9189e97ed53efb5d2aa00676af355560016fdc9e211fab06db963a5f0af3868654c49
|
data/README.md
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
# Barby
|
2
|
+
Barby is a Ruby library that generates barcodes in a variety of symbologies.
|
3
|
+
|
4
|
+
Its functionality is split into _barcode_ and "_outputter_" objects:
|
5
|
+
* [`Barby::Barcode` objects] [symbologies] turn data into a binary representation for a given symbology.
|
6
|
+
* [`Barby::Outputter`] [outputters] then takes this representation and turns it into images, PDF, etc.
|
7
|
+
|
8
|
+
You can easily add a symbology without having to worry about graphical
|
9
|
+
representation. If it can be represented as the usual 1D or 2D matrix of
|
10
|
+
lines or squares, outputters will do that for you.
|
11
|
+
|
12
|
+
Likewise, you can easily add an outputter for a format that doesn't have one
|
13
|
+
yet, and it will work with all existing symbologies.
|
14
|
+
|
15
|
+
For more information, check out [the Barby wiki] [wiki].
|
16
|
+
|
17
|
+
### New require policy
|
18
|
+
|
19
|
+
Barcode symbologies are no longer required automatically, so you'll have to
|
20
|
+
require the ones you need.
|
21
|
+
|
22
|
+
If you need EAN-13, `require 'barby/barcode/ean_13'`. Full list of symbologies and filenames below.
|
23
|
+
|
24
|
+
## Example
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
require 'barby'
|
28
|
+
require 'barby/barcode/code_128'
|
29
|
+
require 'barby/outputter/ascii_outputter'
|
30
|
+
|
31
|
+
barcode = Barby::Code128B.new('BARBY')
|
32
|
+
|
33
|
+
puts barcode.to_ascii #Implicitly uses the AsciiOutputter
|
34
|
+
|
35
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
36
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
37
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
38
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
39
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
40
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
41
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
42
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
43
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
44
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
45
|
+
B A R B Y
|
46
|
+
```
|
47
|
+
|
48
|
+
## Supported symbologies
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
require 'barby/barcode/<filename>'
|
52
|
+
```
|
53
|
+
|
54
|
+
| Name | Filename | Dependencies |
|
55
|
+
| ----------------------------------- | --------------------- | ------------- |
|
56
|
+
| Code 25 | `code_25` | ─ |
|
57
|
+
| ├─ Interleaved | `code_25_interleaved` | ─ |
|
58
|
+
| └─ IATA | `code_25_iata` | ─ |
|
59
|
+
| Code 39 | `code_39` | ─ |
|
60
|
+
| └─ Extended | `code_39` | ─ |
|
61
|
+
| Code 93 | `code_93` | ─ |
|
62
|
+
| Code 128 (A, B, and C) | `code_128` | ─ |
|
63
|
+
| └─ GS1 128 | `gs1_128` | ─ |
|
64
|
+
| EAN-13 | `ean_13` | ─ |
|
65
|
+
| ├─ Bookland | `bookland` | ─ |
|
66
|
+
| └─ UPC-A | `ean_13` | ─ |
|
67
|
+
| EAN-8 | `ean_8` | ─ |
|
68
|
+
| UPC/EAN supplemental, 2 & 5 digits | `upc_supplemental` | ─ |
|
69
|
+
| QR Code | `qr_code` | `rqrcode` |
|
70
|
+
| DataMatrix (Semacode) | `data_matrix` | `semacode` |
|
71
|
+
| PDF417 | `pdf_417` | JRuby |
|
72
|
+
|
73
|
+
|
74
|
+
## Outputters
|
75
|
+
|
76
|
+
```ruby
|
77
|
+
require 'barby/outputter/<filename>_outputter'
|
78
|
+
```
|
79
|
+
|
80
|
+
| filename | dependencies |
|
81
|
+
| ----------- | ------------- |
|
82
|
+
| `ascii` | ─ |
|
83
|
+
| `cairo` | cairo |
|
84
|
+
| `html` | ─ |
|
85
|
+
| `pdfwriter` | ─ |
|
86
|
+
| `png` | chunky_png |
|
87
|
+
| `prawn` | prawn |
|
88
|
+
| `rmagick` | rmagick |
|
89
|
+
| `svg` | ─ |
|
90
|
+
|
91
|
+
### Formats supported by outputters
|
92
|
+
|
93
|
+
* Text (mostly for testing)
|
94
|
+
* PNG, JPEG, GIF
|
95
|
+
* PS, EPS
|
96
|
+
* SVG
|
97
|
+
* PDF
|
98
|
+
* HTML
|
99
|
+
|
100
|
+
---
|
101
|
+
|
102
|
+
For more information, check out [the Barby wiki] [wiki].
|
103
|
+
|
104
|
+
|
105
|
+
[wiki]: https://github.com/toretore/barby/wiki
|
106
|
+
[symbologies]: https://github.com/toretore/barby/wiki/Symbologies
|
107
|
+
[outputters]: https://github.com/toretore/barby/wiki/Outputters
|
@@ -18,6 +18,14 @@ module Barby
|
|
18
18
|
#As an example, here's one that starts out as type A and then switches to B and then C:
|
19
19
|
#
|
20
20
|
# Code128A.new("ABC123\306def\3074567")
|
21
|
+
#
|
22
|
+
#
|
23
|
+
#GS1-128/EAN-128/UCC-128
|
24
|
+
#
|
25
|
+
#To make a GS1-128 code, prefix the data with FNC1 and the Application Identifier:
|
26
|
+
#
|
27
|
+
# #AI=00, data=12345
|
28
|
+
# Code128.new("#{Code128::FNC1}0012345")
|
21
29
|
class Code128 < Barcode1D
|
22
30
|
|
23
31
|
FNC1 = "\xc1"
|
@@ -175,7 +183,7 @@ module Barby
|
|
175
183
|
|
176
184
|
|
177
185
|
def type=(type)
|
178
|
-
type.upcase
|
186
|
+
type = type.upcase
|
179
187
|
raise ArgumentError, 'type must be A, B or C' unless type =~ /^[ABC]$/
|
180
188
|
@type = type
|
181
189
|
end
|
@@ -230,7 +238,8 @@ module Barby
|
|
230
238
|
#there are no more extras, the barcode ends with that object.
|
231
239
|
#Most barcodes probably don't change charsets and don't have extras.
|
232
240
|
def extra
|
233
|
-
@extra
|
241
|
+
return @extra if defined?(@extra)
|
242
|
+
@extra = nil
|
234
243
|
end
|
235
244
|
|
236
245
|
#Set the extra for this barcode. The argument is a string starting with the
|
@@ -28,11 +28,14 @@ module Barby
|
|
28
28
|
9 => [N,W,N,W,N]
|
29
29
|
}
|
30
30
|
|
31
|
-
attr_accessor :
|
31
|
+
attr_accessor :include_checksum
|
32
|
+
attr_writer :narrow_width, :wide_width, :space_width
|
33
|
+
attr_reader :data
|
34
|
+
|
32
35
|
|
33
|
-
|
34
36
|
def initialize(data)
|
35
37
|
self.data = data
|
38
|
+
@narrow_width, @wide_width, @space_width = nil
|
36
39
|
end
|
37
40
|
|
38
41
|
|
@@ -105,7 +108,7 @@ module Barby
|
|
105
108
|
#Mod10
|
106
109
|
def checksum
|
107
110
|
evens, odds = even_and_odd_digits
|
108
|
-
sum = odds.inject(0){|
|
111
|
+
sum = odds.inject(0){|s,d| s + d } + evens.inject(0){|s,d| s + (d*3) }
|
109
112
|
sum %= 10
|
110
113
|
sum.zero? ? 0 : 10-sum
|
111
114
|
end
|
@@ -87,7 +87,8 @@ module Barby
|
|
87
87
|
START_ENCODING = [N,W,N,N,W,N,W,N,N] # *
|
88
88
|
STOP_ENCODING = [N,W,N,N,W,N,W,N,N] # *
|
89
89
|
|
90
|
-
attr_accessor :data, :
|
90
|
+
attr_accessor :data, :extended, :include_checksum
|
91
|
+
attr_writer :spacing, :narrow_width, :wide_width
|
91
92
|
|
92
93
|
# Do not surround "data" with the mandatory "*" as is this is done automically for you.
|
93
94
|
# So instead of passing "*123456*" as "data", just pass "123456".
|
data/lib/barby/barcode/ean_13.rb
CHANGED
@@ -3,18 +3,22 @@ require 'barby/barcode/code_128'
|
|
3
3
|
module Barby
|
4
4
|
|
5
5
|
|
6
|
+
#DEPRECATED - Use the Code128 class directly instead:
|
7
|
+
#
|
8
|
+
# Code128.new("#{Code128::FNC1}#{application_identifier}#{data}")
|
9
|
+
#
|
6
10
|
#AKA EAN-128, UCC-128
|
7
11
|
class GS1128 < Code128
|
8
12
|
|
9
13
|
attr_accessor :application_identifier
|
10
14
|
|
11
15
|
def initialize(data, type, ai)
|
16
|
+
warn "DEPRECATED: The GS1128 class has been deprecated, use Code128 directly instead (called from #{caller[0]})"
|
12
17
|
self.application_identifier = ai
|
13
18
|
super(data, type)
|
14
19
|
end
|
15
20
|
|
16
21
|
|
17
|
-
#TODO: Not sure this is entirely right
|
18
22
|
def data
|
19
23
|
FNC1+application_identifier+super
|
20
24
|
end
|
@@ -23,6 +23,11 @@ module Barby
|
|
23
23
|
attr_writer :x, :y, :xdim, :height, :margin
|
24
24
|
|
25
25
|
|
26
|
+
def initialize(*)
|
27
|
+
super
|
28
|
+
@x, @y, @xdim, @height, @margin = nil
|
29
|
+
end
|
30
|
+
|
26
31
|
#Render the barcode onto a Cairo context
|
27
32
|
def render_to_cairo_context(context, options={})
|
28
33
|
if context.respond_to?(:have_current_point?) and
|
@@ -10,8 +10,12 @@ module Barby
|
|
10
10
|
|
11
11
|
register :to_png, :to_image, :to_datastream
|
12
12
|
|
13
|
-
|
13
|
+
attr_writer :xdim, :ydim, :width, :height, :margin
|
14
14
|
|
15
|
+
def initialize(*)
|
16
|
+
super
|
17
|
+
@xdim, @height, @margin = nil
|
18
|
+
end
|
15
19
|
|
16
20
|
#Creates a PNG::Canvas object and renders the barcode on it
|
17
21
|
def to_image(opts={})
|
@@ -7,9 +7,14 @@ module Barby
|
|
7
7
|
|
8
8
|
register :to_pdf, :annotate_pdf
|
9
9
|
|
10
|
-
|
10
|
+
attr_writer :xdim, :ydim, :x, :y, :height, :margin, :unbleed
|
11
11
|
|
12
12
|
|
13
|
+
def initialize(*)
|
14
|
+
super
|
15
|
+
@xdim, @ydim, @x, @y, @height, @margin, @unbleed = nil
|
16
|
+
end
|
17
|
+
|
13
18
|
def to_pdf(opts={})
|
14
19
|
doc_opts = opts.delete(:document) || {}
|
15
20
|
doc_opts[:page_size] ||= 'A4'
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'barby/outputter'
|
2
|
-
require '
|
2
|
+
require 'rmagick'
|
3
3
|
|
4
4
|
module Barby
|
5
5
|
|
@@ -8,11 +8,16 @@ module Barby
|
|
8
8
|
#
|
9
9
|
#Registers the to_png, to_gif, to_jpg and to_image methods
|
10
10
|
class RmagickOutputter < Outputter
|
11
|
-
|
11
|
+
|
12
12
|
register :to_png, :to_gif, :to_jpg, :to_image
|
13
13
|
|
14
|
-
|
14
|
+
attr_writer :height, :xdim, :ydim, :margin
|
15
|
+
|
15
16
|
|
17
|
+
def initialize(*)
|
18
|
+
super
|
19
|
+
@height, @xdim, @ydim, @margin = nil
|
20
|
+
end
|
16
21
|
|
17
22
|
#Returns a string containing a PNG image
|
18
23
|
def to_png(*a)
|
@@ -28,15 +33,15 @@ module Barby
|
|
28
33
|
def to_jpg(*a)
|
29
34
|
to_blob('jpg', *a)
|
30
35
|
end
|
31
|
-
|
36
|
+
|
32
37
|
def to_blob(format, *a)
|
33
38
|
img = to_image(*a)
|
34
39
|
blob = img.to_blob{|i| i.format = format }
|
35
|
-
|
40
|
+
|
36
41
|
#Release the memory used by RMagick explicitly. Ruby's GC
|
37
42
|
#isn't aware of it and can't clean it up automatically
|
38
43
|
img.destroy! if img.respond_to?(:destroy!)
|
39
|
-
|
44
|
+
|
40
45
|
blob
|
41
46
|
end
|
42
47
|
|
@@ -22,6 +22,11 @@ module Barby
|
|
22
22
|
attr_writer :title, :xdim, :ydim, :height, :rmargin, :lmargin, :tmargin, :bmargin, :xmargin, :ymargin, :margin
|
23
23
|
|
24
24
|
|
25
|
+
def initialize(*)
|
26
|
+
super
|
27
|
+
@title, @xdim, @ydim, @height, @rmargin, @lmargin, @tmargin, @bmargin, @xmargin, @ymargin, @margin = nil
|
28
|
+
end
|
29
|
+
|
25
30
|
def to_svg(opts={})
|
26
31
|
with_options opts do
|
27
32
|
case opts[:use]
|
data/lib/barby/version.rb
CHANGED
metadata
CHANGED
@@ -1,25 +1,25 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: barby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tore Darell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-04-20 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Barby creates barcodes.
|
14
14
|
email: toredarell@gmail.com
|
15
15
|
executables: []
|
16
16
|
extensions: []
|
17
17
|
extra_rdoc_files:
|
18
|
-
- README
|
18
|
+
- README.md
|
19
19
|
files:
|
20
20
|
- CHANGELOG
|
21
21
|
- LICENSE
|
22
|
-
- README
|
22
|
+
- README.md
|
23
23
|
- bin/barby
|
24
24
|
- lib/barby.rb
|
25
25
|
- lib/barby/barcode.rb
|
@@ -43,7 +43,6 @@ files:
|
|
43
43
|
- lib/barby/outputter/html_outputter.rb
|
44
44
|
- lib/barby/outputter/pdfwriter_outputter.rb
|
45
45
|
- lib/barby/outputter/png_outputter.rb
|
46
|
-
- lib/barby/outputter/point_matrix.rb
|
47
46
|
- lib/barby/outputter/prawn_outputter.rb
|
48
47
|
- lib/barby/outputter/rmagick_outputter.rb
|
49
48
|
- lib/barby/outputter/svg_outputter.rb
|
@@ -54,15 +53,7 @@ files:
|
|
54
53
|
homepage: http://toretore.github.com/barby
|
55
54
|
licenses: []
|
56
55
|
metadata: {}
|
57
|
-
post_install_message:
|
58
|
-
|
59
|
-
*** NEW REQUIRE POLICY ***"
|
60
|
-
Barby no longer require all barcode symbologies by default. You'll have
|
61
|
-
to require the ones you need. For example, if you need EAN-13,
|
62
|
-
require 'barby/barcode/ean_13'; For a full list of symbologies and their
|
63
|
-
filenames, see README.
|
64
|
-
***
|
65
|
-
|
56
|
+
post_install_message:
|
66
57
|
rdoc_options: []
|
67
58
|
require_paths:
|
68
59
|
- lib
|
@@ -78,7 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
69
|
version: '0'
|
79
70
|
requirements: []
|
80
71
|
rubyforge_project: barby
|
81
|
-
rubygems_version: 2.
|
72
|
+
rubygems_version: 2.5.1
|
82
73
|
signing_key:
|
83
74
|
specification_version: 4
|
84
75
|
summary: The Ruby barcode generator
|
data/README
DELETED
@@ -1,93 +0,0 @@
|
|
1
|
-
*** NEW REQUIRE POLICY ***
|
2
|
-
|
3
|
-
Barcode symbologies are no longer requires automatically, so you'll have to
|
4
|
-
require the ones you need. If you need EAN-13, require 'barby/barcode/ean_13'.
|
5
|
-
Full list of symbologies and filenames below.
|
6
|
-
|
7
|
-
***
|
8
|
-
|
9
|
-
For more information, check out the Barby wiki at https://github.com/toretore/barby/wiki
|
10
|
-
|
11
|
-
Barby is a Ruby library that generates barcodes in a variety of symbologies.
|
12
|
-
Its functionality is split into barcode and "outputter" objects. Barcode
|
13
|
-
objects turn data into a binary representation for a given symbology.
|
14
|
-
Outputters then take this representation and turns it into images, PDF, etc.
|
15
|
-
|
16
|
-
You can easily add a symbology without having to worry about graphical
|
17
|
-
representation. If it can be represented as the usual 1D or 2D matrix of
|
18
|
-
lines or squares, outputters will do that for you.
|
19
|
-
|
20
|
-
Likewise, you can easily add an outputter for a format that doesn't have one
|
21
|
-
yet, and it will work with all existing symbologies.
|
22
|
-
|
23
|
-
See Barby::Barcode and Barby::Outputter for more information.
|
24
|
-
|
25
|
-
require 'barby'
|
26
|
-
require 'barby/barcode/code_128'
|
27
|
-
require 'barby/outputter/ascii_outputter'
|
28
|
-
|
29
|
-
barcode = Barby::Code128B.new('BARBY')
|
30
|
-
|
31
|
-
puts barcode.to_ascii #Implicitly uses the AsciiOutputter
|
32
|
-
|
33
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
34
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
35
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
36
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
37
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
38
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
39
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
40
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
41
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
42
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
43
|
-
B A R B Y
|
44
|
-
|
45
|
-
|
46
|
-
Supported symbologies:
|
47
|
-
|
48
|
-
Name - filename - dependencies
|
49
|
-
|
50
|
-
require 'barby/barcode/<filename>'
|
51
|
-
|
52
|
-
* Code 25 - code_25
|
53
|
-
* Interleaved - code_25_interleaved
|
54
|
-
* IATA - code_25_iata
|
55
|
-
* Code 39 - code_39
|
56
|
-
* Code 93 - code_93
|
57
|
-
* Code 128 - code_128
|
58
|
-
* GS1 128 - gs1_128
|
59
|
-
* EAN-13 - ean_13
|
60
|
-
* Bookland - bookland
|
61
|
-
* UPC-A - ean_13
|
62
|
-
* EAN-8 - ean_8
|
63
|
-
* UPC/EAN supplemental, 2 & 5 digits - upc_supplemental
|
64
|
-
|
65
|
-
* QR Code - qr_code - rqrcode
|
66
|
-
* DataMatrix (Semacode) - data_matrix - semacode
|
67
|
-
* PDF417 - pdf_417 - java (JRuby)
|
68
|
-
|
69
|
-
|
70
|
-
Formats supported by outputters:
|
71
|
-
|
72
|
-
* Text (mostly for testing)
|
73
|
-
* PNG, JPEG, GIF
|
74
|
-
* PS, EPS
|
75
|
-
* SVG
|
76
|
-
* PDF
|
77
|
-
* HTML
|
78
|
-
|
79
|
-
|
80
|
-
Outputters:
|
81
|
-
|
82
|
-
filename (dependencies)
|
83
|
-
|
84
|
-
require 'barby/outputter/<filename>_outputter'
|
85
|
-
|
86
|
-
* ascii
|
87
|
-
* cairo (cairo)
|
88
|
-
* html
|
89
|
-
* pdfwriter
|
90
|
-
* png (chunky_png)
|
91
|
-
* prawn (prawn)
|
92
|
-
* rmagick (RMagick)
|
93
|
-
* svg
|
@@ -1,211 +0,0 @@
|
|
1
|
-
require 'barby/outputter'
|
2
|
-
|
3
|
-
module Barby
|
4
|
-
|
5
|
-
class Outputter
|
6
|
-
|
7
|
-
|
8
|
-
#A collection of rows - an array of arrays
|
9
|
-
class PointMatrix < Array
|
10
|
-
|
11
|
-
DEFAULT_XDIM = 1.0
|
12
|
-
DEFAULT_YDIM = 1.0
|
13
|
-
|
14
|
-
attr_writer :xdim, :ydim
|
15
|
-
|
16
|
-
|
17
|
-
def initialize(*a, &b)
|
18
|
-
# new([[t,f,t,f], [f,t,f,t], ...])
|
19
|
-
if a[0].is_a?(Array) && a[0][0].is_a?(Array) && [true,false].include?(a[0][0][0])
|
20
|
-
a[0] = a[0].map{|r| PointRow.new(self, r) }
|
21
|
-
# new(['1010', '0101', ...])
|
22
|
-
elsif a[0].is_a?(Array) && a[0][0].is_a?(String)
|
23
|
-
a[0] = a[0].map{|s| PointRow.new(self, s) }
|
24
|
-
end
|
25
|
-
|
26
|
-
super(*a, &b)
|
27
|
-
end
|
28
|
-
|
29
|
-
|
30
|
-
def xdim
|
31
|
-
@xdim || DEFAULT_XDIM
|
32
|
-
end
|
33
|
-
|
34
|
-
def ydim
|
35
|
-
@ydim || DEFAULT_YDIM
|
36
|
-
end
|
37
|
-
|
38
|
-
|
39
|
-
def width
|
40
|
-
inject(0){|m,r| r.width > m ? r.width : m }
|
41
|
-
end
|
42
|
-
|
43
|
-
def height
|
44
|
-
inject(0){|s,r| s + r.height }
|
45
|
-
end
|
46
|
-
|
47
|
-
|
48
|
-
def to_s
|
49
|
-
map{|r| r.to_s }
|
50
|
-
end
|
51
|
-
|
52
|
-
def inspect
|
53
|
-
to_s
|
54
|
-
end
|
55
|
-
|
56
|
-
|
57
|
-
def dup
|
58
|
-
self.class.new(map{|r| r.dup })
|
59
|
-
end
|
60
|
-
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
|
65
|
-
class PointRow < Array
|
66
|
-
|
67
|
-
attr_reader :matrix
|
68
|
-
attr_accessor :xdim, :ydim
|
69
|
-
|
70
|
-
|
71
|
-
def initialize(*a, &b)
|
72
|
-
raise ArgumentError, 'PointRow must belong to a PointMatrix' unless a[0].is_a?(PointMatrix)
|
73
|
-
@matrix = a.shift
|
74
|
-
|
75
|
-
#Assume called with [t,f,t,f,..]
|
76
|
-
if a[0].is_a?(Array) && [true, false].include?(a[0][0])
|
77
|
-
a[0] = a[0].map{|b| Point.new(self, b) }
|
78
|
-
#Assume called with '1010..'
|
79
|
-
elsif a[0].is_a?(String)
|
80
|
-
a[0] = a[0].split(//).map{|s| Point.new(self, s == '1') }
|
81
|
-
end
|
82
|
-
|
83
|
-
super(*a, &b)
|
84
|
-
end
|
85
|
-
|
86
|
-
|
87
|
-
def booleans
|
88
|
-
map{|p| p.active? }
|
89
|
-
end
|
90
|
-
|
91
|
-
|
92
|
-
def xdim
|
93
|
-
@xdim || matrix.xdim
|
94
|
-
end
|
95
|
-
|
96
|
-
def ydim
|
97
|
-
@ydim || matrix.ydim
|
98
|
-
end
|
99
|
-
|
100
|
-
|
101
|
-
def width
|
102
|
-
inject(0){|s,p| s + p.width }
|
103
|
-
end
|
104
|
-
|
105
|
-
def height
|
106
|
-
inject(0){|m,p| p.height > m ? p.height : m }
|
107
|
-
end
|
108
|
-
|
109
|
-
|
110
|
-
def to_s
|
111
|
-
inject(''){|s,p| s << (p.active ? '1' : '0') }
|
112
|
-
end
|
113
|
-
|
114
|
-
def inspect
|
115
|
-
to_s
|
116
|
-
end
|
117
|
-
|
118
|
-
def ==(other)
|
119
|
-
super #Just to say explicitly that equality should behave like in an array
|
120
|
-
end
|
121
|
-
|
122
|
-
|
123
|
-
def dup
|
124
|
-
self.class.new(matrix, map{|p| p.dup })
|
125
|
-
end
|
126
|
-
|
127
|
-
end
|
128
|
-
|
129
|
-
|
130
|
-
class Point
|
131
|
-
|
132
|
-
attr_reader :row, :active
|
133
|
-
attr_writer :width, :height, :color, :active
|
134
|
-
alias active? active
|
135
|
-
|
136
|
-
|
137
|
-
def initialize(row, active, opts={})
|
138
|
-
@row = row
|
139
|
-
self.active = active
|
140
|
-
end
|
141
|
-
|
142
|
-
|
143
|
-
def color
|
144
|
-
@color || (active ? Color.new(0,0,0) : nil)
|
145
|
-
end
|
146
|
-
|
147
|
-
def width
|
148
|
-
@width || row.xdim
|
149
|
-
end
|
150
|
-
|
151
|
-
def height
|
152
|
-
@height || row.ydim
|
153
|
-
end
|
154
|
-
|
155
|
-
|
156
|
-
def ==(other)
|
157
|
-
active == other.active &&
|
158
|
-
width == other.width &&
|
159
|
-
height == other.height &&
|
160
|
-
color == other.color
|
161
|
-
end
|
162
|
-
|
163
|
-
|
164
|
-
end
|
165
|
-
|
166
|
-
|
167
|
-
#TODO Add alpha
|
168
|
-
class Color
|
169
|
-
|
170
|
-
MIN_VALUE = 0
|
171
|
-
MAX_VALUE = 255
|
172
|
-
|
173
|
-
attr_reader :red, :blue, :green
|
174
|
-
|
175
|
-
def initialize(r, b, g)
|
176
|
-
self.red, self.blue, self.green = r, b, g
|
177
|
-
end
|
178
|
-
|
179
|
-
|
180
|
-
def red=(r)
|
181
|
-
set_color(:red, r)
|
182
|
-
end
|
183
|
-
|
184
|
-
def blue=(b)
|
185
|
-
set_color(:blue, b)
|
186
|
-
end
|
187
|
-
|
188
|
-
def green=(g)
|
189
|
-
set_color(:green, g)
|
190
|
-
end
|
191
|
-
|
192
|
-
|
193
|
-
def ==(other)
|
194
|
-
other.red == red && other.blue == blue && other.green == green
|
195
|
-
end
|
196
|
-
|
197
|
-
|
198
|
-
private
|
199
|
-
|
200
|
-
def set_color(name, value)
|
201
|
-
raise ArgumentError, "Value must be between 0-255" if value < MIN_VALUE || value > MAX_VALUE
|
202
|
-
instance_variable_set("@#{name}", value)
|
203
|
-
end
|
204
|
-
|
205
|
-
|
206
|
-
end
|
207
|
-
|
208
|
-
|
209
|
-
end
|
210
|
-
|
211
|
-
end
|