prawn 2.0.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +7 -5
- data/lib/prawn.rb +4 -4
- data/lib/prawn/document.rb +47 -46
- data/lib/prawn/document/bounding_box.rb +13 -19
- data/lib/prawn/document/column_box.rb +3 -5
- data/lib/prawn/document/internals.rb +0 -1
- data/lib/prawn/document/span.rb +12 -12
- data/lib/prawn/errors.rb +32 -33
- data/lib/prawn/font.rb +29 -36
- data/lib/prawn/font/afm.rb +20 -20
- data/lib/prawn/font/dfont.rb +0 -1
- data/lib/prawn/font/ttf.rb +30 -27
- data/lib/prawn/font_metric_cache.rb +4 -8
- data/lib/prawn/graphics.rb +37 -42
- data/lib/prawn/graphics/cap_style.rb +1 -1
- data/lib/prawn/graphics/color.rb +21 -23
- data/lib/prawn/graphics/dash.rb +5 -6
- data/lib/prawn/graphics/join_style.rb +1 -2
- data/lib/prawn/graphics/patterns.rb +25 -21
- data/lib/prawn/graphics/transformation.rb +4 -5
- data/lib/prawn/graphics/transparency.rb +6 -8
- data/lib/prawn/grid.rb +21 -14
- data/lib/prawn/image_handler.rb +2 -2
- data/lib/prawn/images.rb +29 -31
- data/lib/prawn/images/image.rb +1 -1
- data/lib/prawn/images/jpg.rb +10 -12
- data/lib/prawn/images/png.rb +13 -13
- data/lib/prawn/measurements.rb +7 -14
- data/lib/prawn/outline.rb +6 -6
- data/lib/prawn/repeater.rb +1 -5
- data/lib/prawn/security.rb +17 -25
- data/lib/prawn/security/arcfour.rb +1 -1
- data/lib/prawn/soft_mask.rb +11 -12
- data/lib/prawn/stamp.rb +16 -8
- data/lib/prawn/text.rb +23 -20
- data/lib/prawn/text/box.rb +3 -6
- data/lib/prawn/text/formatted/arranger.rb +9 -12
- data/lib/prawn/text/formatted/box.rb +23 -22
- data/lib/prawn/text/formatted/fragment.rb +0 -4
- data/lib/prawn/text/formatted/line_wrap.rb +13 -24
- data/lib/prawn/text/formatted/parser.rb +16 -20
- data/lib/prawn/text/formatted/wrap.rb +2 -7
- data/lib/prawn/utilities.rb +6 -3
- data/lib/prawn/version.rb +1 -1
- data/manual/basic_concepts/basic_concepts.rb +0 -2
- data/manual/basic_concepts/view.rb +1 -1
- data/manual/bounding_box/bounding_box.rb +0 -3
- data/manual/bounding_box/russian_boxes.rb +7 -8
- data/manual/bounding_box/stretchy.rb +0 -1
- data/manual/contents.rb +2 -2
- data/manual/cover.rb +11 -12
- data/manual/document_and_page_options/document_and_page_options.rb +2 -5
- data/manual/document_and_page_options/metadata.rb +10 -10
- data/manual/document_and_page_options/page_size.rb +0 -1
- data/manual/graphics/fill_rules.rb +5 -4
- data/manual/graphics/graphics.rb +0 -3
- data/manual/graphics/lines_and_curves.rb +1 -1
- data/manual/graphics/rotate.rb +0 -2
- data/manual/graphics/scale.rb +4 -2
- data/manual/graphics/soft_masks.rb +0 -1
- data/manual/graphics/stroke_cap.rb +1 -1
- data/manual/graphics/stroke_join.rb +1 -1
- data/manual/graphics/translate.rb +3 -3
- data/manual/graphics/transparency.rb +0 -1
- data/manual/how_to_read_this_manual.rb +0 -1
- data/manual/images/images.rb +0 -3
- data/manual/layout/boxes.rb +5 -5
- data/manual/layout/content.rb +2 -2
- data/manual/layout/layout.rb +0 -3
- data/manual/outline/outline.rb +0 -3
- data/manual/repeatable_content/page_numbering.rb +1 -1
- data/manual/repeatable_content/repeatable_content.rb +0 -3
- data/manual/repeatable_content/repeater.rb +6 -6
- data/manual/security/encryption.rb +0 -2
- data/manual/security/permissions.rb +0 -2
- data/manual/security/security.rb +0 -3
- data/manual/text/alignment.rb +3 -3
- data/manual/text/color.rb +0 -1
- data/manual/text/column_box.rb +0 -1
- data/manual/text/fallback_fonts.rb +2 -2
- data/manual/text/formatted_callbacks.rb +3 -2
- data/manual/text/paragraph_indentation.rb +2 -3
- data/manual/text/registering_families.rb +13 -9
- data/manual/text/rotation.rb +0 -1
- data/manual/text/text.rb +0 -3
- data/manual/text/text_box_overflow.rb +7 -5
- data/manual/text/utf8.rb +1 -1
- data/manual/text/win_ansi_charset.rb +2 -2
- data/prawn.gemspec +4 -4
- data/spec/acceptance/png.rb +6 -7
- data/spec/annotations_spec.rb +21 -28
- data/spec/bounding_box_spec.rb +100 -109
- data/spec/column_box_spec.rb +26 -32
- data/spec/destinations_spec.rb +2 -4
- data/spec/document_spec.rb +145 -151
- data/spec/extensions/mocha.rb +0 -1
- data/spec/font_metric_cache_spec.rb +7 -7
- data/spec/font_spec.rb +103 -102
- data/spec/formatted_text_arranger_spec.rb +76 -74
- data/spec/formatted_text_box_spec.rb +170 -159
- data/spec/formatted_text_fragment_spec.rb +57 -56
- data/spec/graphics_spec.rb +158 -175
- data/spec/grid_spec.rb +28 -29
- data/spec/image_handler_spec.rb +4 -5
- data/spec/images_spec.rb +50 -36
- data/spec/inline_formatted_text_parser_spec.rb +397 -393
- data/spec/jpg_spec.rb +4 -6
- data/spec/line_wrap_spec.rb +54 -55
- data/spec/measurement_units_spec.rb +12 -15
- data/spec/outline_spec.rb +77 -98
- data/spec/png_spec.rb +55 -65
- data/spec/reference_spec.rb +3 -3
- data/spec/repeater_spec.rb +20 -26
- data/spec/security_spec.rb +42 -49
- data/spec/soft_mask_spec.rb +4 -5
- data/spec/span_spec.rb +5 -6
- data/spec/spec_helper.rb +2 -4
- data/spec/stamp_spec.rb +41 -22
- data/spec/stroke_styles_spec.rb +36 -39
- data/spec/text_at_spec.rb +28 -29
- data/spec/text_box_spec.rb +160 -165
- data/spec/text_rendering_mode_spec.rb +9 -9
- data/spec/text_spacing_spec.rb +13 -13
- data/spec/text_spec.rb +116 -124
- data/spec/text_with_inline_formatting_spec.rb +5 -5
- data/spec/transparency_spec.rb +20 -20
- data/spec/view_spec.rb +0 -1
- metadata +7 -7
data/lib/prawn/errors.rb
CHANGED
@@ -8,45 +8,45 @@
|
|
8
8
|
#
|
9
9
|
module Prawn
|
10
10
|
module Errors
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
# Raised when a table is spanned in an impossible way.
|
12
|
+
#
|
13
|
+
InvalidTableSpan = Class.new(StandardError)
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
# This error is raised when a method requiring a current page is called
|
16
|
+
# without being on a page.
|
17
|
+
#
|
18
|
+
NotOnPage = Class.new(StandardError)
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
# This error is raised when Prawn cannot find a specified font
|
21
|
+
#
|
22
|
+
UnknownFont = Class.new(StandardError)
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
# Raised when Prawn is asked to draw something into a too-small box
|
25
|
+
#
|
26
|
+
CannotFit = Class.new(StandardError)
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
# Raised if group() is called with a block that is too big to be
|
29
|
+
# rendered in the current context.
|
30
|
+
#
|
31
|
+
CannotGroup = Class.new(StandardError)
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
# This error is raised when Prawn is being used on a M17N aware VM,
|
34
|
+
# and the user attempts to add text that isn't compatible with UTF-8
|
35
|
+
# to their document
|
36
|
+
#
|
37
|
+
IncompatibleStringEncoding = Class.new(StandardError)
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
39
|
+
# This error is raised when Prawn encounters an unknown key in functions
|
40
|
+
# that accept an options hash. This usually means there is a typo in your
|
41
|
+
# code or that the option you are trying to use has a different name than
|
42
|
+
# what you have specified.
|
43
|
+
#
|
44
|
+
UnknownOption = Class.new(StandardError)
|
45
45
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
46
|
+
# this error is raised when a user attempts to embed an image of an unsupported
|
47
|
+
# type. This can either a completely unsupported format, or a dialect of a
|
48
|
+
# supported format (ie. some types of PNG)
|
49
|
+
UnsupportedImageType = Class.new(StandardError)
|
50
50
|
|
51
51
|
# This error is raised when a named element has alredy been
|
52
52
|
# created. For example, in the stamp module, stamps must have
|
@@ -75,6 +75,5 @@ module Prawn
|
|
75
75
|
# Raised when unrecognized content is provided for a table cell.
|
76
76
|
#
|
77
77
|
UnrecognizedTableContent = Class.new(StandardError)
|
78
|
-
|
79
78
|
end
|
80
79
|
end
|
data/lib/prawn/font.rb
CHANGED
@@ -12,7 +12,6 @@ require_relative "font/dfont"
|
|
12
12
|
require_relative "font_metric_cache"
|
13
13
|
|
14
14
|
module Prawn
|
15
|
-
|
16
15
|
class Document
|
17
16
|
# @group Stable API
|
18
17
|
|
@@ -48,11 +47,11 @@ module Prawn
|
|
48
47
|
# the :style option you need to map those font styles to their respective font files.
|
49
48
|
# See font_families for more information.
|
50
49
|
#
|
51
|
-
def font(name=nil, options={})
|
50
|
+
def font(name = nil, options = {})
|
52
51
|
return((defined?(@font) && @font) || font("Helvetica")) if name.nil?
|
53
52
|
|
54
53
|
if state.pages.empty? && !state.page.in_stamp_stream?
|
55
|
-
|
54
|
+
fail Prawn::Errors::NotOnPage
|
56
55
|
end
|
57
56
|
|
58
57
|
new_font = find_font(name.to_s, options)
|
@@ -95,7 +94,7 @@ module Prawn
|
|
95
94
|
# When called without an argument, this method returns the current font
|
96
95
|
# size.
|
97
96
|
#
|
98
|
-
def font_size(points=nil)
|
97
|
+
def font_size(points = nil)
|
99
98
|
return @font_size unless points
|
100
99
|
size_before_yield = @font_size
|
101
100
|
@font_size = points
|
@@ -127,7 +126,7 @@ module Prawn
|
|
127
126
|
# By putting width_of here, on Document itself, extensions may easily override
|
128
127
|
# it and redefine the width calculation behavior.
|
129
128
|
#++
|
130
|
-
def width_of(string, options={})
|
129
|
+
def width_of(string, options = {})
|
131
130
|
if p = options[:inline_format]
|
132
131
|
p = [] unless p.is_a?(Array)
|
133
132
|
|
@@ -170,21 +169,21 @@ module Prawn
|
|
170
169
|
#
|
171
170
|
def font_families
|
172
171
|
@font_families ||= {}.merge!(
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
172
|
+
"Courier" => { :bold => "Courier-Bold",
|
173
|
+
:italic => "Courier-Oblique",
|
174
|
+
:bold_italic => "Courier-BoldOblique",
|
175
|
+
:normal => "Courier" },
|
176
|
+
|
177
|
+
"Times-Roman" => { :bold => "Times-Bold",
|
178
|
+
:italic => "Times-Italic",
|
179
|
+
:bold_italic => "Times-BoldItalic",
|
180
|
+
:normal => "Times-Roman" },
|
181
|
+
|
182
|
+
"Helvetica" => { :bold => "Helvetica-Bold",
|
183
|
+
:italic => "Helvetica-Oblique",
|
184
|
+
:bold_italic => "Helvetica-BoldOblique",
|
185
|
+
:normal => "Helvetica" }
|
186
|
+
)
|
188
187
|
end
|
189
188
|
|
190
189
|
# @group Experimental API
|
@@ -192,7 +191,7 @@ module Prawn
|
|
192
191
|
# Sets the font directly, given an actual Font object
|
193
192
|
# and size.
|
194
193
|
#
|
195
|
-
def set_font(font, size=nil) # :nodoc:
|
194
|
+
def set_font(font, size = nil) # :nodoc:
|
196
195
|
@font = font
|
197
196
|
@font_size = size if size
|
198
197
|
end
|
@@ -228,7 +227,7 @@ module Prawn
|
|
228
227
|
# ++
|
229
228
|
#
|
230
229
|
# @private
|
231
|
-
def find_font(name, options={}) #:nodoc:
|
230
|
+
def find_font(name, options = {}) #:nodoc:
|
232
231
|
if font_families.key?(name)
|
233
232
|
family, name = name, font_families[name][options[:style] || :normal]
|
234
233
|
if name.is_a?(::Hash)
|
@@ -241,10 +240,7 @@ module Prawn
|
|
241
240
|
if name.is_a? Prawn::Font
|
242
241
|
font_registry[key] = name
|
243
242
|
else
|
244
|
-
font_registry[key] ||= Font.load(
|
245
|
-
name,
|
246
|
-
options.merge(family: family)
|
247
|
-
)
|
243
|
+
font_registry[key] ||= Font.load(self, name, options.merge(family: family))
|
248
244
|
end
|
249
245
|
end
|
250
246
|
|
@@ -256,7 +252,7 @@ module Prawn
|
|
256
252
|
|
257
253
|
private
|
258
254
|
|
259
|
-
def width_of_inline_formatted_string(string, options={})
|
255
|
+
def width_of_inline_formatted_string(string, options = {})
|
260
256
|
# Build up an Arranger with the entire string on one line, finalize it,
|
261
257
|
# and find its width.
|
262
258
|
arranger = Prawn::Text::Formatted::Arranger.new(self, options)
|
@@ -266,15 +262,14 @@ module Prawn
|
|
266
262
|
arranger.line_width
|
267
263
|
end
|
268
264
|
|
269
|
-
def width_of_string(string, options={})
|
270
|
-
font_metric_cache.width_of(
|
265
|
+
def width_of_string(string, options = {})
|
266
|
+
font_metric_cache.width_of(string, options)
|
271
267
|
end
|
272
268
|
end
|
273
269
|
|
274
270
|
# Provides font information and helper functions.
|
275
271
|
#
|
276
272
|
class Font
|
277
|
-
|
278
273
|
# The current font name
|
279
274
|
attr_reader :name
|
280
275
|
|
@@ -287,7 +282,7 @@ module Prawn
|
|
287
282
|
# Shortcut interface for constructing a font object. Filenames of the form
|
288
283
|
# *.ttf will call Font::TTF.new, *.dfont Font::DFont.new, and anything else
|
289
284
|
# will be passed through to Font::AFM.new()
|
290
|
-
def self.load(document, src, options={})
|
285
|
+
def self.load(document, src, options = {})
|
291
286
|
case font_format(src, options)
|
292
287
|
when 'ttf' then TTF.new(document, src, options)
|
293
288
|
when 'dfont' then DFont.new(document, src, options)
|
@@ -305,7 +300,7 @@ module Prawn
|
|
305
300
|
end
|
306
301
|
end
|
307
302
|
|
308
|
-
def initialize(document,name,options={}) #:nodoc:
|
303
|
+
def initialize(document, name, options = {}) #:nodoc:
|
309
304
|
@document = document
|
310
305
|
@name = name
|
311
306
|
@options = options
|
@@ -340,7 +335,7 @@ module Prawn
|
|
340
335
|
# and the new string will be returned. For an in-place (destructive)
|
341
336
|
# version, see normalize_encoding!.
|
342
337
|
def normalize_encoding(string)
|
343
|
-
|
338
|
+
fail NotImplementedError, "subclasses of Prawn::Font must implement #normalize_encoding"
|
344
339
|
end
|
345
340
|
|
346
341
|
# Destructive version of normalize_encoding; normalizes the encoding of a
|
@@ -391,7 +386,7 @@ module Prawn
|
|
391
386
|
|
392
387
|
# Compliments the #hash implementation above
|
393
388
|
#
|
394
|
-
def eql?(
|
389
|
+
def eql?(other) #:nodoc:
|
395
390
|
self.class == other.class && self.name == other.name &&
|
396
391
|
self.family == other.family && size == other.send(:size)
|
397
392
|
end
|
@@ -407,7 +402,5 @@ module Prawn
|
|
407
402
|
def size
|
408
403
|
@document.font_size
|
409
404
|
end
|
410
|
-
|
411
405
|
end
|
412
|
-
|
413
406
|
end
|
data/lib/prawn/font/afm.rb
CHANGED
@@ -10,7 +10,6 @@ require_relative "../encoding"
|
|
10
10
|
|
11
11
|
module Prawn
|
12
12
|
class Font
|
13
|
-
|
14
13
|
# @private
|
15
14
|
|
16
15
|
class AFM < Font
|
@@ -37,15 +36,16 @@ module Prawn
|
|
37
36
|
".", "/usr/lib/afm",
|
38
37
|
"/usr/local/lib/afm",
|
39
38
|
"/usr/openwin/lib/fonts/afm",
|
40
|
-
|
39
|
+
Prawn::DATADIR + '/fonts'
|
40
|
+
]
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
44
|
attr_reader :attributes #:nodoc:
|
45
45
|
|
46
|
-
def initialize(document, name, options={}) #:nodoc:
|
46
|
+
def initialize(document, name, options = {}) #:nodoc:
|
47
47
|
unless BUILT_INS.include?(name)
|
48
|
-
|
48
|
+
fail Prawn::Errors::UnknownFont, "#{name} is not a known font."
|
49
49
|
end
|
50
50
|
|
51
51
|
super
|
@@ -54,7 +54,7 @@ module Prawn
|
|
54
54
|
|
55
55
|
file_name = @name.dup
|
56
56
|
file_name << ".afm" unless file_name =~ /\.afm$/
|
57
|
-
file_name = file_name[0] ==
|
57
|
+
file_name = file_name[0] == '/' ? file_name : find_font(file_name)
|
58
58
|
|
59
59
|
font_data = @@font_data[file_name] ||= parse_afm(file_name)
|
60
60
|
@glyph_widths = font_data[:glyph_widths]
|
@@ -76,12 +76,12 @@ module Prawn
|
|
76
76
|
end
|
77
77
|
|
78
78
|
# NOTE: String *must* be encoded as WinAnsi
|
79
|
-
def compute_width_of(string, options={}) #:nodoc:
|
79
|
+
def compute_width_of(string, options = {}) #:nodoc:
|
80
80
|
scale = (options[:size] || size) / 1000.0
|
81
81
|
|
82
82
|
if options[:kerning]
|
83
83
|
strings, numbers = kern(string).partition { |e| e.is_a?(String) }
|
84
|
-
total_kerning_offset = numbers.inject(0.0) { |s,r| s + r }
|
84
|
+
total_kerning_offset = numbers.inject(0.0) { |s, r| s + r }
|
85
85
|
(unscaled_width_of(strings.join) - total_kerning_offset) * scale
|
86
86
|
else
|
87
87
|
unscaled_width_of(string) * scale
|
@@ -104,8 +104,8 @@ module Prawn
|
|
104
104
|
::Encoding::UndefinedConversionError
|
105
105
|
|
106
106
|
raise Prawn::Errors::IncompatibleStringEncoding,
|
107
|
-
|
108
|
-
|
107
|
+
"Your document includes text that's not compatible with the Windows-1252 character set.\n" \
|
108
|
+
"If you need full UTF-8 support, use TTF fonts instead of PDF's built-in fonts\n."
|
109
109
|
end
|
110
110
|
|
111
111
|
def to_utf8(text)
|
@@ -130,7 +130,7 @@ module Prawn
|
|
130
130
|
#
|
131
131
|
# The +text+ parameter must be in WinAnsi encoding (cp1252).
|
132
132
|
#
|
133
|
-
def encode_text(text, options={})
|
133
|
+
def encode_text(text, options = {})
|
134
134
|
[[0, options[:kerning] ? kern(text) : text]]
|
135
135
|
end
|
136
136
|
|
@@ -143,9 +143,11 @@ module Prawn
|
|
143
143
|
private
|
144
144
|
|
145
145
|
def register(subset)
|
146
|
-
font_dict = {
|
147
|
-
|
148
|
-
|
146
|
+
font_dict = {
|
147
|
+
:Type => :Font,
|
148
|
+
:Subtype => :Type1,
|
149
|
+
:BaseFont => name.to_sym
|
150
|
+
}
|
149
151
|
|
150
152
|
# Symbolic AFM fonts (Symbol, ZapfDingbats) have their own encodings
|
151
153
|
font_dict.merge!(:Encoding => :WinAnsiEncoding) unless symbolic?
|
@@ -161,12 +163,11 @@ module Prawn
|
|
161
163
|
self.class.metrics_path.find { |f| File.exist? "#{f}/#{file}" } + "/#{file}"
|
162
164
|
rescue NoMethodError
|
163
165
|
raise Prawn::Errors::UnknownFont,
|
164
|
-
|
165
|
-
self.class.metrics_path.join("\n")
|
166
|
+
"Couldn't find the font: #{file} in any of:\n" + self.class.metrics_path.join("\n")
|
166
167
|
end
|
167
168
|
|
168
169
|
def parse_afm(file_name)
|
169
|
-
data = {:glyph_widths => {}, :bounding_boxes => {}, :kern_pairs => {}, :attributes => {}}
|
170
|
+
data = { :glyph_widths => {}, :bounding_boxes => {}, :kern_pairs => {}, :attributes => {} }
|
170
171
|
section = []
|
171
172
|
|
172
173
|
File.foreach(file_name) do |line|
|
@@ -204,12 +205,11 @@ module Prawn
|
|
204
205
|
end
|
205
206
|
|
206
207
|
character_hash = Hash[Encoding::WinAnsi::CHARACTERS.zip((0..Encoding::WinAnsi::CHARACTERS.size).to_a)]
|
207
|
-
data[:kern_pair_table] = data[:kern_pairs].
|
208
|
+
data[:kern_pair_table] = data[:kern_pairs].each_with_object({}) do |p, h|
|
208
209
|
h[p[0].map { |n| character_hash[n] }] = p[1]
|
209
|
-
h
|
210
210
|
end
|
211
211
|
|
212
|
-
data.each_value
|
212
|
+
data.each_value(&:freeze)
|
213
213
|
data.freeze
|
214
214
|
end
|
215
215
|
|
@@ -247,7 +247,7 @@ module Prawn
|
|
247
247
|
private
|
248
248
|
|
249
249
|
def unscaled_width_of(string)
|
250
|
-
string.bytes.inject(0) do |s,r|
|
250
|
+
string.bytes.inject(0) do |s, r|
|
251
251
|
s + @glyph_table[r]
|
252
252
|
end
|
253
253
|
end
|
data/lib/prawn/font/dfont.rb
CHANGED
@@ -12,7 +12,6 @@ module Prawn
|
|
12
12
|
class Font
|
13
13
|
# @private
|
14
14
|
class DFont < TTF
|
15
|
-
|
16
15
|
# Returns a list of the names of all named fonts in the given dfont file.
|
17
16
|
# Note that fonts are not required to be named in a dfont file, so the
|
18
17
|
# list may be empty even if the file does contain fonts. Also, note that
|
data/lib/prawn/font/ttf.rb
CHANGED
@@ -12,7 +12,6 @@ require 'ttfunk/subset_collection'
|
|
12
12
|
|
13
13
|
module Prawn
|
14
14
|
class Font
|
15
|
-
|
16
15
|
# @private
|
17
16
|
class TTF < Font
|
18
17
|
attr_reader :ttf, :subsets
|
@@ -21,7 +20,7 @@ module Prawn
|
|
21
20
|
true
|
22
21
|
end
|
23
22
|
|
24
|
-
def initialize(document, name, options={})
|
23
|
+
def initialize(document, name, options = {})
|
25
24
|
super
|
26
25
|
|
27
26
|
@ttf = read_ttf_file
|
@@ -38,10 +37,10 @@ module Prawn
|
|
38
37
|
end
|
39
38
|
|
40
39
|
# NOTE: +string+ must be UTF8-encoded.
|
41
|
-
def compute_width_of(string, options={}) #:nodoc:
|
40
|
+
def compute_width_of(string, options = {}) #:nodoc:
|
42
41
|
scale = (options[:size] || size) / 1000.0
|
43
42
|
if options[:kerning]
|
44
|
-
kern(string).inject(0) do |s,r|
|
43
|
+
kern(string).inject(0) do |s, r|
|
45
44
|
if r.is_a?(Numeric)
|
46
45
|
s - r
|
47
46
|
else
|
@@ -49,7 +48,7 @@ module Prawn
|
|
49
48
|
end
|
50
49
|
end * scale
|
51
50
|
else
|
52
|
-
string.codepoints.inject(0) do |s,r|
|
51
|
+
string.codepoints.inject(0) do |s, r|
|
53
52
|
s + character_width_by_code(r)
|
54
53
|
end * scale
|
55
54
|
end
|
@@ -74,7 +73,7 @@ module Prawn
|
|
74
73
|
#
|
75
74
|
# The +text+ parameter must be UTF8-encoded.
|
76
75
|
#
|
77
|
-
def encode_text(text,options={})
|
76
|
+
def encode_text(text, options = {})
|
78
77
|
text = text.chomp
|
79
78
|
|
80
79
|
if options[:kerning]
|
@@ -115,14 +114,18 @@ module Prawn
|
|
115
114
|
end
|
116
115
|
|
117
116
|
def italic_angle
|
118
|
-
@italic_angle
|
117
|
+
return @italic_angle if @italic_angle
|
118
|
+
|
119
|
+
if @ttf.postscript.exists?
|
119
120
|
raw = @ttf.postscript.italic_angle
|
120
121
|
hi, low = raw >> 16, raw & 0xFF
|
121
122
|
hi = -((hi ^ 0xFFFF) + 1) if hi & 0x8000 != 0
|
122
|
-
"#{hi}.#{low}".to_f
|
123
|
+
@italic_angle = "#{hi}.#{low}".to_f
|
123
124
|
else
|
124
|
-
0
|
125
|
+
@italic_angle = 0
|
125
126
|
end
|
127
|
+
|
128
|
+
@italic_angle
|
126
129
|
end
|
127
130
|
|
128
131
|
def cap_height
|
@@ -143,7 +146,7 @@ module Prawn
|
|
143
146
|
end
|
144
147
|
|
145
148
|
def serif?
|
146
|
-
@serif ||= [1,2,3,4,5,7].include?(family_class)
|
149
|
+
@serif ||= [1, 2, 3, 4, 5, 7].include?(family_class)
|
147
150
|
end
|
148
151
|
|
149
152
|
def script?
|
@@ -166,9 +169,9 @@ module Prawn
|
|
166
169
|
text.encode(::Encoding::UTF_8)
|
167
170
|
rescue => e
|
168
171
|
puts e
|
169
|
-
raise Prawn::Errors::IncompatibleStringEncoding, "Encoding "
|
170
|
-
"#{text.encoding} can not be transparently converted to UTF-8. "
|
171
|
-
"Please ensure the encoding of the string you are attempting "
|
172
|
+
raise Prawn::Errors::IncompatibleStringEncoding, "Encoding " \
|
173
|
+
"#{text.encoding} can not be transparently converted to UTF-8. " \
|
174
|
+
"Please ensure the encoding of the string you are attempting " \
|
172
175
|
"to use is set correctly"
|
173
176
|
end
|
174
177
|
end
|
@@ -191,7 +194,7 @@ module Prawn
|
|
191
194
|
private
|
192
195
|
|
193
196
|
def cmap
|
194
|
-
@cmap ||= @ttf.cmap.unicode.first or
|
197
|
+
@cmap ||= @ttf.cmap.unicode.first or fail("no unicode cmap for font")
|
195
198
|
end
|
196
199
|
|
197
200
|
# +string+ must be UTF8-encoded.
|
@@ -244,7 +247,7 @@ module Prawn
|
|
244
247
|
end
|
245
248
|
|
246
249
|
def register(subset)
|
247
|
-
temp_name = @ttf.name.postscript_name.gsub("\0","").to_sym
|
250
|
+
temp_name = @ttf.name.postscript_name.gsub("\0", "").to_sym
|
248
251
|
ref = @document.ref!(:Type => :Font, :BaseFont => temp_name)
|
249
252
|
|
250
253
|
# Embed the font metrics in the document after everything has been
|
@@ -264,25 +267,25 @@ module Prawn
|
|
264
267
|
|
265
268
|
# empirically, it looks like Adobe Reader will not display fonts
|
266
269
|
# if their font name is more than 33 bytes long. Strange. But true.
|
267
|
-
basename = font.name.postscript_name[0, 33].gsub("\0","")
|
270
|
+
basename = font.name.postscript_name[0, 33].gsub("\0", "")
|
268
271
|
|
269
|
-
|
272
|
+
fail "Can't detect a postscript name for #{file}" if basename.nil?
|
270
273
|
|
271
274
|
fontfile = @document.ref!(:Length1 => font_content.size)
|
272
275
|
fontfile.stream << font_content
|
273
276
|
fontfile.stream.compress!
|
274
277
|
|
275
278
|
descriptor = @document.ref!(:Type => :FontDescriptor,
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
279
|
+
:FontName => basename.to_sym,
|
280
|
+
:FontFile2 => fontfile,
|
281
|
+
:FontBBox => bbox,
|
282
|
+
:Flags => pdf_flags,
|
283
|
+
:StemV => stemV,
|
284
|
+
:ItalicAngle => italic_angle,
|
285
|
+
:Ascent => @ascender,
|
286
|
+
:Descent => @descender,
|
287
|
+
:CapHeight => cap_height,
|
288
|
+
:XHeight => x_height)
|
286
289
|
|
287
290
|
hmtx = font.horizontal_metrics
|
288
291
|
widths = font.cmap.tables.first.code_map.map { |gid|
|