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,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
-