fullcirclegroup-prawn 0.2.99.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.
- data/COPYING +340 -0
- data/LICENSE +56 -0
- data/README +47 -0
- data/Rakefile +76 -0
- data/data/fonts/Activa.ttf +0 -0
- data/data/fonts/Chalkboard.ttf +0 -0
- data/data/fonts/Courier-Bold.afm +342 -0
- data/data/fonts/Courier-BoldOblique.afm +342 -0
- data/data/fonts/Courier-Oblique.afm +342 -0
- data/data/fonts/Courier.afm +342 -0
- data/data/fonts/DejaVuSans.ttf +0 -0
- data/data/fonts/Dustismo_Roman.ttf +0 -0
- data/data/fonts/Helvetica-Bold.afm +2827 -0
- data/data/fonts/Helvetica-BoldOblique.afm +2827 -0
- data/data/fonts/Helvetica-Oblique.afm +3051 -0
- data/data/fonts/Helvetica.afm +3051 -0
- data/data/fonts/MustRead.html +19 -0
- data/data/fonts/Symbol.afm +213 -0
- data/data/fonts/Times-Bold.afm +2588 -0
- data/data/fonts/Times-BoldItalic.afm +2384 -0
- data/data/fonts/Times-Italic.afm +2667 -0
- data/data/fonts/Times-Roman.afm +2419 -0
- data/data/fonts/ZapfDingbats.afm +225 -0
- data/data/fonts/comicsans.ttf +0 -0
- data/data/fonts/gkai00mp.ttf +0 -0
- data/data/images/arrow.png +0 -0
- data/data/images/arrow2.png +0 -0
- data/data/images/barcode_issue.png +0 -0
- data/data/images/dice.alpha +0 -0
- data/data/images/dice.dat +0 -0
- data/data/images/dice.png +0 -0
- data/data/images/page_white_text.alpha +0 -0
- data/data/images/page_white_text.dat +0 -0
- data/data/images/page_white_text.png +0 -0
- data/data/images/pigs.jpg +0 -0
- data/data/images/rails.dat +0 -0
- data/data/images/rails.png +0 -0
- data/data/images/ruport.png +0 -0
- data/data/images/ruport_data.dat +0 -0
- data/data/images/ruport_transparent.png +0 -0
- data/data/images/ruport_type0.png +0 -0
- data/data/images/stef.jpg +0 -0
- data/data/images/web-links.dat +1 -0
- data/data/images/web-links.png +0 -0
- data/data/shift_jis_text.txt +1 -0
- data/examples/addressbook.csv +6 -0
- data/examples/alignment.rb +16 -0
- data/examples/bounding_boxes.rb +30 -0
- data/examples/canvas.rb +12 -0
- data/examples/cell.rb +38 -0
- data/examples/chinese_text_wrapping.rb +17 -0
- data/examples/currency.csv +1834 -0
- data/examples/curves.rb +10 -0
- data/examples/family_based_styling.rb +21 -0
- data/examples/fancy_table.rb +61 -0
- data/examples/flowing_text_with_header_and_footer.rb +72 -0
- data/examples/font_size.rb +27 -0
- data/examples/hexagon.rb +14 -0
- data/examples/image.rb +23 -0
- data/examples/image2.rb +13 -0
- data/examples/image_flow.rb +34 -0
- data/examples/kerning.rb +27 -0
- data/examples/lazy_bounding_boxes.rb +19 -0
- data/examples/line.rb +31 -0
- data/examples/multi_page_layout.rb +14 -0
- data/examples/page_geometry.rb +28 -0
- data/examples/png_types.rb +23 -0
- data/examples/polygons.rb +16 -0
- data/examples/position_by_baseline.rb +26 -0
- data/examples/ruport_formatter.rb +50 -0
- data/examples/ruport_helpers.rb +18 -0
- data/examples/russian_boxes.rb +34 -0
- data/examples/simple_text.rb +15 -0
- data/examples/simple_text_ttf.rb +16 -0
- data/examples/sjis.rb +21 -0
- data/examples/span.rb +27 -0
- data/examples/table.rb +47 -0
- data/examples/table_header_color.rb +16 -0
- data/examples/text_flow.rb +65 -0
- data/examples/top_and_bottom_cells.rb +40 -0
- data/examples/utf8.rb +12 -0
- data/lib/prawn.rb +67 -0
- data/lib/prawn/compatibility.rb +46 -0
- data/lib/prawn/document.rb +309 -0
- data/lib/prawn/document/bounding_box.rb +362 -0
- data/lib/prawn/document/internals.rb +113 -0
- data/lib/prawn/document/page_geometry.rb +79 -0
- data/lib/prawn/document/span.rb +47 -0
- data/lib/prawn/document/table.rb +350 -0
- data/lib/prawn/document/text.rb +196 -0
- data/lib/prawn/errors.rb +48 -0
- data/lib/prawn/font.rb +356 -0
- data/lib/prawn/font/cmap.rb +59 -0
- data/lib/prawn/font/metrics.rb +378 -0
- data/lib/prawn/font/wrapping.rb +47 -0
- data/lib/prawn/graphics.rb +252 -0
- data/lib/prawn/graphics/cell.rb +264 -0
- data/lib/prawn/graphics/color.rb +132 -0
- data/lib/prawn/images.rb +336 -0
- data/lib/prawn/images/jpg.rb +45 -0
- data/lib/prawn/images/png.rb +199 -0
- data/lib/prawn/pdf_object.rb +73 -0
- data/lib/prawn/reference.rb +56 -0
- data/spec/bounding_box_spec.rb +141 -0
- data/spec/document_spec.rb +181 -0
- data/spec/font_spec.rb +141 -0
- data/spec/graphics_spec.rb +209 -0
- data/spec/images_spec.rb +68 -0
- data/spec/jpg_spec.rb +25 -0
- data/spec/metrics_spec.rb +62 -0
- data/spec/pdf_object_spec.rb +112 -0
- data/spec/png_spec.rb +196 -0
- data/spec/reference_spec.rb +42 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/table_spec.rb +179 -0
- data/spec/text_spec.rb +135 -0
- metadata +181 -0
data/spec/images_spec.rb
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
|
4
|
+
|
|
5
|
+
describe "the image() function" do
|
|
6
|
+
|
|
7
|
+
before(:each) do
|
|
8
|
+
@filename = "#{Prawn::BASEDIR}/data/images/pigs.jpg"
|
|
9
|
+
create_pdf
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "should only embed an image once, even if it's added multiple times" do
|
|
13
|
+
@pdf.image @filename, :at => [100,100]
|
|
14
|
+
@pdf.image @filename, :at => [300,300]
|
|
15
|
+
|
|
16
|
+
output = @pdf.render
|
|
17
|
+
images = PDF::Inspector::XObject.analyze(output)
|
|
18
|
+
# there should be 2 images in the page resources
|
|
19
|
+
images.page_xobjects.first.size.should == 2
|
|
20
|
+
# but only 1 image xobject
|
|
21
|
+
output.scan(/\/Type \/XObject/).size.should == 1
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "should return the image info object" do
|
|
25
|
+
info = @pdf.image(@filename)
|
|
26
|
+
|
|
27
|
+
assert info.kind_of?(Prawn::Images::JPG)
|
|
28
|
+
|
|
29
|
+
info.height.should == 453
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "should accept IO objects" do
|
|
33
|
+
file = File.open(@filename, "rb")
|
|
34
|
+
info = @pdf.image(file)
|
|
35
|
+
|
|
36
|
+
info.height.should == 453
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe ":fit option" do
|
|
40
|
+
it "should fit inside the defined constraints" do
|
|
41
|
+
info = @pdf.image @filename, :fit => [100,400]
|
|
42
|
+
info.scaled_width.should <= 100
|
|
43
|
+
info.scaled_height.should <= 400
|
|
44
|
+
|
|
45
|
+
info = @pdf.image @filename, :fit => [400,100]
|
|
46
|
+
info.scaled_width.should <= 400
|
|
47
|
+
info.scaled_height.should <= 100
|
|
48
|
+
|
|
49
|
+
info = @pdf.image @filename, :fit => [604,453]
|
|
50
|
+
info.scaled_width.should == 604
|
|
51
|
+
info.scaled_height.should == 453
|
|
52
|
+
end
|
|
53
|
+
it "should move text position" do
|
|
54
|
+
@y = @pdf.y
|
|
55
|
+
info = @pdf.image @filename, :fit => [100,400]
|
|
56
|
+
@pdf.y.should < @y
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
describe ":at option" do
|
|
60
|
+
it "should not move text position" do
|
|
61
|
+
@y = @pdf.y
|
|
62
|
+
info = @pdf.image @filename, :at => [100,400]
|
|
63
|
+
@pdf.y.should == @y
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
|
data/spec/jpg_spec.rb
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
# Spec'ing the PNG class. Not complete yet - still needs to check the
|
|
4
|
+
# contents of palette and transparency to ensure they're correct.
|
|
5
|
+
# Need to find files that have these sections first.
|
|
6
|
+
|
|
7
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
|
8
|
+
|
|
9
|
+
describe "When reading a JPEG file" do
|
|
10
|
+
|
|
11
|
+
before(:each) do
|
|
12
|
+
@filename = "#{Prawn::BASEDIR}/data/images/pigs.jpg"
|
|
13
|
+
@img_data = File.open(@filename, "rb") { |f| f.read }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "should read the basic attributes correctly" do
|
|
17
|
+
jpg = Prawn::Images::JPG.new(@img_data)
|
|
18
|
+
|
|
19
|
+
jpg.width.should == 604
|
|
20
|
+
jpg.height.should == 453
|
|
21
|
+
jpg.bits.should == 8
|
|
22
|
+
jpg.channels.should == 3
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
|
4
|
+
require "iconv"
|
|
5
|
+
|
|
6
|
+
describe "adobe font metrics" do
|
|
7
|
+
|
|
8
|
+
setup do
|
|
9
|
+
@times = Prawn::Font::Metrics["Times-Roman"]
|
|
10
|
+
@iconv = ::Iconv.new('ISO-8859-1', 'utf-8')
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should calculate string width taking into account accented characters" do
|
|
14
|
+
@times.string_width(@iconv.iconv("é"), 12).should == @times.string_width("e", 12)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should calculate string width taking into account kerning pairs" do
|
|
18
|
+
@times.string_width(@iconv.iconv("To"), 12).should == 13.332
|
|
19
|
+
@times.string_width(@iconv.iconv("To"), 12, :kerning => true).should == 12.372
|
|
20
|
+
@times.string_width(@iconv.iconv("Tö"), 12, :kerning => true).should == 12.372
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "should kern a string" do
|
|
24
|
+
@times.kern(@iconv.iconv("To")).should == ["T", 80, "o"]
|
|
25
|
+
@times.kern(@iconv.iconv("Télé")).should == ["T", 70, @iconv.iconv("élé")]
|
|
26
|
+
@times.kern(@iconv.iconv("Technology")).should == ["T", 70, "echnology"]
|
|
27
|
+
@times.kern(@iconv.iconv("Technology...")).should == ["T", 70, "echnology", 65, "..."]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe "ttf font metrics" do
|
|
33
|
+
|
|
34
|
+
setup do
|
|
35
|
+
@activa = Prawn::Font::Metrics["#{Prawn::BASEDIR}/data/fonts/Activa.ttf"]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "should calculate string width taking into account accented characters" do
|
|
39
|
+
@activa.string_width("é", 12).should == @activa.string_width("e", 12)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "should calculate string width taking into account kerning pairs" do
|
|
43
|
+
@activa.string_width("To", 12).should == 15.228
|
|
44
|
+
@activa.string_width("To", 12, :kerning => true).should.to_s == 12.996.to_s
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "should kern a string" do
|
|
48
|
+
@activa.kern("To").should == ["\0007", 186.0, "\000R"]
|
|
49
|
+
|
|
50
|
+
# Does activa use kerning classes here? Ruby/TTF doesn't support
|
|
51
|
+
# format 2 kerning tables, so don't bother for now.
|
|
52
|
+
|
|
53
|
+
# @activa.kern("Télé").should == ["T", -186, "élé"]
|
|
54
|
+
|
|
55
|
+
@activa.kern("Technology").should == ["\0007", 186.0,
|
|
56
|
+
"\000H\000F\000K\000Q\000R\000O\000R\000J\000\\"]
|
|
57
|
+
@activa.kern("Technology...").should == ["\0007", 186.0,
|
|
58
|
+
"\000H\000F\000K\000Q\000R\000O\000R\000J\000\\", 88.0,
|
|
59
|
+
"\000\021\000\021\000\021"]
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# encoding: ASCII-8BIT
|
|
2
|
+
|
|
3
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
|
4
|
+
|
|
5
|
+
# See PDF Reference, Sixth Edition (1.7) pp51-60 for details
|
|
6
|
+
describe "PDF Object Serialization" do
|
|
7
|
+
|
|
8
|
+
it "should convert Ruby's nil to PDF null" do
|
|
9
|
+
Prawn::PdfObject(nil).should == "null"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "should convert Ruby booleans to PDF booleans" do
|
|
13
|
+
Prawn::PdfObject(true).should == "true"
|
|
14
|
+
Prawn::PdfObject(false).should == "false"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should convert a Ruby number to PDF number" do
|
|
18
|
+
Prawn::PdfObject(1).should == "1"
|
|
19
|
+
Prawn::PdfObject(1.214112421).should == "1.214112421"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "should convert a Ruby string to PDF string when inside a content stream" do
|
|
23
|
+
s = "I can has a string"
|
|
24
|
+
PDF::Inspector.parse(Prawn::PdfObject(s, true)).should == s
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "should convert a Ruby string to a UTF-16 PDF string when outside a content stream" do
|
|
28
|
+
s = "I can has a string"
|
|
29
|
+
s_utf16 = "\xFE\xFF" + s.unpack("U*").pack("n*")
|
|
30
|
+
PDF::Inspector.parse(Prawn::PdfObject(s, false)).should == s_utf16
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "should escape parens when converting from Ruby string to PDF" do
|
|
34
|
+
s = 'I )(can has a string'
|
|
35
|
+
PDF::Inspector.parse(Prawn::PdfObject(s, true)).should == s
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "should handle ruby escaped parens when converting to PDF string" do
|
|
39
|
+
s = 'I can \\)( has string'
|
|
40
|
+
PDF::Inspector.parse(Prawn::PdfObject(s, true)).should == s
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "should convert a Ruby symbol to PDF name" do
|
|
44
|
+
Prawn::PdfObject(:my_symbol).should == "/my_symbol"
|
|
45
|
+
Prawn::PdfObject(:"A;Name_With−Various***Characters?").should ==
|
|
46
|
+
"/A;Name_With−Various***Characters?"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should not convert a whitespace containing Ruby symbol to a PDF name" do
|
|
50
|
+
lambda { Prawn::PdfObject(:"My Symbol With Spaces") }.
|
|
51
|
+
should.raise(Prawn::Errors::FailedObjectConversion)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should convert a Ruby array to PDF Array when inside a content stream" do
|
|
55
|
+
Prawn::PdfObject([1,2,3]).should == "[1 2 3]"
|
|
56
|
+
PDF::Inspector.parse(Prawn::PdfObject([[1,2],:foo,"Bar"], true)).should ==
|
|
57
|
+
[[1,2],:foo, "Bar"]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "should convert a Ruby array to PDF Array when outside a content stream" do
|
|
61
|
+
bar = "\xFE\xFF" + "Bar".unpack("U*").pack("n*")
|
|
62
|
+
Prawn::PdfObject([1,2,3]).should == "[1 2 3]"
|
|
63
|
+
PDF::Inspector.parse(Prawn::PdfObject([[1,2],:foo,"Bar"], false)).should ==
|
|
64
|
+
[[1,2],:foo, bar]
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "should convert a Ruby hash to a PDF Dictionary when inside a content stream" do
|
|
68
|
+
dict = Prawn::PdfObject( {:foo => :bar,
|
|
69
|
+
"baz" => [1,2,3],
|
|
70
|
+
:bang => {:a => "what", :b => [:you, :say] }}, true )
|
|
71
|
+
|
|
72
|
+
res = PDF::Inspector.parse(dict)
|
|
73
|
+
|
|
74
|
+
res[:foo].should == :bar
|
|
75
|
+
res[:baz].should == [1,2,3]
|
|
76
|
+
res[:bang].should == { :a => "what", :b => [:you, :say] }
|
|
77
|
+
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "should convert a Ruby hash to a PDF Dictionary when outside a content stream" do
|
|
81
|
+
what = "\xFE\xFF" + "what".unpack("U*").pack("n*")
|
|
82
|
+
dict = Prawn::PdfObject( {:foo => :bar,
|
|
83
|
+
"baz" => [1,2,3],
|
|
84
|
+
:bang => {:a => "what", :b => [:you, :say] }}, false )
|
|
85
|
+
|
|
86
|
+
res = PDF::Inspector.parse(dict)
|
|
87
|
+
|
|
88
|
+
res[:foo].should == :bar
|
|
89
|
+
res[:baz].should == [1,2,3]
|
|
90
|
+
res[:bang].should == { :a => what, :b => [:you, :say] }
|
|
91
|
+
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it "should not allow keys other than strings or symbols for PDF dicts" do
|
|
95
|
+
lambda { Prawn::PdfObject(:foo => :bar, :baz => :bang, 1 => 4) }.
|
|
96
|
+
should.raise(Prawn::Errors::FailedObjectConversion)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it "should convert a Prawn::Reference to a PDF indirect object reference" do
|
|
100
|
+
ref = Prawn::Reference(1,true)
|
|
101
|
+
Prawn::PdfObject(ref).should == ref.to_s
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "should convert a NameTree::Node to a PDF hash" do
|
|
105
|
+
node = Prawn::NameTree::Node.new(Prawn::Document.new, 10)
|
|
106
|
+
node.add "hello", 1.0
|
|
107
|
+
node.add "world", 2.0
|
|
108
|
+
data = Prawn::PdfObject(node)
|
|
109
|
+
res = PDF::Inspector.parse(data)
|
|
110
|
+
res.should == {:Names => ["hello", 1.0, "world", 2.0]}
|
|
111
|
+
end
|
|
112
|
+
end
|
data/spec/png_spec.rb
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# encoding: ASCII-8BIT
|
|
2
|
+
|
|
3
|
+
# Spec'ing the PNG class. Not complete yet - still needs to check the
|
|
4
|
+
# contents of palette and transparency to ensure they're correct.
|
|
5
|
+
# Need to find files that have these sections first.
|
|
6
|
+
#
|
|
7
|
+
# see http://www.w3.org/TR/PNG/ for a detailed description of the PNG spec,
|
|
8
|
+
# particuarly Table 11.1 for the different color types
|
|
9
|
+
|
|
10
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
|
|
11
|
+
|
|
12
|
+
describe "When reading a greyscale PNG file (color type 0)" do
|
|
13
|
+
|
|
14
|
+
before(:each) do
|
|
15
|
+
@filename = "#{Prawn::BASEDIR}/data/images/web-links.png"
|
|
16
|
+
@data_filename = "#{Prawn::BASEDIR}/data/images/web-links.dat"
|
|
17
|
+
@img_data = File.read_binary(@filename)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "should read the attributes from the header chunk correctly" do
|
|
21
|
+
png = Prawn::Images::PNG.new(@img_data)
|
|
22
|
+
|
|
23
|
+
png.width.should == 21
|
|
24
|
+
png.height.should == 14
|
|
25
|
+
png.bits.should == 8
|
|
26
|
+
png.color_type.should == 0
|
|
27
|
+
png.compression_method.should == 0
|
|
28
|
+
png.filter_method.should == 0
|
|
29
|
+
png.interlace_method.should == 0
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "should read the image data chunk correctly" do
|
|
33
|
+
png = Prawn::Images::PNG.new(@img_data)
|
|
34
|
+
data = File.read_binary(@data_filename)
|
|
35
|
+
png.img_data.should == data
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe "When reading a greyscale PNG file with transparency (color type 0)" do
|
|
40
|
+
|
|
41
|
+
before(:each) do
|
|
42
|
+
@filename = "#{Prawn::BASEDIR}/data/images/ruport_type0.png"
|
|
43
|
+
@img_data = File.read_binary(@filename)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# In a greyscale type 0 PNG image, the tRNS chunk should contain a single value
|
|
47
|
+
# that indicates the color that should be interpreted as transparent.
|
|
48
|
+
#
|
|
49
|
+
# http://www.w3.org/TR/PNG/#11tRNS
|
|
50
|
+
it "should read the tRNS chunk correctly" do
|
|
51
|
+
png = Prawn::Images::PNG.new(@img_data)
|
|
52
|
+
png.transparency[:grayscale].should == 255
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
describe "When reading an RGB PNG file (color type 2)" do
|
|
57
|
+
|
|
58
|
+
before(:each) do
|
|
59
|
+
@filename = "#{Prawn::BASEDIR}/data/images/ruport.png"
|
|
60
|
+
@data_filename = "#{Prawn::BASEDIR}/data/images/ruport_data.dat"
|
|
61
|
+
@img_data = File.read_binary(@filename)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "should read the attributes from the header chunk correctly" do
|
|
65
|
+
png = Prawn::Images::PNG.new(@img_data)
|
|
66
|
+
|
|
67
|
+
png.width.should == 258
|
|
68
|
+
png.height.should == 105
|
|
69
|
+
png.bits.should == 8
|
|
70
|
+
png.color_type.should == 2
|
|
71
|
+
png.compression_method.should == 0
|
|
72
|
+
png.filter_method.should == 0
|
|
73
|
+
png.interlace_method.should == 0
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it "should read the image data chunk correctly" do
|
|
77
|
+
png = Prawn::Images::PNG.new(@img_data)
|
|
78
|
+
data = File.read_binary(@data_filename)
|
|
79
|
+
png.img_data.should == data
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
describe "When reading an RGB PNG file with transparency (color type 2)" do
|
|
84
|
+
|
|
85
|
+
before(:each) do
|
|
86
|
+
@filename = "#{Prawn::BASEDIR}/data/images/arrow2.png"
|
|
87
|
+
@img_data = File.read_binary(@filename)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# In a RGB type 2 PNG image, the tRNS chunk should contain a single RGB value
|
|
91
|
+
# that indicates the color that should be interpreted as transparent. In this
|
|
92
|
+
# case it's green.
|
|
93
|
+
#
|
|
94
|
+
# http://www.w3.org/TR/PNG/#11tRNS
|
|
95
|
+
it "should read the tRNS chunk correctly" do
|
|
96
|
+
png = Prawn::Images::PNG.new(@img_data)
|
|
97
|
+
png.transparency[:rgb].should == [0, 255, 0]
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# TODO: describe "When reading an indexed color PNG file wiih transparency (color type 3)"
|
|
102
|
+
|
|
103
|
+
describe "When reading an indexed color PNG file (color type 3)" do
|
|
104
|
+
|
|
105
|
+
before(:each) do
|
|
106
|
+
@filename = "#{Prawn::BASEDIR}/data/images/rails.png"
|
|
107
|
+
@data_filename = "#{Prawn::BASEDIR}/data/images/rails.dat"
|
|
108
|
+
@img_data = File.read_binary(@filename)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it "should read the attributes from the header chunk correctly" do
|
|
112
|
+
png = Prawn::Images::PNG.new(@img_data)
|
|
113
|
+
|
|
114
|
+
png.width.should == 50
|
|
115
|
+
png.height.should == 64
|
|
116
|
+
png.bits.should == 8
|
|
117
|
+
png.color_type.should == 3
|
|
118
|
+
png.compression_method.should == 0
|
|
119
|
+
png.filter_method.should == 0
|
|
120
|
+
png.interlace_method.should == 0
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it "should read the image data chunk correctly" do
|
|
124
|
+
png = Prawn::Images::PNG.new(@img_data)
|
|
125
|
+
data = File.read_binary(@data_filename)
|
|
126
|
+
png.img_data.should == data
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
describe "When reading a greyscale+alpha PNG file (color type 4)" do
|
|
131
|
+
|
|
132
|
+
before(:each) do
|
|
133
|
+
@filename = "#{Prawn::BASEDIR}/data/images/page_white_text.png"
|
|
134
|
+
@data_filename = "#{Prawn::BASEDIR}/data/images/page_white_text.dat"
|
|
135
|
+
@alpha_data_filename = "#{Prawn::BASEDIR}/data/images/page_white_text.alpha"
|
|
136
|
+
@img_data = File.read_binary(@filename)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
it "should read the attributes from the header chunk correctly" do
|
|
140
|
+
png = Prawn::Images::PNG.new(@img_data)
|
|
141
|
+
|
|
142
|
+
png.width.should == 16
|
|
143
|
+
png.height.should == 16
|
|
144
|
+
png.bits.should == 8
|
|
145
|
+
png.color_type.should == 4
|
|
146
|
+
png.compression_method.should == 0
|
|
147
|
+
png.filter_method.should == 0
|
|
148
|
+
png.interlace_method.should == 0
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do
|
|
152
|
+
png = Prawn::Images::PNG.new(@img_data)
|
|
153
|
+
data = File.read_binary(@data_filename)
|
|
154
|
+
png.img_data.should == data
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
it "should correctly extract the alpha channel data from the image data chunk" do
|
|
158
|
+
png = Prawn::Images::PNG.new(@img_data)
|
|
159
|
+
data = File.read_binary(@alpha_data_filename)
|
|
160
|
+
png.alpha_channel.should == data
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
describe "When reading an RGB+alpha PNG file (color type 6)" do
|
|
165
|
+
|
|
166
|
+
before(:each) do
|
|
167
|
+
@filename = "#{Prawn::BASEDIR}/data/images/dice.png"
|
|
168
|
+
@data_filename = "#{Prawn::BASEDIR}/data/images/dice.dat"
|
|
169
|
+
@alpha_data_filename = "#{Prawn::BASEDIR}/data/images/dice.alpha"
|
|
170
|
+
@img_data = File.read_binary(@filename)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
it "should read the attributes from the header chunk correctly" do
|
|
174
|
+
png = Prawn::Images::PNG.new(@img_data)
|
|
175
|
+
|
|
176
|
+
png.width.should == 320
|
|
177
|
+
png.height.should == 240
|
|
178
|
+
png.bits.should == 8
|
|
179
|
+
png.color_type.should == 6
|
|
180
|
+
png.compression_method.should == 0
|
|
181
|
+
png.filter_method.should == 0
|
|
182
|
+
png.interlace_method.should == 0
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do
|
|
186
|
+
png = Prawn::Images::PNG.new(@img_data)
|
|
187
|
+
data = File.read_binary(@data_filename)
|
|
188
|
+
png.img_data.should == data
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
it "should correctly extract the alpha channel data from the image data chunk" do
|
|
192
|
+
png = Prawn::Images::PNG.new(@img_data)
|
|
193
|
+
data = File.read_binary(@alpha_data_filename)
|
|
194
|
+
png.alpha_channel.should == data
|
|
195
|
+
end
|
|
196
|
+
end
|