prawn 2.0.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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|
|