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.
- data/lib/prawn.rb +2 -72
- metadata +33 -224
- data/COPYING +0 -340
- data/LICENSE +0 -56
- data/README +0 -40
- data/Rakefile +0 -79
- data/data/encodings/win_ansi.txt +0 -29
- data/data/fonts/Action Man.dfont +0 -0
- data/data/fonts/Activa.ttf +0 -0
- data/data/fonts/Chalkboard.ttf +0 -0
- data/data/fonts/Courier-Bold.afm +0 -342
- data/data/fonts/Courier-BoldOblique.afm +0 -342
- data/data/fonts/Courier-Oblique.afm +0 -342
- data/data/fonts/Courier.afm +0 -342
- data/data/fonts/DejaVuSans.ttf +0 -0
- data/data/fonts/Dustismo_Roman.ttf +0 -0
- data/data/fonts/Helvetica-Bold.afm +0 -2827
- data/data/fonts/Helvetica-BoldOblique.afm +0 -2827
- data/data/fonts/Helvetica-Oblique.afm +0 -3051
- data/data/fonts/Helvetica.afm +0 -3051
- data/data/fonts/MustRead.html +0 -19
- data/data/fonts/Symbol.afm +0 -213
- data/data/fonts/Times-Bold.afm +0 -2588
- data/data/fonts/Times-BoldItalic.afm +0 -2384
- data/data/fonts/Times-Italic.afm +0 -2667
- data/data/fonts/Times-Roman.afm +0 -2419
- data/data/fonts/ZapfDingbats.afm +0 -225
- 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/fractal.jpg +0 -0
- data/data/images/letterhead.jpg +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 +0 -1
- data/data/images/web-links.png +0 -0
- data/data/shift_jis_text.txt +0 -1
- data/examples/bounding_box/bounding_boxes.rb +0 -44
- data/examples/bounding_box/lazy_bounding_boxes.rb +0 -28
- data/examples/bounding_box/padded_box.rb +0 -24
- data/examples/bounding_box/russian_boxes.rb +0 -37
- data/examples/general/background.rb +0 -20
- data/examples/general/canvas.rb +0 -16
- data/examples/general/measurement_units.rb +0 -52
- data/examples/general/multi_page_layout.rb +0 -17
- data/examples/general/page_geometry.rb +0 -32
- data/examples/graphics/basic_images.rb +0 -27
- data/examples/graphics/cmyk.rb +0 -13
- data/examples/graphics/curves.rb +0 -12
- data/examples/graphics/hexagon.rb +0 -14
- data/examples/graphics/image_fit.rb +0 -16
- data/examples/graphics/image_flow.rb +0 -38
- data/examples/graphics/image_position.rb +0 -18
- data/examples/graphics/line.rb +0 -33
- data/examples/graphics/png_types.rb +0 -23
- data/examples/graphics/polygons.rb +0 -17
- data/examples/graphics/remote_images.rb +0 -12
- data/examples/graphics/ruport_style_helpers.rb +0 -20
- data/examples/graphics/stroke_bounds.rb +0 -23
- data/examples/m17n/chinese_text_wrapping.rb +0 -20
- data/examples/m17n/euro.rb +0 -16
- data/examples/m17n/sjis.rb +0 -29
- data/examples/m17n/utf8.rb +0 -14
- data/examples/m17n/win_ansi_charset.rb +0 -55
- data/examples/text/alignment.rb +0 -19
- data/examples/text/dfont.rb +0 -49
- data/examples/text/family_based_styling.rb +0 -25
- data/examples/text/flowing_text_with_header_and_footer.rb +0 -37
- data/examples/text/font_calculations.rb +0 -92
- data/examples/text/font_size.rb +0 -34
- data/examples/text/kerning.rb +0 -31
- data/examples/text/simple_text.rb +0 -18
- data/examples/text/simple_text_ttf.rb +0 -18
- data/examples/text/span.rb +0 -30
- data/examples/text/text_box.rb +0 -26
- data/examples/text/text_flow.rb +0 -68
- data/lib/prawn/compatibility.rb +0 -38
- data/lib/prawn/document.rb +0 -309
- data/lib/prawn/document/annotations.rb +0 -63
- data/lib/prawn/document/bounding_box.rb +0 -368
- data/lib/prawn/document/destinations.rb +0 -81
- data/lib/prawn/document/internals.rb +0 -126
- data/lib/prawn/document/page_geometry.rb +0 -79
- data/lib/prawn/document/span.rb +0 -55
- data/lib/prawn/document/text.rb +0 -185
- data/lib/prawn/document/text/box.rb +0 -76
- data/lib/prawn/document/text/wrapping.rb +0 -59
- data/lib/prawn/encoding.rb +0 -121
- data/lib/prawn/errors.rb +0 -40
- data/lib/prawn/font.rb +0 -277
- data/lib/prawn/font/afm.rb +0 -202
- data/lib/prawn/font/dfont.rb +0 -31
- data/lib/prawn/font/ttf.rb +0 -326
- data/lib/prawn/graphics.rb +0 -257
- data/lib/prawn/graphics/color.rb +0 -140
- data/lib/prawn/images.rb +0 -339
- data/lib/prawn/images/jpg.rb +0 -45
- data/lib/prawn/images/png.rb +0 -199
- data/lib/prawn/literal_string.rb +0 -14
- data/lib/prawn/measurement_extensions.rb +0 -46
- data/lib/prawn/measurements.rb +0 -71
- data/lib/prawn/name_tree.rb +0 -165
- data/lib/prawn/pdf_object.rb +0 -73
- data/lib/prawn/reference.rb +0 -59
- data/spec/annotations_spec.rb +0 -90
- data/spec/bounding_box_spec.rb +0 -141
- data/spec/destinations_spec.rb +0 -15
- data/spec/document_spec.rb +0 -193
- data/spec/font_spec.rb +0 -234
- data/spec/graphics_spec.rb +0 -209
- data/spec/images_spec.rb +0 -68
- data/spec/jpg_spec.rb +0 -25
- data/spec/measurement_units_spec.rb +0 -23
- data/spec/name_tree_spec.rb +0 -103
- data/spec/pdf_object_spec.rb +0 -112
- data/spec/png_spec.rb +0 -196
- data/spec/reference_spec.rb +0 -42
- data/spec/spec_helper.rb +0 -23
- data/spec/text_spec.rb +0 -178
- data/vendor/pdf-inspector/README +0 -18
- data/vendor/pdf-inspector/lib/pdf/inspector.rb +0 -25
- data/vendor/pdf-inspector/lib/pdf/inspector/graphics.rb +0 -80
- data/vendor/pdf-inspector/lib/pdf/inspector/page.rb +0 -16
- data/vendor/pdf-inspector/lib/pdf/inspector/text.rb +0 -31
- data/vendor/pdf-inspector/lib/pdf/inspector/xobject.rb +0 -19
- data/vendor/ttfunk/data/fonts/DejaVuSans.ttf +0 -0
- data/vendor/ttfunk/data/fonts/comicsans.ttf +0 -0
- data/vendor/ttfunk/example.rb +0 -45
- data/vendor/ttfunk/lib/ttfunk.rb +0 -102
- data/vendor/ttfunk/lib/ttfunk/directory.rb +0 -17
- data/vendor/ttfunk/lib/ttfunk/encoding/mac_roman.rb +0 -88
- data/vendor/ttfunk/lib/ttfunk/encoding/windows_1252.rb +0 -69
- data/vendor/ttfunk/lib/ttfunk/reader.rb +0 -44
- data/vendor/ttfunk/lib/ttfunk/resource_file.rb +0 -78
- data/vendor/ttfunk/lib/ttfunk/subset.rb +0 -18
- data/vendor/ttfunk/lib/ttfunk/subset/base.rb +0 -141
- data/vendor/ttfunk/lib/ttfunk/subset/mac_roman.rb +0 -46
- data/vendor/ttfunk/lib/ttfunk/subset/unicode.rb +0 -48
- data/vendor/ttfunk/lib/ttfunk/subset/unicode_8bit.rb +0 -63
- data/vendor/ttfunk/lib/ttfunk/subset/windows_1252.rb +0 -51
- data/vendor/ttfunk/lib/ttfunk/subset_collection.rb +0 -72
- data/vendor/ttfunk/lib/ttfunk/table.rb +0 -46
- data/vendor/ttfunk/lib/ttfunk/table/cmap.rb +0 -34
- data/vendor/ttfunk/lib/ttfunk/table/cmap/format00.rb +0 -54
- data/vendor/ttfunk/lib/ttfunk/table/cmap/format04.rb +0 -126
- data/vendor/ttfunk/lib/ttfunk/table/cmap/subtable.rb +0 -79
- data/vendor/ttfunk/lib/ttfunk/table/glyf.rb +0 -64
- data/vendor/ttfunk/lib/ttfunk/table/glyf/compound.rb +0 -81
- data/vendor/ttfunk/lib/ttfunk/table/glyf/simple.rb +0 -37
- data/vendor/ttfunk/lib/ttfunk/table/head.rb +0 -44
- data/vendor/ttfunk/lib/ttfunk/table/hhea.rb +0 -41
- data/vendor/ttfunk/lib/ttfunk/table/hmtx.rb +0 -47
- data/vendor/ttfunk/lib/ttfunk/table/kern.rb +0 -79
- data/vendor/ttfunk/lib/ttfunk/table/kern/format0.rb +0 -62
- data/vendor/ttfunk/lib/ttfunk/table/loca.rb +0 -43
- data/vendor/ttfunk/lib/ttfunk/table/maxp.rb +0 -40
- data/vendor/ttfunk/lib/ttfunk/table/name.rb +0 -119
- data/vendor/ttfunk/lib/ttfunk/table/os2.rb +0 -78
- data/vendor/ttfunk/lib/ttfunk/table/post.rb +0 -91
- data/vendor/ttfunk/lib/ttfunk/table/post/format10.rb +0 -43
- data/vendor/ttfunk/lib/ttfunk/table/post/format20.rb +0 -35
- data/vendor/ttfunk/lib/ttfunk/table/post/format25.rb +0 -23
- data/vendor/ttfunk/lib/ttfunk/table/post/format30.rb +0 -17
- data/vendor/ttfunk/lib/ttfunk/table/post/format40.rb +0 -17
- data/vendor/ttfunk/lib/ttfunk/table/simple.rb +0 -14
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'ttfunk/reader'
|
2
|
-
|
3
|
-
module TTFunk
|
4
|
-
class Table
|
5
|
-
include Reader
|
6
|
-
|
7
|
-
attr_reader :file
|
8
|
-
attr_reader :offset
|
9
|
-
attr_reader :length
|
10
|
-
|
11
|
-
def initialize(file)
|
12
|
-
@file = file
|
13
|
-
|
14
|
-
info = file.directory_info(tag)
|
15
|
-
|
16
|
-
if info
|
17
|
-
@offset = info[:offset]
|
18
|
-
@length = info[:length]
|
19
|
-
|
20
|
-
parse_from(@offset) { parse! }
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def exists?
|
25
|
-
!@offset.nil?
|
26
|
-
end
|
27
|
-
|
28
|
-
def raw
|
29
|
-
if exists?
|
30
|
-
parse_from(offset) { io.read(length) }
|
31
|
-
else
|
32
|
-
nil
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def tag
|
37
|
-
self.class.name.split(/::/).last.downcase
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
def parse!
|
43
|
-
# do nothing, by default
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
module TTFunk
|
2
|
-
class Table
|
3
|
-
class Cmap < Table
|
4
|
-
attr_reader :version
|
5
|
-
attr_reader :tables
|
6
|
-
|
7
|
-
def self.encode(charmap, encoding)
|
8
|
-
result = Cmap::Subtable.encode(charmap, encoding)
|
9
|
-
|
10
|
-
# pack 'version' and 'table-count'
|
11
|
-
result[:table] = [0, 1, result.delete(:subtable)].pack("nnA*")
|
12
|
-
return result
|
13
|
-
end
|
14
|
-
|
15
|
-
def unicode
|
16
|
-
@unicode ||= @tables.select { |table| table.unicode? }
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def parse!
|
22
|
-
@version, table_count = read(4, "nn")
|
23
|
-
@tables = []
|
24
|
-
|
25
|
-
table_count.times do
|
26
|
-
@tables << Cmap::Subtable.new(file, offset)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
require 'ttfunk/table/cmap/subtable'
|
@@ -1,54 +0,0 @@
|
|
1
|
-
require 'ttfunk/encoding/mac_roman'
|
2
|
-
require 'ttfunk/encoding/windows_1252'
|
3
|
-
|
4
|
-
module TTFunk
|
5
|
-
class Table
|
6
|
-
class Cmap
|
7
|
-
|
8
|
-
module Format00
|
9
|
-
attr_reader :language
|
10
|
-
attr_reader :code_map
|
11
|
-
|
12
|
-
# Expects a hash mapping character codes to glyph ids (where the
|
13
|
-
# glyph ids are from the original font). Returns a hash including
|
14
|
-
# a new map (:charmap) that maps the characters in charmap to a
|
15
|
-
# another hash containing both the old (:old) and new (:new) glyph
|
16
|
-
# ids. The returned hash also includes a :subtable key, which contains
|
17
|
-
# the encoded subtable for the given charmap.
|
18
|
-
def self.encode(charmap)
|
19
|
-
next_id = 0
|
20
|
-
glyph_indexes = Array.new(256, 0)
|
21
|
-
glyph_map = { 0 => 0 }
|
22
|
-
|
23
|
-
new_map = charmap.keys.sort.inject({}) do |map, code|
|
24
|
-
glyph_map[charmap[code]] ||= next_id += 1
|
25
|
-
map[code] = { :old => charmap[code], :new => glyph_map[charmap[code]] }
|
26
|
-
glyph_indexes[code] = glyph_map[charmap[code]]
|
27
|
-
map
|
28
|
-
end
|
29
|
-
|
30
|
-
# format, length, language, indices
|
31
|
-
subtable = [0, 262, 0, *glyph_indexes].pack("nnnC*")
|
32
|
-
|
33
|
-
{ :charmap => new_map, :subtable => subtable, :max_glyph_id => next_id+1 }
|
34
|
-
end
|
35
|
-
|
36
|
-
def [](code)
|
37
|
-
@code_map[code] || 0
|
38
|
-
end
|
39
|
-
|
40
|
-
def supported?
|
41
|
-
true
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def parse_cmap!
|
47
|
-
length, @language = read(4, "nn")
|
48
|
-
@code_map = read(256, "C*")
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
@@ -1,126 +0,0 @@
|
|
1
|
-
module TTFunk
|
2
|
-
class Table
|
3
|
-
class Cmap
|
4
|
-
|
5
|
-
module Format04
|
6
|
-
attr_reader :language
|
7
|
-
attr_reader :code_map
|
8
|
-
|
9
|
-
# Expects a hash mapping character codes to glyph ids (where the
|
10
|
-
# glyph ids are from the original font). Returns a hash including
|
11
|
-
# a new map (:charmap) that maps the characters in charmap to a
|
12
|
-
# another hash containing both the old (:old) and new (:new) glyph
|
13
|
-
# ids. The returned hash also includes a :subtable key, which contains
|
14
|
-
# the encoded subtable for the given charmap.
|
15
|
-
def self.encode(charmap)
|
16
|
-
end_codes = []
|
17
|
-
start_codes = []
|
18
|
-
next_id = 0
|
19
|
-
last = difference = nil
|
20
|
-
|
21
|
-
glyph_map = { 0 => 0 }
|
22
|
-
new_map = charmap.keys.sort.inject({}) do |map, code|
|
23
|
-
old = charmap[code]
|
24
|
-
glyph_map[old] ||= next_id += 1
|
25
|
-
map[code] = { :old => old, :new => glyph_map[old] }
|
26
|
-
|
27
|
-
delta = glyph_map[old] - code
|
28
|
-
if last.nil? || delta != difference
|
29
|
-
end_codes << last if last
|
30
|
-
start_codes << code
|
31
|
-
difference = delta
|
32
|
-
end
|
33
|
-
last = code
|
34
|
-
|
35
|
-
map
|
36
|
-
end
|
37
|
-
|
38
|
-
end_codes << last if last
|
39
|
-
end_codes << 0xFFFF
|
40
|
-
start_codes << 0xFFFF
|
41
|
-
segcount = start_codes.length
|
42
|
-
|
43
|
-
# build the conversion tables
|
44
|
-
deltas = []
|
45
|
-
range_offsets = []
|
46
|
-
glyph_indices = []
|
47
|
-
|
48
|
-
offset = 0
|
49
|
-
start_codes.zip(end_codes).each_with_index do |(a, b), segment|
|
50
|
-
if a == 0xFFFF
|
51
|
-
deltas << 0
|
52
|
-
range_offsets << 0
|
53
|
-
break
|
54
|
-
end
|
55
|
-
|
56
|
-
start_glyph_id = new_map[a][:new]
|
57
|
-
if a - start_glyph_id >= 0x8000
|
58
|
-
deltas << 0
|
59
|
-
range_offsets << 2 * (glyph_indices.length + segcount - segment)
|
60
|
-
a.upto(b) { |code| glyph_indices << new_map[code][:new] }
|
61
|
-
else
|
62
|
-
deltas << -a + start_glyph_id
|
63
|
-
range_offsets << 0
|
64
|
-
end
|
65
|
-
offset += 2
|
66
|
-
end
|
67
|
-
|
68
|
-
# format, length, language
|
69
|
-
subtable = [4, 16 + 8 * segcount + 2 * glyph_indices.length, 0].pack("nnn")
|
70
|
-
|
71
|
-
search_range = 2 * 2 ** (Math.log(segcount) / Math.log(2)).to_i
|
72
|
-
entry_selector = (Math.log(search_range / 2) / Math.log(2)).to_i
|
73
|
-
range_shift = (2 * segcount) - search_range
|
74
|
-
subtable << [segcount * 2, search_range, entry_selector, range_shift].pack("nnnn")
|
75
|
-
|
76
|
-
subtable << end_codes.pack("n*") << "\0\0" << start_codes.pack("n*")
|
77
|
-
subtable << deltas.pack("n*") << range_offsets.pack("n*") << glyph_indices.pack("n*")
|
78
|
-
|
79
|
-
{ :charmap => new_map, :subtable => subtable, :max_glyph_id => next_id+1 }
|
80
|
-
end
|
81
|
-
|
82
|
-
def [](code)
|
83
|
-
@code_map[code] || 0
|
84
|
-
end
|
85
|
-
|
86
|
-
def supported?
|
87
|
-
true
|
88
|
-
end
|
89
|
-
|
90
|
-
private
|
91
|
-
|
92
|
-
def parse_cmap!
|
93
|
-
length, @language, segcount_x2 = read(6, "nnn")
|
94
|
-
segcount = segcount_x2 / 2
|
95
|
-
|
96
|
-
io.read(6) # skip searching hints
|
97
|
-
|
98
|
-
end_code = read(segcount_x2, "n*")
|
99
|
-
io.read(2) # skip reserved value
|
100
|
-
start_code = read(segcount_x2, "n*")
|
101
|
-
id_delta = read_signed(segcount)
|
102
|
-
id_range_offset = read(segcount_x2, "n*")
|
103
|
-
|
104
|
-
glyph_ids = read(length - io.pos + @offset, "n*")
|
105
|
-
|
106
|
-
@code_map = {}
|
107
|
-
|
108
|
-
end_code.each_with_index do |tail, i|
|
109
|
-
start_code[i].upto(tail) do |code|
|
110
|
-
if id_range_offset[i].zero?
|
111
|
-
glyph_id = code + id_delta[i]
|
112
|
-
else
|
113
|
-
index = id_range_offset[i] / 2 + (code - start_code[i]) - (segcount - i)
|
114
|
-
glyph_id = glyph_ids[index] || 0 # because some TTF fonts are broken
|
115
|
-
glyph_id += id_delta[i] if glyph_id != 0
|
116
|
-
end
|
117
|
-
|
118
|
-
@code_map[code] = glyph_id & 0xFFFF
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
@@ -1,79 +0,0 @@
|
|
1
|
-
require 'ttfunk/reader'
|
2
|
-
|
3
|
-
module TTFunk
|
4
|
-
class Table
|
5
|
-
class Cmap
|
6
|
-
class Subtable
|
7
|
-
include Reader
|
8
|
-
|
9
|
-
attr_reader :platform_id
|
10
|
-
attr_reader :encoding_id
|
11
|
-
attr_reader :format
|
12
|
-
|
13
|
-
ENCODING_MAPPINGS = {
|
14
|
-
:mac_roman => { :platform_id => 1, :encoding_id => 0 },
|
15
|
-
# use microsoft unicode, instead of generic unicode, for optimal windows support
|
16
|
-
:unicode => { :platform_id => 3, :encoding_id => 1 }
|
17
|
-
}
|
18
|
-
|
19
|
-
def self.encode(charmap, encoding)
|
20
|
-
case encoding
|
21
|
-
when :mac_roman
|
22
|
-
result = Format00.encode(charmap)
|
23
|
-
when :unicode
|
24
|
-
result = Format04.encode(charmap)
|
25
|
-
else
|
26
|
-
raise NotImplementedError, "encoding #{encoding.inspect} is not supported"
|
27
|
-
end
|
28
|
-
|
29
|
-
mapping = ENCODING_MAPPINGS[encoding]
|
30
|
-
|
31
|
-
# platform-id, encoding-id, offset
|
32
|
-
result[:subtable] = [mapping[:platform_id], mapping[:encoding_id],
|
33
|
-
12, result[:subtable]].pack("nnNA*")
|
34
|
-
|
35
|
-
return result
|
36
|
-
end
|
37
|
-
|
38
|
-
def initialize(file, table_start)
|
39
|
-
@file = file
|
40
|
-
@platform_id, @encoding_id, @offset = read(8, "nnN")
|
41
|
-
@offset += table_start
|
42
|
-
|
43
|
-
parse_from(@offset) do
|
44
|
-
@format = read(2, "n").first
|
45
|
-
|
46
|
-
case @format
|
47
|
-
when 0 then extend(TTFunk::Table::Cmap::Format00)
|
48
|
-
when 4 then extend(TTFunk::Table::Cmap::Format04)
|
49
|
-
end
|
50
|
-
|
51
|
-
parse_cmap!
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def unicode?
|
56
|
-
platform_id == 3 && encoding_id == 1 && format == 4 ||
|
57
|
-
platform_id == 0 && format == 4
|
58
|
-
end
|
59
|
-
|
60
|
-
def supported?
|
61
|
-
false
|
62
|
-
end
|
63
|
-
|
64
|
-
def [](code)
|
65
|
-
raise NotImplementedError, "cmap format #{@format} is not supported"
|
66
|
-
end
|
67
|
-
|
68
|
-
private
|
69
|
-
|
70
|
-
def parse_cmap!
|
71
|
-
# do nothing...
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
require 'ttfunk/table/cmap/format00'
|
79
|
-
require 'ttfunk/table/cmap/format04'
|
@@ -1,64 +0,0 @@
|
|
1
|
-
require 'ttfunk/table'
|
2
|
-
|
3
|
-
module TTFunk
|
4
|
-
class Table
|
5
|
-
class Glyf < Table
|
6
|
-
# Accepts a hash mapping (old) glyph-ids to glyph objects, and a hash
|
7
|
-
# mapping old glyph-ids to new glyph-ids.
|
8
|
-
#
|
9
|
-
# Returns a hash containing:
|
10
|
-
#
|
11
|
-
# * :table - a string representing the encoded 'glyf' table containing
|
12
|
-
# the given glyphs.
|
13
|
-
# * :offsets - an array of offsets for each glyph
|
14
|
-
def self.encode(glyphs, new2old, old2new)
|
15
|
-
result = { :table => "", :offsets => [] }
|
16
|
-
|
17
|
-
new2old.keys.sort.each do |new_id|
|
18
|
-
glyph = glyphs[new2old[new_id]]
|
19
|
-
result[:offsets] << result[:table].length
|
20
|
-
result[:table] << glyph.recode(old2new) if glyph
|
21
|
-
end
|
22
|
-
|
23
|
-
# include an offset at the end of the table, for use in computing the
|
24
|
-
# size of the last glyph
|
25
|
-
result[:offsets] << result[:table].length
|
26
|
-
return result
|
27
|
-
end
|
28
|
-
|
29
|
-
def for(glyph_id)
|
30
|
-
return @cache[glyph_id] if @cache.key?(glyph_id)
|
31
|
-
|
32
|
-
index = file.glyph_locations.index_of(glyph_id)
|
33
|
-
size = file.glyph_locations.size_of(glyph_id)
|
34
|
-
|
35
|
-
if size.zero? # blank glyph, e.g. space character
|
36
|
-
@cache[glyph_id] = nil
|
37
|
-
return nil
|
38
|
-
end
|
39
|
-
|
40
|
-
parse_from(offset + index) do
|
41
|
-
raw = io.read(size)
|
42
|
-
number_of_contours, x_min, y_min, x_max, y_max = raw.unpack("n5").map { |i| to_signed(i) }
|
43
|
-
|
44
|
-
@cache[glyph_id] = if number_of_contours == -1
|
45
|
-
Compound.new(raw, x_min, y_min, x_max, y_max)
|
46
|
-
else
|
47
|
-
Simple.new(raw, number_of_contours, x_min, y_min, x_max, y_max)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
private
|
53
|
-
|
54
|
-
def parse!
|
55
|
-
# because the glyf table is rather complex to parse, we defer
|
56
|
-
# the parse until we need a specific glyf, and then cache it.
|
57
|
-
@cache = {}
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
require 'ttfunk/table/glyf/compound'
|
64
|
-
require 'ttfunk/table/glyf/simple'
|
@@ -1,81 +0,0 @@
|
|
1
|
-
require 'ttfunk/reader'
|
2
|
-
|
3
|
-
module TTFunk
|
4
|
-
class Table
|
5
|
-
class Glyf
|
6
|
-
class Compound
|
7
|
-
include Reader
|
8
|
-
|
9
|
-
ARG_1_AND_2_ARE_WORDS = 0x0001
|
10
|
-
WE_HAVE_A_SCALE = 0x0008
|
11
|
-
MORE_COMPONENTS = 0x0020
|
12
|
-
WE_HAVE_AN_X_AND_Y_SCALE = 0x0040
|
13
|
-
WE_HAVE_A_TWO_BY_TWO = 0x0080
|
14
|
-
WE_HAVE_INSTRUCTIONS = 0x0100
|
15
|
-
|
16
|
-
attr_reader :raw
|
17
|
-
attr_reader :x_min, :y_min, :x_max, :y_max
|
18
|
-
attr_reader :glyph_ids
|
19
|
-
|
20
|
-
Component = Struct.new(:flags, :glyph_index, :arg1, :arg2, :transform)
|
21
|
-
|
22
|
-
def initialize(raw, x_min, y_min, x_max, y_max)
|
23
|
-
@raw = raw
|
24
|
-
@x_min, @y_min, @x_max, @y_max = x_min, y_min, x_max, y_max
|
25
|
-
|
26
|
-
# Because TTFunk only cares about glyphs insofar as they (1) provide
|
27
|
-
# a bounding box for each glyph, and (2) can be rewritten into a
|
28
|
-
# font subset, we don't really care about the rest of the glyph data
|
29
|
-
# except as a whole. Thus, we don't actually decompose the glyph
|
30
|
-
# into it's parts--all we really care about are the locations within
|
31
|
-
# the raw string where the component glyph ids are stored, so that
|
32
|
-
# when we rewrite this glyph into a subset we can rewrite the
|
33
|
-
# component glyph-ids so they are correct for the subset.
|
34
|
-
|
35
|
-
@glyph_ids = []
|
36
|
-
@glyph_id_offsets = []
|
37
|
-
offset = 10 # 2 bytes for each of num-contours, min x/y, max x/y
|
38
|
-
|
39
|
-
loop do
|
40
|
-
flags, glyph_id = @raw[offset, 4].unpack("n*")
|
41
|
-
@glyph_ids << glyph_id
|
42
|
-
@glyph_id_offsets << offset + 2
|
43
|
-
|
44
|
-
break unless flags & MORE_COMPONENTS != 0
|
45
|
-
offset += 4
|
46
|
-
|
47
|
-
if flags & ARG_1_AND_2_ARE_WORDS != 0
|
48
|
-
offset += 4
|
49
|
-
else
|
50
|
-
offset += 2
|
51
|
-
end
|
52
|
-
|
53
|
-
if flags & WE_HAVE_A_TWO_BY_TWO != 0
|
54
|
-
offset += 8
|
55
|
-
elsif flags & WE_HAVE_AN_X_AND_Y_SCALE != 0
|
56
|
-
offset += 4
|
57
|
-
elsif flags & WE_HAVE_A_SCALE != 0
|
58
|
-
offset += 2
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def compound?
|
64
|
-
true
|
65
|
-
end
|
66
|
-
|
67
|
-
def recode(mapping)
|
68
|
-
result = @raw.dup
|
69
|
-
new_ids = glyph_ids.map { |id| mapping[id] }
|
70
|
-
|
71
|
-
new_ids.zip(@glyph_id_offsets).each do |new_id, offset|
|
72
|
-
result[offset, 2] = [new_id].pack("n")
|
73
|
-
end
|
74
|
-
|
75
|
-
return result
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|