prawn 0.4.1 → 0.5.0.1

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.
Files changed (179) hide show
  1. data/lib/prawn.rb +2 -72
  2. metadata +33 -224
  3. data/COPYING +0 -340
  4. data/LICENSE +0 -56
  5. data/README +0 -40
  6. data/Rakefile +0 -79
  7. data/data/encodings/win_ansi.txt +0 -29
  8. data/data/fonts/Action Man.dfont +0 -0
  9. data/data/fonts/Activa.ttf +0 -0
  10. data/data/fonts/Chalkboard.ttf +0 -0
  11. data/data/fonts/Courier-Bold.afm +0 -342
  12. data/data/fonts/Courier-BoldOblique.afm +0 -342
  13. data/data/fonts/Courier-Oblique.afm +0 -342
  14. data/data/fonts/Courier.afm +0 -342
  15. data/data/fonts/DejaVuSans.ttf +0 -0
  16. data/data/fonts/Dustismo_Roman.ttf +0 -0
  17. data/data/fonts/Helvetica-Bold.afm +0 -2827
  18. data/data/fonts/Helvetica-BoldOblique.afm +0 -2827
  19. data/data/fonts/Helvetica-Oblique.afm +0 -3051
  20. data/data/fonts/Helvetica.afm +0 -3051
  21. data/data/fonts/MustRead.html +0 -19
  22. data/data/fonts/Symbol.afm +0 -213
  23. data/data/fonts/Times-Bold.afm +0 -2588
  24. data/data/fonts/Times-BoldItalic.afm +0 -2384
  25. data/data/fonts/Times-Italic.afm +0 -2667
  26. data/data/fonts/Times-Roman.afm +0 -2419
  27. data/data/fonts/ZapfDingbats.afm +0 -225
  28. data/data/fonts/comicsans.ttf +0 -0
  29. data/data/fonts/gkai00mp.ttf +0 -0
  30. data/data/images/arrow.png +0 -0
  31. data/data/images/arrow2.png +0 -0
  32. data/data/images/barcode_issue.png +0 -0
  33. data/data/images/dice.alpha +0 -0
  34. data/data/images/dice.dat +0 -0
  35. data/data/images/dice.png +0 -0
  36. data/data/images/fractal.jpg +0 -0
  37. data/data/images/letterhead.jpg +0 -0
  38. data/data/images/page_white_text.alpha +0 -0
  39. data/data/images/page_white_text.dat +0 -0
  40. data/data/images/page_white_text.png +0 -0
  41. data/data/images/pigs.jpg +0 -0
  42. data/data/images/rails.dat +0 -0
  43. data/data/images/rails.png +0 -0
  44. data/data/images/ruport.png +0 -0
  45. data/data/images/ruport_data.dat +0 -0
  46. data/data/images/ruport_transparent.png +0 -0
  47. data/data/images/ruport_type0.png +0 -0
  48. data/data/images/stef.jpg +0 -0
  49. data/data/images/web-links.dat +0 -1
  50. data/data/images/web-links.png +0 -0
  51. data/data/shift_jis_text.txt +0 -1
  52. data/examples/bounding_box/bounding_boxes.rb +0 -44
  53. data/examples/bounding_box/lazy_bounding_boxes.rb +0 -28
  54. data/examples/bounding_box/padded_box.rb +0 -24
  55. data/examples/bounding_box/russian_boxes.rb +0 -37
  56. data/examples/general/background.rb +0 -20
  57. data/examples/general/canvas.rb +0 -16
  58. data/examples/general/measurement_units.rb +0 -52
  59. data/examples/general/multi_page_layout.rb +0 -17
  60. data/examples/general/page_geometry.rb +0 -32
  61. data/examples/graphics/basic_images.rb +0 -27
  62. data/examples/graphics/cmyk.rb +0 -13
  63. data/examples/graphics/curves.rb +0 -12
  64. data/examples/graphics/hexagon.rb +0 -14
  65. data/examples/graphics/image_fit.rb +0 -16
  66. data/examples/graphics/image_flow.rb +0 -38
  67. data/examples/graphics/image_position.rb +0 -18
  68. data/examples/graphics/line.rb +0 -33
  69. data/examples/graphics/png_types.rb +0 -23
  70. data/examples/graphics/polygons.rb +0 -17
  71. data/examples/graphics/remote_images.rb +0 -12
  72. data/examples/graphics/ruport_style_helpers.rb +0 -20
  73. data/examples/graphics/stroke_bounds.rb +0 -23
  74. data/examples/m17n/chinese_text_wrapping.rb +0 -20
  75. data/examples/m17n/euro.rb +0 -16
  76. data/examples/m17n/sjis.rb +0 -29
  77. data/examples/m17n/utf8.rb +0 -14
  78. data/examples/m17n/win_ansi_charset.rb +0 -55
  79. data/examples/text/alignment.rb +0 -19
  80. data/examples/text/dfont.rb +0 -49
  81. data/examples/text/family_based_styling.rb +0 -25
  82. data/examples/text/flowing_text_with_header_and_footer.rb +0 -37
  83. data/examples/text/font_calculations.rb +0 -92
  84. data/examples/text/font_size.rb +0 -34
  85. data/examples/text/kerning.rb +0 -31
  86. data/examples/text/simple_text.rb +0 -18
  87. data/examples/text/simple_text_ttf.rb +0 -18
  88. data/examples/text/span.rb +0 -30
  89. data/examples/text/text_box.rb +0 -26
  90. data/examples/text/text_flow.rb +0 -68
  91. data/lib/prawn/compatibility.rb +0 -38
  92. data/lib/prawn/document.rb +0 -309
  93. data/lib/prawn/document/annotations.rb +0 -63
  94. data/lib/prawn/document/bounding_box.rb +0 -368
  95. data/lib/prawn/document/destinations.rb +0 -81
  96. data/lib/prawn/document/internals.rb +0 -126
  97. data/lib/prawn/document/page_geometry.rb +0 -79
  98. data/lib/prawn/document/span.rb +0 -55
  99. data/lib/prawn/document/text.rb +0 -185
  100. data/lib/prawn/document/text/box.rb +0 -76
  101. data/lib/prawn/document/text/wrapping.rb +0 -59
  102. data/lib/prawn/encoding.rb +0 -121
  103. data/lib/prawn/errors.rb +0 -40
  104. data/lib/prawn/font.rb +0 -277
  105. data/lib/prawn/font/afm.rb +0 -202
  106. data/lib/prawn/font/dfont.rb +0 -31
  107. data/lib/prawn/font/ttf.rb +0 -326
  108. data/lib/prawn/graphics.rb +0 -257
  109. data/lib/prawn/graphics/color.rb +0 -140
  110. data/lib/prawn/images.rb +0 -339
  111. data/lib/prawn/images/jpg.rb +0 -45
  112. data/lib/prawn/images/png.rb +0 -199
  113. data/lib/prawn/literal_string.rb +0 -14
  114. data/lib/prawn/measurement_extensions.rb +0 -46
  115. data/lib/prawn/measurements.rb +0 -71
  116. data/lib/prawn/name_tree.rb +0 -165
  117. data/lib/prawn/pdf_object.rb +0 -73
  118. data/lib/prawn/reference.rb +0 -59
  119. data/spec/annotations_spec.rb +0 -90
  120. data/spec/bounding_box_spec.rb +0 -141
  121. data/spec/destinations_spec.rb +0 -15
  122. data/spec/document_spec.rb +0 -193
  123. data/spec/font_spec.rb +0 -234
  124. data/spec/graphics_spec.rb +0 -209
  125. data/spec/images_spec.rb +0 -68
  126. data/spec/jpg_spec.rb +0 -25
  127. data/spec/measurement_units_spec.rb +0 -23
  128. data/spec/name_tree_spec.rb +0 -103
  129. data/spec/pdf_object_spec.rb +0 -112
  130. data/spec/png_spec.rb +0 -196
  131. data/spec/reference_spec.rb +0 -42
  132. data/spec/spec_helper.rb +0 -23
  133. data/spec/text_spec.rb +0 -178
  134. data/vendor/pdf-inspector/README +0 -18
  135. data/vendor/pdf-inspector/lib/pdf/inspector.rb +0 -25
  136. data/vendor/pdf-inspector/lib/pdf/inspector/graphics.rb +0 -80
  137. data/vendor/pdf-inspector/lib/pdf/inspector/page.rb +0 -16
  138. data/vendor/pdf-inspector/lib/pdf/inspector/text.rb +0 -31
  139. data/vendor/pdf-inspector/lib/pdf/inspector/xobject.rb +0 -19
  140. data/vendor/ttfunk/data/fonts/DejaVuSans.ttf +0 -0
  141. data/vendor/ttfunk/data/fonts/comicsans.ttf +0 -0
  142. data/vendor/ttfunk/example.rb +0 -45
  143. data/vendor/ttfunk/lib/ttfunk.rb +0 -102
  144. data/vendor/ttfunk/lib/ttfunk/directory.rb +0 -17
  145. data/vendor/ttfunk/lib/ttfunk/encoding/mac_roman.rb +0 -88
  146. data/vendor/ttfunk/lib/ttfunk/encoding/windows_1252.rb +0 -69
  147. data/vendor/ttfunk/lib/ttfunk/reader.rb +0 -44
  148. data/vendor/ttfunk/lib/ttfunk/resource_file.rb +0 -78
  149. data/vendor/ttfunk/lib/ttfunk/subset.rb +0 -18
  150. data/vendor/ttfunk/lib/ttfunk/subset/base.rb +0 -141
  151. data/vendor/ttfunk/lib/ttfunk/subset/mac_roman.rb +0 -46
  152. data/vendor/ttfunk/lib/ttfunk/subset/unicode.rb +0 -48
  153. data/vendor/ttfunk/lib/ttfunk/subset/unicode_8bit.rb +0 -63
  154. data/vendor/ttfunk/lib/ttfunk/subset/windows_1252.rb +0 -51
  155. data/vendor/ttfunk/lib/ttfunk/subset_collection.rb +0 -72
  156. data/vendor/ttfunk/lib/ttfunk/table.rb +0 -46
  157. data/vendor/ttfunk/lib/ttfunk/table/cmap.rb +0 -34
  158. data/vendor/ttfunk/lib/ttfunk/table/cmap/format00.rb +0 -54
  159. data/vendor/ttfunk/lib/ttfunk/table/cmap/format04.rb +0 -126
  160. data/vendor/ttfunk/lib/ttfunk/table/cmap/subtable.rb +0 -79
  161. data/vendor/ttfunk/lib/ttfunk/table/glyf.rb +0 -64
  162. data/vendor/ttfunk/lib/ttfunk/table/glyf/compound.rb +0 -81
  163. data/vendor/ttfunk/lib/ttfunk/table/glyf/simple.rb +0 -37
  164. data/vendor/ttfunk/lib/ttfunk/table/head.rb +0 -44
  165. data/vendor/ttfunk/lib/ttfunk/table/hhea.rb +0 -41
  166. data/vendor/ttfunk/lib/ttfunk/table/hmtx.rb +0 -47
  167. data/vendor/ttfunk/lib/ttfunk/table/kern.rb +0 -79
  168. data/vendor/ttfunk/lib/ttfunk/table/kern/format0.rb +0 -62
  169. data/vendor/ttfunk/lib/ttfunk/table/loca.rb +0 -43
  170. data/vendor/ttfunk/lib/ttfunk/table/maxp.rb +0 -40
  171. data/vendor/ttfunk/lib/ttfunk/table/name.rb +0 -119
  172. data/vendor/ttfunk/lib/ttfunk/table/os2.rb +0 -78
  173. data/vendor/ttfunk/lib/ttfunk/table/post.rb +0 -91
  174. data/vendor/ttfunk/lib/ttfunk/table/post/format10.rb +0 -43
  175. data/vendor/ttfunk/lib/ttfunk/table/post/format20.rb +0 -35
  176. data/vendor/ttfunk/lib/ttfunk/table/post/format25.rb +0 -23
  177. data/vendor/ttfunk/lib/ttfunk/table/post/format30.rb +0 -17
  178. data/vendor/ttfunk/lib/ttfunk/table/post/format40.rb +0 -17
  179. data/vendor/ttfunk/lib/ttfunk/table/simple.rb +0 -14
@@ -1,140 +0,0 @@
1
- # encoding: utf-8
2
-
3
- # color.rb : Implements color handling
4
- #
5
- # Copyright June 2008, Gregory Brown. All Rights Reserved.
6
- #
7
- # This is free software. Please see the LICENSE and COPYING files for details.
8
- #
9
- module Prawn
10
- module Graphics
11
- module Color
12
-
13
- # Sets the fill color.
14
- #
15
- # If a single argument is provided, it should be a 6 digit HTML color
16
- # code.
17
- #
18
- # pdf.fill_color "f0ffc1"
19
- #
20
- # If 4 arguments are provided, the color is assumed to be a CMYK value
21
- # Values range from 0 - 100.
22
- #
23
- # pdf.fill_color 0, 99, 95, 0
24
- #
25
- def fill_color(*color)
26
- return @fill_color if color.empty?
27
- @fill_color = process_color(*color)
28
- set_fill_color
29
- end
30
-
31
- alias_method :fill_color=, :fill_color
32
-
33
- # Sets the line stroking color. 6 digit HTML color codes are used.
34
- #
35
- # If a single argument is provided, it should be a 6 digit HTML color
36
- # code.
37
- #
38
- # pdf.fill_color "f0ffc1"
39
- #
40
- # If 4 arguments are provided, the color is assumed to be a CMYK value
41
- # Values range from 0 - 100.
42
- #
43
- # pdf.fill_color 0, 99, 95, 0
44
- #
45
- def stroke_color(*color)
46
- return @stroke_color if color.empty?
47
- @stroke_color = process_color(*color)
48
- set_stroke_color
49
- end
50
-
51
- alias_method :stroke_color=, :stroke_color
52
-
53
- # Provides the following shortcuts:
54
- #
55
- # stroke_some_method(*args) #=> some_method(*args); stroke
56
- # fill_some_method(*args) #=> some_method(*args); fill
57
- #
58
- def method_missing(id,*args,&block)
59
- case(id.to_s)
60
- when /^fill_and_stroke_(.*)/
61
- send($1,*args,&block); fill_and_stroke
62
- when /^stroke_(.*)/
63
- send($1,*args,&block); stroke
64
- when /^fill_(.*)/
65
- send($1,*args,&block); fill
66
- else
67
- super
68
- end
69
- end
70
-
71
- module_function
72
-
73
- # Converts RGB value array to hex string suitable for use with fill_color
74
- # and stroke_color
75
- #
76
- # >> Prawn::Graphics::Color.rgb2hex([255,120,8])
77
- # => "ff7808"
78
- #
79
- def rgb2hex(rgb)
80
- rgb.map { |e| "%02x" % e }.join
81
- end
82
-
83
- # Converts hex string into RGB value array:
84
- #
85
- # >> Prawn::Graphics::Color.hex2rgb("ff7808")
86
- # => [255, 120, 8]
87
- #
88
- def hex2rgb(hex)
89
- r,g,b = hex[0..1], hex[2..3], hex[4..5]
90
- [r,g,b].map { |e| e.to_i(16) }
91
- end
92
-
93
- private
94
-
95
- def process_color(*color)
96
- case(color.size)
97
- when 1
98
- color[0]
99
- when 4
100
- color
101
- else
102
- raise ArgumentError, 'wrong number of arguments supplied'
103
- end
104
- end
105
-
106
- def set_fill_color
107
- case @fill_color
108
- when String
109
- r,g,b = hex2rgb(@fill_color)
110
- add_content "%.3f %.3f %.3f rg" %
111
- [r / 255.0, g / 255.0, b / 255.0]
112
- when Array
113
- c,m,y,k = *@fill_color
114
- add_content "%.3f %.3f %.3f %.3f k" %
115
- [c / 100.0, m / 100.0, y / 100.0, k / 100.0]
116
- end
117
- end
118
-
119
- def set_stroke_color
120
- case @stroke_color
121
- when String
122
- r,g,b = hex2rgb(@stroke_color)
123
- add_content "%.3f %.3f %.3f RG" %
124
- [r / 255.0, g / 255.0, b / 255.0]
125
- when Array
126
- c,m,y,k = *@stroke_color
127
- add_content "%.3f %.3f %.3f %.3f K" %
128
- [c / 100.0, m / 100.0, y / 100.0, k / 100.0]
129
- end
130
- end
131
-
132
- def update_colors
133
- @fill_color ||= "000000"
134
- @stroke_color ||= "000000"
135
- set_fill_color
136
- set_stroke_color
137
- end
138
- end
139
- end
140
- end
data/lib/prawn/images.rb DELETED
@@ -1,339 +0,0 @@
1
- # encoding: ASCII-8BIT
2
- # images.rb : Implements PDF image embedding
3
- #
4
- # Copyright April 2008, James Healy, Gregory Brown. All Rights Reserved.
5
- #
6
- # This is free software. Please see the LICENSE and COPYING files for details.
7
-
8
- require 'digest/sha1'
9
-
10
- module Prawn
11
-
12
- module Images
13
-
14
- # add the image at filename to the current page. Currently only
15
- # JPG and PNG files are supported.
16
- #
17
- # Arguments:
18
- # <tt>file</tt>:: path to file or an object that responds to #read
19
- #
20
- # Options:
21
- # <tt>:at</tt>:: an array [x,y] with the location of the top left corner of the image.
22
- # <tt>:position</tt>:: One of (:left, :center, :right) or an x-offset
23
- # <tt>:vposition</tt>:: One of (:top, :center, :center) or an y-offset
24
- # <tt>:height</tt>:: the height of the image [actual height of the image]
25
- # <tt>:width</tt>:: the width of the image [actual width of the image]
26
- # <tt>:scale</tt>:: scale the dimensions of the image proportionally
27
- # <tt>:fit</tt>:: scale the dimensions of the image proportionally to fit inside [width,height]
28
- #
29
- # Prawn::Document.generate("image2.pdf", :page_layout => :landscape) do
30
- # pigs = "#{Prawn::BASEDIR}/data/images/pigs.jpg"
31
- # image pigs, :at => [50,450], :width => 450
32
- #
33
- # dice = "#{Prawn::BASEDIR}/data/images/dice.png"
34
- # image dice, :at => [50, 450], :scale => 0.75
35
- # end
36
- #
37
- # If only one of :width / :height are provided, the image will be scaled
38
- # proportionally. When both are provided, the image will be stretched to
39
- # fit the dimensions without maintaining the aspect ratio.
40
- #
41
- #
42
- # If :at is provided, the image will be place in the current page but
43
- # the text position will not be changed.
44
- #
45
- #
46
- # If instead of an explicit filename, an object with a read method is
47
- # passed as +file+, you can embed images from IO objects and things
48
- # that act like them (including Tempfiles and open-uri objects).
49
- #
50
- # require "open-uri"
51
- #
52
- # Prawn::Document.generate("remote_images.pdf") do
53
- # image open("http://prawn.majesticseacreature.com/media/prawn_logo.png")
54
- # end
55
- #
56
- # This method returns an image info object which can be used to check the
57
- # dimensions of an image object if needed.
58
- # (See also: Prawn::Images::PNG , Prawn::Images::JPG)
59
- #
60
- def image(file, options={})
61
- Prawn.verify_options [:at, :position, :vposition, :height,
62
- :width, :scale, :fit], options
63
-
64
- if file.respond_to?(:read)
65
- image_content = file.read
66
- else
67
- raise ArgumentError, "#{file} not found" unless File.file?(file)
68
- image_content = File.binread(file)
69
- end
70
-
71
- image_sha1 = Digest::SHA1.hexdigest(image_content)
72
-
73
- # register the fact that the current page uses images
74
- proc_set :ImageC
75
-
76
- # if this image has already been embedded, just reuse it
77
- image_obj = image_registry[image_sha1]
78
-
79
- if image_registry[image_sha1]
80
- info = image_registry[image_sha1][:info]
81
- image_obj = image_registry[image_sha1][:obj]
82
- else
83
- # build the image object and embed the raw data
84
- image_obj = case detect_image_format(image_content)
85
- when :jpg then
86
- info = Prawn::Images::JPG.new(image_content)
87
- build_jpg_object(image_content, info)
88
- when :png then
89
- info = Prawn::Images::PNG.new(image_content)
90
- build_png_object(image_content, info)
91
- end
92
- image_registry[image_sha1] = {:obj => image_obj, :info => info}
93
- end
94
-
95
- # find where the image will be placed and how big it will be
96
- w,h = calc_image_dimensions(info, options)
97
-
98
- if options[:at]
99
- x,y = translate(options[:at])
100
- else
101
- x,y = image_position(w,h,options)
102
- move_text_position h
103
- end
104
-
105
- # add a reference to the image object to the current page
106
- # resource list and give it a label
107
- label = "I#{next_image_id}"
108
- page_xobjects.merge!( label => image_obj )
109
-
110
- # add the image to the current page
111
- instruct = "\nq\n%.3f 0 0 %.3f %.3f %.3f cm\n/%s Do\nQ"
112
- add_content instruct % [ w, h, x, y - h, label ]
113
-
114
- return info
115
- end
116
-
117
- private
118
-
119
- def image_position(w,h,options)
120
- options[:position] ||= :left
121
-
122
- x = case options[:position]
123
- when :left
124
- bounds.absolute_left
125
- when :center
126
- bounds.absolute_left + (bounds.width - w) / 2.0
127
- when :right
128
- bounds.absolute_right - w
129
- when Numeric
130
- options[:position] + bounds.absolute_left
131
- end
132
-
133
- y = case options[:vposition]
134
- when :top
135
- bounds.absolute_top
136
- when :center
137
- bounds.absolute_top - (bounds.height - h) / 2.0
138
- when :bottom
139
- bounds.absolute_bottom + h
140
- when Numeric
141
- bounds.absolute_top - options[:vposition]
142
- else
143
- self.y
144
- end
145
- return [x,y]
146
- end
147
-
148
- def build_jpg_object(data, jpg)
149
- color_space = case jpg.channels
150
- when 1
151
- :DeviceGray
152
- when 3
153
- :DeviceRGB
154
- when 4
155
- :DeviceCMYK
156
- else
157
- raise ArgumentError, 'JPG uses an unsupported number of channels'
158
- end
159
- obj = ref(:Type => :XObject,
160
- :Subtype => :Image,
161
- :Filter => :DCTDecode,
162
- :ColorSpace => color_space,
163
- :BitsPerComponent => jpg.bits,
164
- :Width => jpg.width,
165
- :Height => jpg.height,
166
- :Length => data.size )
167
-
168
- # add extra decode params for CMYK images. By swapping the
169
- # min and max values from the default, we invert the colours. See
170
- # section 4.8.4 of the spec.
171
- if color_space == :DeviceCMYK
172
- obj.data[:Decode] = [ 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0 ]
173
- end
174
-
175
- obj << data
176
- return obj
177
- end
178
-
179
- def build_png_object(data, png)
180
-
181
- if png.compression_method != 0
182
- raise ArgumentError, 'PNG uses an unsupported compression method'
183
- end
184
-
185
- if png.filter_method != 0
186
- raise ArgumentError, 'PNG uses an unsupported filter method'
187
- end
188
-
189
- if png.interlace_method != 0
190
- raise ArgumentError, 'PNG uses unsupported interlace method'
191
- end
192
-
193
- if png.bits > 8
194
- raise ArgumentError, 'PNG uses more than 8 bits'
195
- end
196
-
197
- case png.pixel_bytes
198
- when 1
199
- color = :DeviceGray
200
- when 3
201
- color = :DeviceRGB
202
- end
203
-
204
- # build the image dict
205
- obj = ref(:Type => :XObject,
206
- :Subtype => :Image,
207
- :Height => png.height,
208
- :Width => png.width,
209
- :BitsPerComponent => png.bits,
210
- :Length => png.img_data.size,
211
- :Filter => :FlateDecode
212
-
213
- )
214
-
215
- unless png.alpha_channel
216
- obj.data[:DecodeParms] = {:Predictor => 15,
217
- :Colors => png.pixel_bytes,
218
- :Columns => png.width}
219
- end
220
-
221
- # append the actual image data to the object as a stream
222
- obj << png.img_data
223
-
224
- # sort out the colours of the image
225
- if png.palette.empty?
226
- obj.data[:ColorSpace] = color
227
- else
228
- # embed the colour palette in the PDF as a object stream
229
- palette_obj = ref(:Length => png.palette.size)
230
- palette_obj << png.palette
231
-
232
- # build the color space array for the image
233
- obj.data[:ColorSpace] = [:Indexed,
234
- :DeviceRGB,
235
- (png.palette.size / 3) -1,
236
- palette_obj]
237
- end
238
-
239
- # *************************************
240
- # add transparency data if necessary
241
- # *************************************
242
-
243
- # For PNG color types 0, 2 and 3, the transparency data is stored in
244
- # a dedicated PNG chunk, and is exposed via the transparency attribute
245
- # of the PNG class.
246
- if png.transparency[:grayscale]
247
- # Use Color Key Masking (spec section 4.8.5)
248
- # - An array with N elements, where N is two times the number of color
249
- # components.
250
- val = png.transparency[:grayscale]
251
- obj.data[:Mask] = [val, val]
252
- elsif png.transparency[:rgb]
253
- # Use Color Key Masking (spec section 4.8.5)
254
- # - An array with N elements, where N is two times the number of color
255
- # components.
256
- rgb = png.transparency[:rgb]
257
- obj.data[:Mask] = rgb.collect { |val| [val,val] }.flatten
258
- elsif png.transparency[:indexed]
259
- # TODO: broken. I was attempting to us Color Key Masking, but I think
260
- # we need to construct an SMask i think. Maybe do it inside
261
- # the PNG class, and store it in alpha_channel
262
- #obj.data[:Mask] = png.transparency[:indexed]
263
- end
264
-
265
- # For PNG color types 4 and 6, the transparency data is stored as a alpha
266
- # channel mixed in with the main image data. The PNG class seperates
267
- # it out for us and makes it available via the alpha_channel attribute
268
- if png.alpha_channel
269
- smask_obj = ref(:Type => :XObject,
270
- :Subtype => :Image,
271
- :Height => png.height,
272
- :Width => png.width,
273
- :BitsPerComponent => 8,
274
- :Length => png.alpha_channel.size,
275
- :Filter => :FlateDecode,
276
- :ColorSpace => :DeviceGray,
277
- :Decode => [0, 1]
278
- )
279
- smask_obj << png.alpha_channel
280
- obj.data[:SMask] = smask_obj
281
- end
282
-
283
- return obj
284
- end
285
-
286
- def calc_image_dimensions(info, options)
287
- w = options[:width] || info.width
288
- h = options[:height] || info.height
289
-
290
- if options[:width] && !options[:height]
291
- wp = w / info.width.to_f
292
- w = info.width * wp
293
- h = info.height * wp
294
- elsif options[:height] && !options[:width]
295
- hp = h / info.height.to_f
296
- w = info.width * hp
297
- h = info.height * hp
298
- elsif options[:scale]
299
- w = info.width * options[:scale]
300
- h = info.height * options[:scale]
301
- elsif options[:fit]
302
- bw, bh = options[:fit]
303
- bp = bw / bh.to_f
304
- ip = info.width / info.height.to_f
305
- if ip > bp
306
- w = bw
307
- h = bw / ip
308
- else
309
- h = bh
310
- w = bh * ip
311
- end
312
- end
313
- info.scaled_width = w
314
- info.scaled_height = h
315
- [w,h]
316
- end
317
-
318
- def detect_image_format(content)
319
- top = content[0,128]
320
-
321
- if top[0, 3] == "\xff\xd8\xff"
322
- return :jpg
323
- elsif top[0, 8] == "\x89PNG\x0d\x0a\x1a\x0a"
324
- return :png
325
- else
326
- raise ArgumentError, "Unsupported Image Type"
327
- end
328
- end
329
-
330
- def image_registry
331
- @image_registry ||= {}
332
- end
333
-
334
- def next_image_id
335
- @image_counter ||= 0
336
- @image_counter += 1
337
- end
338
- end
339
- end