prawnx 0.1.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 (160) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING +2 -0
  3. data/GPLv2 +339 -0
  4. data/GPLv3 +674 -0
  5. data/LICENSE +65 -0
  6. data/LICENSE-prawn-svg +21 -0
  7. data/README.md +107 -0
  8. data/data/fonts/Courier-Bold.afm +342 -0
  9. data/data/fonts/Courier-BoldOblique.afm +342 -0
  10. data/data/fonts/Courier-Oblique.afm +342 -0
  11. data/data/fonts/Courier.afm +342 -0
  12. data/data/fonts/Helvetica-Bold.afm +2827 -0
  13. data/data/fonts/Helvetica-BoldOblique.afm +2827 -0
  14. data/data/fonts/Helvetica-Oblique.afm +3051 -0
  15. data/data/fonts/Helvetica.afm +3051 -0
  16. data/data/fonts/MustRead.html +19 -0
  17. data/data/fonts/Symbol.afm +213 -0
  18. data/data/fonts/Times-Bold.afm +2588 -0
  19. data/data/fonts/Times-BoldItalic.afm +2384 -0
  20. data/data/fonts/Times-Italic.afm +2667 -0
  21. data/data/fonts/Times-Roman.afm +2419 -0
  22. data/data/fonts/ZapfDingbats.afm +225 -0
  23. data/lib/pdf/core.rb +4 -0
  24. data/lib/prawn/measurement_extensions.rb +4 -0
  25. data/lib/prawn/svg/attributes/clip_path.rb +46 -0
  26. data/lib/prawn/svg/attributes/mask.rb +16 -0
  27. data/lib/prawn/svg/attributes/opacity.rb +30 -0
  28. data/lib/prawn/svg/attributes/space.rb +10 -0
  29. data/lib/prawn/svg/attributes/stroke.rb +50 -0
  30. data/lib/prawn/svg/attributes/transform.rb +10 -0
  31. data/lib/prawn/svg/attributes.rb +6 -0
  32. data/lib/prawn/svg/calculators/arc_to_bezier_curve.rb +57 -0
  33. data/lib/prawn/svg/calculators/aspect_ratio.rb +60 -0
  34. data/lib/prawn/svg/calculators/document_sizing.rb +103 -0
  35. data/lib/prawn/svg/calculators/path_length.rb +168 -0
  36. data/lib/prawn/svg/calculators/pixels.rb +57 -0
  37. data/lib/prawn/svg/color.rb +240 -0
  38. data/lib/prawn/svg/css/font_face_parser.rb +72 -0
  39. data/lib/prawn/svg/css/font_family_parser.rb +39 -0
  40. data/lib/prawn/svg/css/font_parser.rb +46 -0
  41. data/lib/prawn/svg/css/selector_parser.rb +178 -0
  42. data/lib/prawn/svg/css/stylesheets.rb +233 -0
  43. data/lib/prawn/svg/css/values_parser.rb +68 -0
  44. data/lib/prawn/svg/document.rb +170 -0
  45. data/lib/prawn/svg/elements/anchor.rb +10 -0
  46. data/lib/prawn/svg/elements/base.rb +312 -0
  47. data/lib/prawn/svg/elements/bbox_scaling.rb +78 -0
  48. data/lib/prawn/svg/elements/call_duplicator.rb +37 -0
  49. data/lib/prawn/svg/elements/circle.rb +25 -0
  50. data/lib/prawn/svg/elements/clip_path.rb +26 -0
  51. data/lib/prawn/svg/elements/container.rb +10 -0
  52. data/lib/prawn/svg/elements/direct_render_base.rb +27 -0
  53. data/lib/prawn/svg/elements/ellipse.rb +22 -0
  54. data/lib/prawn/svg/elements/gradient.rb +184 -0
  55. data/lib/prawn/svg/elements/ignored.rb +5 -0
  56. data/lib/prawn/svg/elements/image.rb +177 -0
  57. data/lib/prawn/svg/elements/line.rb +27 -0
  58. data/lib/prawn/svg/elements/marker.rb +72 -0
  59. data/lib/prawn/svg/elements/mask.rb +65 -0
  60. data/lib/prawn/svg/elements/path.rb +294 -0
  61. data/lib/prawn/svg/elements/pattern.rb +150 -0
  62. data/lib/prawn/svg/elements/polygon.rb +25 -0
  63. data/lib/prawn/svg/elements/polyline.rb +23 -0
  64. data/lib/prawn/svg/elements/rect.rb +64 -0
  65. data/lib/prawn/svg/elements/root.rb +22 -0
  66. data/lib/prawn/svg/elements/switch.rb +92 -0
  67. data/lib/prawn/svg/elements/text.rb +99 -0
  68. data/lib/prawn/svg/elements/text_component.rb +346 -0
  69. data/lib/prawn/svg/elements/text_node.rb +308 -0
  70. data/lib/prawn/svg/elements/text_path.rb +153 -0
  71. data/lib/prawn/svg/elements/use.rb +142 -0
  72. data/lib/prawn/svg/elements/viewport.rb +29 -0
  73. data/lib/prawn/svg/elements.rb +46 -0
  74. data/lib/prawn/svg/extension.rb +25 -0
  75. data/lib/prawn/svg/font.rb +20 -0
  76. data/lib/prawn/svg/font_metrics.rb +144 -0
  77. data/lib/prawn/svg/font_registry.rb +315 -0
  78. data/lib/prawn/svg/funciri.rb +14 -0
  79. data/lib/prawn/svg/gradient_renderer.rb +332 -0
  80. data/lib/prawn/svg/gradients.rb +53 -0
  81. data/lib/prawn/svg/interface.rb +72 -0
  82. data/lib/prawn/svg/length.rb +43 -0
  83. data/lib/prawn/svg/link_renderer.rb +40 -0
  84. data/lib/prawn/svg/loaders/data.rb +17 -0
  85. data/lib/prawn/svg/loaders/file.rb +111 -0
  86. data/lib/prawn/svg/loaders/web.rb +24 -0
  87. data/lib/prawn/svg/paint.rb +67 -0
  88. data/lib/prawn/svg/pathable.rb +153 -0
  89. data/lib/prawn/svg/pattern_renderer.rb +112 -0
  90. data/lib/prawn/svg/pdfmatrix.rb +37 -0
  91. data/lib/prawn/svg/percentage.rb +24 -0
  92. data/lib/prawn/svg/properties.rb +329 -0
  93. data/lib/prawn/svg/renderer.rb +249 -0
  94. data/lib/prawn/svg/state.rb +24 -0
  95. data/lib/prawn/svg/transform_parser.rb +78 -0
  96. data/lib/prawn/svg/ttc.rb +35 -0
  97. data/lib/prawn/svg/ttf.rb +95 -0
  98. data/lib/prawn/svg/url_loader.rb +46 -0
  99. data/lib/prawn/svg/version.rb +5 -0
  100. data/lib/prawn/table.rb +4 -0
  101. data/lib/prawn-svg.rb +53 -0
  102. data/lib/prawn.rb +10 -0
  103. data/lib/prawnx/annotations.rb +21 -0
  104. data/lib/prawnx/document/bounding_box.rb +193 -0
  105. data/lib/prawnx/document/column_box.rb +91 -0
  106. data/lib/prawnx/document/internals.rb +144 -0
  107. data/lib/prawnx/document/span.rb +25 -0
  108. data/lib/prawnx/document.rb +253 -0
  109. data/lib/prawnx/encoding.rb +29 -0
  110. data/lib/prawnx/errors.rb +37 -0
  111. data/lib/prawnx/font.rb +214 -0
  112. data/lib/prawnx/fonts/afm.rb +171 -0
  113. data/lib/prawnx/fonts/otf.rb +50 -0
  114. data/lib/prawnx/fonts/ttf.rb +410 -0
  115. data/lib/prawnx/graphic_state.rb +41 -0
  116. data/lib/prawnx/graphics/color.rb +148 -0
  117. data/lib/prawnx/graphics/patterns.rb +100 -0
  118. data/lib/prawnx/graphics/style.rb +171 -0
  119. data/lib/prawnx/graphics.rb +208 -0
  120. data/lib/prawnx/grid.rb +216 -0
  121. data/lib/prawnx/images/image.rb +244 -0
  122. data/lib/prawnx/images/png_decoder.rb +65 -0
  123. data/lib/prawnx/images.rb +115 -0
  124. data/lib/prawnx/measurement_extensions.rb +40 -0
  125. data/lib/prawnx/measurements.rb +62 -0
  126. data/lib/prawnx/outline.rb +146 -0
  127. data/lib/prawnx/page.rb +125 -0
  128. data/lib/prawnx/page_geometry.rb +27 -0
  129. data/lib/prawnx/pdf/outline_node.rb +53 -0
  130. data/lib/prawnx/pdf/reference.rb +31 -0
  131. data/lib/prawnx/pdf/writer.rb +105 -0
  132. data/lib/prawnx/pdf.rb +66 -0
  133. data/lib/prawnx/pdf_a/srgb_profile.rb +61 -0
  134. data/lib/prawnx/pdf_a.rb +130 -0
  135. data/lib/prawnx/pdf_core.rb +25 -0
  136. data/lib/prawnx/repeater.rb +79 -0
  137. data/lib/prawnx/security.rb +108 -0
  138. data/lib/prawnx/stamp.rb +74 -0
  139. data/lib/prawnx/table/cell/kinds.rb +246 -0
  140. data/lib/prawnx/table/cell.rb +331 -0
  141. data/lib/prawnx/table/cells.rb +208 -0
  142. data/lib/prawnx/table.rb +296 -0
  143. data/lib/prawnx/text/box.rb +16 -0
  144. data/lib/prawnx/text/formatted/arranger.rb +217 -0
  145. data/lib/prawnx/text/formatted/box.rb +312 -0
  146. data/lib/prawnx/text/formatted/fragment.rb +205 -0
  147. data/lib/prawnx/text/formatted/line_wrap.rb +204 -0
  148. data/lib/prawnx/text/formatted/parser.rb +149 -0
  149. data/lib/prawnx/text/formatted/wrap.rb +103 -0
  150. data/lib/prawnx/text.rb +281 -0
  151. data/lib/prawnx/transformation_stack.rb +43 -0
  152. data/lib/prawnx/true_type/cff_subset.rb +157 -0
  153. data/lib/prawnx/true_type/file.rb +371 -0
  154. data/lib/prawnx/true_type/open_type_layout.rb +189 -0
  155. data/lib/prawnx/true_type/simple_subsets.rb +94 -0
  156. data/lib/prawnx/true_type/subset.rb +187 -0
  157. data/lib/prawnx/version.rb +7 -0
  158. data/lib/prawnx/view.rb +28 -0
  159. data/lib/prawnx.rb +102 -0
  160. metadata +251 -0
@@ -0,0 +1,225 @@
1
+ StartFontMetrics 4.1
2
+ Comment Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.
3
+ Comment Creation Date: Thu May 1 15:14:13 1997
4
+ Comment UniqueID 43082
5
+ Comment VMusage 45775 55535
6
+ FontName ZapfDingbats
7
+ FullName ITC Zapf Dingbats
8
+ FamilyName ZapfDingbats
9
+ Weight Medium
10
+ ItalicAngle 0
11
+ IsFixedPitch false
12
+ CharacterSet Special
13
+ FontBBox -1 -143 981 820
14
+ UnderlinePosition -100
15
+ UnderlineThickness 50
16
+ Version 002.000
17
+ Notice Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Zapf Dingbats is a registered trademark of International Typeface Corporation.
18
+ EncodingScheme FontSpecific
19
+ StdHW 28
20
+ StdVW 90
21
+ StartCharMetrics 202
22
+ C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
23
+ C 33 ; WX 974 ; N a1 ; B 35 72 939 621 ;
24
+ C 34 ; WX 961 ; N a2 ; B 35 81 927 611 ;
25
+ C 35 ; WX 974 ; N a202 ; B 35 72 939 621 ;
26
+ C 36 ; WX 980 ; N a3 ; B 35 0 945 692 ;
27
+ C 37 ; WX 719 ; N a4 ; B 34 139 685 566 ;
28
+ C 38 ; WX 789 ; N a5 ; B 35 -14 755 705 ;
29
+ C 39 ; WX 790 ; N a119 ; B 35 -14 755 705 ;
30
+ C 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ;
31
+ C 41 ; WX 690 ; N a117 ; B 34 138 655 553 ;
32
+ C 42 ; WX 960 ; N a11 ; B 35 123 925 568 ;
33
+ C 43 ; WX 939 ; N a12 ; B 35 134 904 559 ;
34
+ C 44 ; WX 549 ; N a13 ; B 29 -11 516 705 ;
35
+ C 45 ; WX 855 ; N a14 ; B 34 59 820 632 ;
36
+ C 46 ; WX 911 ; N a15 ; B 35 50 876 642 ;
37
+ C 47 ; WX 933 ; N a16 ; B 35 139 899 550 ;
38
+ C 48 ; WX 911 ; N a105 ; B 35 50 876 642 ;
39
+ C 49 ; WX 945 ; N a17 ; B 35 139 909 553 ;
40
+ C 50 ; WX 974 ; N a18 ; B 35 104 938 587 ;
41
+ C 51 ; WX 755 ; N a19 ; B 34 -13 721 705 ;
42
+ C 52 ; WX 846 ; N a20 ; B 36 -14 811 705 ;
43
+ C 53 ; WX 762 ; N a21 ; B 35 0 727 692 ;
44
+ C 54 ; WX 761 ; N a22 ; B 35 0 727 692 ;
45
+ C 55 ; WX 571 ; N a23 ; B -1 -68 571 661 ;
46
+ C 56 ; WX 677 ; N a24 ; B 36 -13 642 705 ;
47
+ C 57 ; WX 763 ; N a25 ; B 35 0 728 692 ;
48
+ C 58 ; WX 760 ; N a26 ; B 35 0 726 692 ;
49
+ C 59 ; WX 759 ; N a27 ; B 35 0 725 692 ;
50
+ C 60 ; WX 754 ; N a28 ; B 35 0 720 692 ;
51
+ C 61 ; WX 494 ; N a6 ; B 35 0 460 692 ;
52
+ C 62 ; WX 552 ; N a7 ; B 35 0 517 692 ;
53
+ C 63 ; WX 537 ; N a8 ; B 35 0 503 692 ;
54
+ C 64 ; WX 577 ; N a9 ; B 35 96 542 596 ;
55
+ C 65 ; WX 692 ; N a10 ; B 35 -14 657 705 ;
56
+ C 66 ; WX 786 ; N a29 ; B 35 -14 751 705 ;
57
+ C 67 ; WX 788 ; N a30 ; B 35 -14 752 705 ;
58
+ C 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ;
59
+ C 69 ; WX 790 ; N a32 ; B 35 -14 756 705 ;
60
+ C 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ;
61
+ C 71 ; WX 794 ; N a34 ; B 35 -13 759 705 ;
62
+ C 72 ; WX 816 ; N a35 ; B 35 -14 782 705 ;
63
+ C 73 ; WX 823 ; N a36 ; B 35 -14 787 705 ;
64
+ C 74 ; WX 789 ; N a37 ; B 35 -14 754 705 ;
65
+ C 75 ; WX 841 ; N a38 ; B 35 -14 807 705 ;
66
+ C 76 ; WX 823 ; N a39 ; B 35 -14 789 705 ;
67
+ C 77 ; WX 833 ; N a40 ; B 35 -14 798 705 ;
68
+ C 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ;
69
+ C 79 ; WX 831 ; N a42 ; B 35 -14 796 705 ;
70
+ C 80 ; WX 923 ; N a43 ; B 35 -14 888 705 ;
71
+ C 81 ; WX 744 ; N a44 ; B 35 0 710 692 ;
72
+ C 82 ; WX 723 ; N a45 ; B 35 0 688 692 ;
73
+ C 83 ; WX 749 ; N a46 ; B 35 0 714 692 ;
74
+ C 84 ; WX 790 ; N a47 ; B 34 -14 756 705 ;
75
+ C 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ;
76
+ C 86 ; WX 695 ; N a49 ; B 35 -14 661 706 ;
77
+ C 87 ; WX 776 ; N a50 ; B 35 -6 741 699 ;
78
+ C 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ;
79
+ C 89 ; WX 792 ; N a52 ; B 35 -14 757 705 ;
80
+ C 90 ; WX 759 ; N a53 ; B 35 0 725 692 ;
81
+ C 91 ; WX 707 ; N a54 ; B 35 -13 672 704 ;
82
+ C 92 ; WX 708 ; N a55 ; B 35 -14 672 705 ;
83
+ C 93 ; WX 682 ; N a56 ; B 35 -14 647 705 ;
84
+ C 94 ; WX 701 ; N a57 ; B 35 -14 666 705 ;
85
+ C 95 ; WX 826 ; N a58 ; B 35 -14 791 705 ;
86
+ C 96 ; WX 815 ; N a59 ; B 35 -14 780 705 ;
87
+ C 97 ; WX 789 ; N a60 ; B 35 -14 754 705 ;
88
+ C 98 ; WX 789 ; N a61 ; B 35 -14 754 705 ;
89
+ C 99 ; WX 707 ; N a62 ; B 34 -14 673 705 ;
90
+ C 100 ; WX 687 ; N a63 ; B 36 0 651 692 ;
91
+ C 101 ; WX 696 ; N a64 ; B 35 0 661 691 ;
92
+ C 102 ; WX 689 ; N a65 ; B 35 0 655 692 ;
93
+ C 103 ; WX 786 ; N a66 ; B 34 -14 751 705 ;
94
+ C 104 ; WX 787 ; N a67 ; B 35 -14 752 705 ;
95
+ C 105 ; WX 713 ; N a68 ; B 35 -14 678 705 ;
96
+ C 106 ; WX 791 ; N a69 ; B 35 -14 756 705 ;
97
+ C 107 ; WX 785 ; N a70 ; B 36 -14 751 705 ;
98
+ C 108 ; WX 791 ; N a71 ; B 35 -14 757 705 ;
99
+ C 109 ; WX 873 ; N a72 ; B 35 -14 838 705 ;
100
+ C 110 ; WX 761 ; N a73 ; B 35 0 726 692 ;
101
+ C 111 ; WX 762 ; N a74 ; B 35 0 727 692 ;
102
+ C 112 ; WX 762 ; N a203 ; B 35 0 727 692 ;
103
+ C 113 ; WX 759 ; N a75 ; B 35 0 725 692 ;
104
+ C 114 ; WX 759 ; N a204 ; B 35 0 725 692 ;
105
+ C 115 ; WX 892 ; N a76 ; B 35 0 858 705 ;
106
+ C 116 ; WX 892 ; N a77 ; B 35 -14 858 692 ;
107
+ C 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ;
108
+ C 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ;
109
+ C 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ;
110
+ C 120 ; WX 138 ; N a82 ; B 35 0 104 692 ;
111
+ C 121 ; WX 277 ; N a83 ; B 35 0 242 692 ;
112
+ C 122 ; WX 415 ; N a84 ; B 35 0 380 692 ;
113
+ C 123 ; WX 392 ; N a97 ; B 35 263 357 705 ;
114
+ C 124 ; WX 392 ; N a98 ; B 34 263 357 705 ;
115
+ C 125 ; WX 668 ; N a99 ; B 35 263 633 705 ;
116
+ C 126 ; WX 668 ; N a100 ; B 36 263 634 705 ;
117
+ C 128 ; WX 390 ; N a89 ; B 35 -14 356 705 ;
118
+ C 129 ; WX 390 ; N a90 ; B 35 -14 355 705 ;
119
+ C 130 ; WX 317 ; N a93 ; B 35 0 283 692 ;
120
+ C 131 ; WX 317 ; N a94 ; B 35 0 283 692 ;
121
+ C 132 ; WX 276 ; N a91 ; B 35 0 242 692 ;
122
+ C 133 ; WX 276 ; N a92 ; B 35 0 242 692 ;
123
+ C 134 ; WX 509 ; N a205 ; B 35 0 475 692 ;
124
+ C 135 ; WX 509 ; N a85 ; B 35 0 475 692 ;
125
+ C 136 ; WX 410 ; N a206 ; B 35 0 375 692 ;
126
+ C 137 ; WX 410 ; N a86 ; B 35 0 375 692 ;
127
+ C 138 ; WX 234 ; N a87 ; B 35 -14 199 705 ;
128
+ C 139 ; WX 234 ; N a88 ; B 35 -14 199 705 ;
129
+ C 140 ; WX 334 ; N a95 ; B 35 0 299 692 ;
130
+ C 141 ; WX 334 ; N a96 ; B 35 0 299 692 ;
131
+ C 161 ; WX 732 ; N a101 ; B 35 -143 697 806 ;
132
+ C 162 ; WX 544 ; N a102 ; B 56 -14 488 706 ;
133
+ C 163 ; WX 544 ; N a103 ; B 34 -14 508 705 ;
134
+ C 164 ; WX 910 ; N a104 ; B 35 40 875 651 ;
135
+ C 165 ; WX 667 ; N a106 ; B 35 -14 633 705 ;
136
+ C 166 ; WX 760 ; N a107 ; B 35 -14 726 705 ;
137
+ C 167 ; WX 760 ; N a108 ; B 0 121 758 569 ;
138
+ C 168 ; WX 776 ; N a112 ; B 35 0 741 705 ;
139
+ C 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ;
140
+ C 170 ; WX 694 ; N a110 ; B 35 -14 659 705 ;
141
+ C 171 ; WX 626 ; N a109 ; B 34 0 591 705 ;
142
+ C 172 ; WX 788 ; N a120 ; B 35 -14 754 705 ;
143
+ C 173 ; WX 788 ; N a121 ; B 35 -14 754 705 ;
144
+ C 174 ; WX 788 ; N a122 ; B 35 -14 754 705 ;
145
+ C 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ;
146
+ C 176 ; WX 788 ; N a124 ; B 35 -14 754 705 ;
147
+ C 177 ; WX 788 ; N a125 ; B 35 -14 754 705 ;
148
+ C 178 ; WX 788 ; N a126 ; B 35 -14 754 705 ;
149
+ C 179 ; WX 788 ; N a127 ; B 35 -14 754 705 ;
150
+ C 180 ; WX 788 ; N a128 ; B 35 -14 754 705 ;
151
+ C 181 ; WX 788 ; N a129 ; B 35 -14 754 705 ;
152
+ C 182 ; WX 788 ; N a130 ; B 35 -14 754 705 ;
153
+ C 183 ; WX 788 ; N a131 ; B 35 -14 754 705 ;
154
+ C 184 ; WX 788 ; N a132 ; B 35 -14 754 705 ;
155
+ C 185 ; WX 788 ; N a133 ; B 35 -14 754 705 ;
156
+ C 186 ; WX 788 ; N a134 ; B 35 -14 754 705 ;
157
+ C 187 ; WX 788 ; N a135 ; B 35 -14 754 705 ;
158
+ C 188 ; WX 788 ; N a136 ; B 35 -14 754 705 ;
159
+ C 189 ; WX 788 ; N a137 ; B 35 -14 754 705 ;
160
+ C 190 ; WX 788 ; N a138 ; B 35 -14 754 705 ;
161
+ C 191 ; WX 788 ; N a139 ; B 35 -14 754 705 ;
162
+ C 192 ; WX 788 ; N a140 ; B 35 -14 754 705 ;
163
+ C 193 ; WX 788 ; N a141 ; B 35 -14 754 705 ;
164
+ C 194 ; WX 788 ; N a142 ; B 35 -14 754 705 ;
165
+ C 195 ; WX 788 ; N a143 ; B 35 -14 754 705 ;
166
+ C 196 ; WX 788 ; N a144 ; B 35 -14 754 705 ;
167
+ C 197 ; WX 788 ; N a145 ; B 35 -14 754 705 ;
168
+ C 198 ; WX 788 ; N a146 ; B 35 -14 754 705 ;
169
+ C 199 ; WX 788 ; N a147 ; B 35 -14 754 705 ;
170
+ C 200 ; WX 788 ; N a148 ; B 35 -14 754 705 ;
171
+ C 201 ; WX 788 ; N a149 ; B 35 -14 754 705 ;
172
+ C 202 ; WX 788 ; N a150 ; B 35 -14 754 705 ;
173
+ C 203 ; WX 788 ; N a151 ; B 35 -14 754 705 ;
174
+ C 204 ; WX 788 ; N a152 ; B 35 -14 754 705 ;
175
+ C 205 ; WX 788 ; N a153 ; B 35 -14 754 705 ;
176
+ C 206 ; WX 788 ; N a154 ; B 35 -14 754 705 ;
177
+ C 207 ; WX 788 ; N a155 ; B 35 -14 754 705 ;
178
+ C 208 ; WX 788 ; N a156 ; B 35 -14 754 705 ;
179
+ C 209 ; WX 788 ; N a157 ; B 35 -14 754 705 ;
180
+ C 210 ; WX 788 ; N a158 ; B 35 -14 754 705 ;
181
+ C 211 ; WX 788 ; N a159 ; B 35 -14 754 705 ;
182
+ C 212 ; WX 894 ; N a160 ; B 35 58 860 634 ;
183
+ C 213 ; WX 838 ; N a161 ; B 35 152 803 540 ;
184
+ C 214 ; WX 1016 ; N a163 ; B 34 152 981 540 ;
185
+ C 215 ; WX 458 ; N a164 ; B 35 -127 422 820 ;
186
+ C 216 ; WX 748 ; N a196 ; B 35 94 698 597 ;
187
+ C 217 ; WX 924 ; N a165 ; B 35 140 890 552 ;
188
+ C 218 ; WX 748 ; N a192 ; B 35 94 698 597 ;
189
+ C 219 ; WX 918 ; N a166 ; B 35 166 884 526 ;
190
+ C 220 ; WX 927 ; N a167 ; B 35 32 892 660 ;
191
+ C 221 ; WX 928 ; N a168 ; B 35 129 891 562 ;
192
+ C 222 ; WX 928 ; N a169 ; B 35 128 893 563 ;
193
+ C 223 ; WX 834 ; N a170 ; B 35 155 799 537 ;
194
+ C 224 ; WX 873 ; N a171 ; B 35 93 838 599 ;
195
+ C 225 ; WX 828 ; N a172 ; B 35 104 791 588 ;
196
+ C 226 ; WX 924 ; N a173 ; B 35 98 889 594 ;
197
+ C 227 ; WX 924 ; N a162 ; B 35 98 889 594 ;
198
+ C 228 ; WX 917 ; N a174 ; B 35 0 882 692 ;
199
+ C 229 ; WX 930 ; N a175 ; B 35 84 896 608 ;
200
+ C 230 ; WX 931 ; N a176 ; B 35 84 896 608 ;
201
+ C 231 ; WX 463 ; N a177 ; B 35 -99 429 791 ;
202
+ C 232 ; WX 883 ; N a178 ; B 35 71 848 623 ;
203
+ C 233 ; WX 836 ; N a179 ; B 35 44 802 648 ;
204
+ C 234 ; WX 836 ; N a193 ; B 35 44 802 648 ;
205
+ C 235 ; WX 867 ; N a180 ; B 35 101 832 591 ;
206
+ C 236 ; WX 867 ; N a199 ; B 35 101 832 591 ;
207
+ C 237 ; WX 696 ; N a181 ; B 35 44 661 648 ;
208
+ C 238 ; WX 696 ; N a200 ; B 35 44 661 648 ;
209
+ C 239 ; WX 874 ; N a182 ; B 35 77 840 619 ;
210
+ C 241 ; WX 874 ; N a201 ; B 35 73 840 615 ;
211
+ C 242 ; WX 760 ; N a183 ; B 35 0 725 692 ;
212
+ C 243 ; WX 946 ; N a184 ; B 35 160 911 533 ;
213
+ C 244 ; WX 771 ; N a197 ; B 34 37 736 655 ;
214
+ C 245 ; WX 865 ; N a185 ; B 35 207 830 481 ;
215
+ C 246 ; WX 771 ; N a194 ; B 34 37 736 655 ;
216
+ C 247 ; WX 888 ; N a198 ; B 34 -19 853 712 ;
217
+ C 248 ; WX 967 ; N a186 ; B 35 124 932 568 ;
218
+ C 249 ; WX 888 ; N a195 ; B 34 -19 853 712 ;
219
+ C 250 ; WX 831 ; N a187 ; B 35 113 796 579 ;
220
+ C 251 ; WX 873 ; N a188 ; B 36 118 838 578 ;
221
+ C 252 ; WX 927 ; N a189 ; B 35 150 891 542 ;
222
+ C 253 ; WX 970 ; N a190 ; B 35 76 931 616 ;
223
+ C 254 ; WX 918 ; N a191 ; B 34 99 884 593 ;
224
+ EndCharMetrics
225
+ EndFontMetrics
data/lib/pdf/core.rb ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ # PrawnX replaces pdf-core too: this file keeps `require "pdf/core"` working.
4
+ require "prawnx"
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "prawn"
4
+ require "prawnx/measurement_extensions"
@@ -0,0 +1,46 @@
1
+ module Prawn::SVG::Attributes::ClipPath
2
+ def parse_clip_path_attribute_and_call
3
+ return unless (clip_path = properties.clip_path)
4
+ return if clip_path == 'none'
5
+
6
+ clip_path_element = extract_element_from_url_id_reference(clip_path, 'clipPath')
7
+
8
+ if clip_path_element.nil?
9
+ document.warnings << 'Could not resolve clip-path URI to a clipPath element'
10
+ else
11
+ clip_calls = clip_path_element.build_clip_calls(self)
12
+ return if clip_calls.nil?
13
+
14
+ add_call_and_enter 'save_graphics_state'
15
+
16
+ if clip_path_contains_text?(clip_calls)
17
+ # Text in clip paths is implemented using a PDF soft mask. The text
18
+ # renders in white fill inside the mask to define the visible region.
19
+ # This correctly unions multiple text elements, unlike PDF text
20
+ # rendering mode 7 which intersects separate text objects.
21
+ @calls << ['soft_mask', [], {}, clip_calls]
22
+ else
23
+ @calls.concat clip_calls
24
+
25
+ # SVG's clip-rule applies per-element (determining each shape's interior),
26
+ # then elements are unioned. PDF's W* applies even-odd to the entire combined
27
+ # path, which incorrectly creates holes between separate shapes. Only use W*
28
+ # when there's a single child element, where self-intersection matters.
29
+ child_elements = clip_path_element.svg_child_elements
30
+ if child_elements.length == 1 && clip_path_element.computed_properties.clip_rule == 'evenodd'
31
+ add_call 'clip', clip_rule: :even_odd
32
+ else
33
+ add_call 'clip'
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def clip_path_contains_text?(calls)
42
+ calls.any? do |call, _arguments, _kwarguments, children|
43
+ call == 'svg:render' || clip_path_contains_text?(children)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,16 @@
1
+ module Prawn::SVG::Attributes::Mask
2
+ def parse_mask_attribute_and_call
3
+ return unless (mask = properties.mask)
4
+ return if mask == 'none'
5
+
6
+ mask_element = extract_element_from_url_id_reference(mask, 'mask')
7
+
8
+ if mask_element.nil?
9
+ document.warnings << 'Could not resolve mask URI to a mask element'
10
+ else
11
+ add_call_and_enter 'save_graphics_state'
12
+ mask_calls = mask_element.build_mask_calls(self)
13
+ @calls << ['soft_mask', [], {}, mask_calls]
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,30 @@
1
+ module Prawn::SVG::Attributes::Opacity
2
+ def parse_opacity_attributes_and_call
3
+ # The opacity property is not inherited, but the opacity applies to all children underneath the element.
4
+ #
5
+ # Having an opacity property on a parent, and again on a child, multiplies the parent and child's opacities
6
+ # when drawing the children.
7
+ #
8
+ # The fill-opacity and stroke-opacity properties are inherited, but children which have a different value
9
+ # are displayed at that opacity rather than multiplying the parent's fill/stroke opacity with the child's.
10
+ #
11
+ # opacity and fill/stroke opacity can both be applied to the same element, and they multiply together.
12
+
13
+ opacity = computed_properties.opacity&.to_f&.clamp(0, 1)
14
+ fill_opacity = computed_properties.fill_opacity.to_f.clamp(0, 1)
15
+ stroke_opacity = computed_properties.stroke_opacity.to_f.clamp(0, 1)
16
+
17
+ state.opacity *= opacity if opacity
18
+
19
+ fill_opacity = (fill_opacity || 1) * state.opacity
20
+ stroke_opacity = (stroke_opacity || 1) * state.opacity
21
+
22
+ fill_opacity = stroke_opacity = 0 if computed_properties.visibility != 'visible'
23
+
24
+ if state.last_fill_opacity != fill_opacity || state.last_stroke_opacity != stroke_opacity
25
+ state.last_fill_opacity = fill_opacity
26
+ state.last_stroke_opacity = stroke_opacity
27
+ add_call_and_enter 'transparent', fill_opacity, stroke_opacity
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,10 @@
1
+ module Prawn::SVG::Attributes::Space
2
+ def parse_xml_space_attribute
3
+ case attributes['xml:space']
4
+ when 'preserve'
5
+ state.preserve_space = true
6
+ when 'default'
7
+ state.preserve_space = false
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,50 @@
1
+ module Prawn::SVG::Attributes::Stroke
2
+ CAP_STYLE_TRANSLATIONS = { 'butt' => :butt, 'round' => :round, 'square' => :projecting_square }.freeze
3
+ JOIN_STYLE_TRANSLATIONS = { 'miter' => :miter, 'round' => :round, 'bevel' => :bevel }.freeze
4
+
5
+ def parse_stroke_attributes_and_call
6
+ if (width_string = properties.stroke_width)
7
+ width = pixels(width_string)
8
+ state.stroke_width = width
9
+ add_call('line_width', width)
10
+ end
11
+
12
+ if (linecap = properties.stroke_linecap) && linecap != 'inherit'
13
+ add_call('cap_style', CAP_STYLE_TRANSLATIONS.fetch(linecap, :butt))
14
+ end
15
+
16
+ if (linejoin = properties.stroke_linejoin) && linejoin != 'inherit'
17
+ add_call('join_style', JOIN_STYLE_TRANSLATIONS.fetch(linejoin, :miter))
18
+ end
19
+
20
+ if (miterlimit = properties.stroke_miterlimit) && miterlimit != 'inherit'
21
+ add_call('miter_limit', miterlimit)
22
+ end
23
+
24
+ if (dasharray = properties.stroke_dasharray)
25
+ case dasharray
26
+ when 'inherit'
27
+ # don't do anything
28
+ when 'none'
29
+ add_call('undash')
30
+ when Array
31
+ dasharray *= 2 if dasharray.length.odd?
32
+ values = dasharray.map { |value| pixels(value) }
33
+
34
+ if values.inject(0) { |a, b| a + b }.zero?
35
+ add_call('undash')
36
+ else
37
+ options = {}
38
+ offset = computed_properties.stroke_dashoffset
39
+ if offset && offset != 0 && offset != 'inherit'
40
+ phase = pixels(offset)
41
+ options[:phase] = phase unless phase.zero?
42
+ end
43
+ add_call('dash', values, **options)
44
+ end
45
+ else
46
+ raise "Unknown dasharray value: #{dasharray.inspect}"
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,10 @@
1
+ module Prawn::SVG::Attributes::Transform
2
+ def parse_transform_attribute_and_call
3
+ # Some elements do not support transforms
4
+ return unless transformable?
5
+ return unless (transform = attributes['transform'])
6
+
7
+ matrix = matrix_for_pdf(parse_transform_attribute(transform))
8
+ add_call_and_enter 'transformation_matrix', *matrix unless matrix == [1, 0, 0, 1, 0, 0]
9
+ end
10
+ end
@@ -0,0 +1,6 @@
1
+ module Prawn::SVG::Attributes
2
+ end
3
+
4
+ %w[transform opacity clip_path mask stroke space].each do |name|
5
+ require "prawn/svg/attributes/#{name}"
6
+ end
@@ -0,0 +1,57 @@
1
+ module Prawn::SVG::Calculators
2
+ module ArcToBezierCurve
3
+ protected
4
+
5
+ # Convert the elliptical arc to a cubic bézier curve using this algorithm:
6
+ # http://www.spaceroots.org/documents/ellipse/elliptical-arc.pdf
7
+ #
8
+ # eta_1 and eta_2 are the eccentric anomaly angles (the parametric angles on the
9
+ # unit circle that map to points on the ellipse). theta is the ellipse rotation angle.
10
+ def calculate_bezier_curve_points_for_arc(cx, cy, a, b, eta_1, eta_2, theta)
11
+ e = lambda do |eta|
12
+ [
13
+ cx + (a * Math.cos(theta) * Math.cos(eta)) - (b * Math.sin(theta) * Math.sin(eta)),
14
+ cy + (a * Math.sin(theta) * Math.cos(eta)) + (b * Math.cos(theta) * Math.sin(eta))
15
+ ]
16
+ end
17
+
18
+ ep = lambda do |eta|
19
+ [
20
+ (-a * Math.cos(theta) * Math.sin(eta)) - (b * Math.sin(theta) * Math.cos(eta)),
21
+ (-a * Math.sin(theta) * Math.sin(eta)) + (b * Math.cos(theta) * Math.cos(eta))
22
+ ]
23
+ end
24
+
25
+ iterations = 1
26
+ d_eta = eta_2 - eta_1
27
+
28
+ while iterations < 1024
29
+ break if d_eta.abs <= Math::PI / 2.0
30
+
31
+ iterations *= 2
32
+ d_eta = (eta_2 - eta_1) / iterations
33
+ end
34
+
35
+ (0...iterations).collect do |iteration|
36
+ seg_eta_a = eta_1 + (iteration * d_eta)
37
+ seg_eta_b = eta_1 + ((iteration + 1) * d_eta)
38
+ seg_d_eta = seg_eta_b - seg_eta_a
39
+
40
+ alpha = Math.sin(seg_d_eta) * ((Math.sqrt(4 + (3 * (Math.tan(seg_d_eta / 2)**2))) - 1) / 3)
41
+
42
+ x1, y1 = e[seg_eta_a]
43
+ x2, y2 = e[seg_eta_b]
44
+
45
+ ep_eta1_x, ep_eta1_y = ep[seg_eta_a]
46
+ q1_x = x1 + (alpha * ep_eta1_x)
47
+ q1_y = y1 + (alpha * ep_eta1_y)
48
+
49
+ ep_eta2_x, ep_eta2_y = ep[seg_eta_b]
50
+ q2_x = x2 - (alpha * ep_eta2_x)
51
+ q2_y = y2 - (alpha * ep_eta2_y)
52
+
53
+ { p2: [x2, y2], q1: [q1_x, q1_y], q2: [q2_x, q2_y] }
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,60 @@
1
+ module Prawn::SVG::Calculators
2
+ class AspectRatio
3
+ attr_reader :align, :defer
4
+ attr_reader :width, :height, :x, :y
5
+
6
+ def initialize(value, container_dimensions, object_dimensions)
7
+ values = (value || 'xMidYMid meet').split
8
+ @x = @y = 0
9
+
10
+ if values.first == 'defer'
11
+ @defer = true
12
+ values.shift
13
+ end
14
+
15
+ @align, @meet_or_slice = values
16
+
17
+ w_container, h_container = container_dimensions
18
+ w_object, h_object = object_dimensions
19
+
20
+ container_ratio = w_container / h_container.to_f
21
+ object_ratio = w_object / h_object.to_f
22
+
23
+ if @align == 'none'
24
+ @width, @height = container_dimensions
25
+ else
26
+ matches = @align.to_s.strip.match(/\Ax(Min|Mid|Max)Y(Min|Mid|Max)\z/i) || [nil, 'Mid', 'Mid']
27
+
28
+ if (container_ratio > object_ratio) == slice?
29
+ @width = w_container
30
+ @height = w_container / object_ratio
31
+ @y = case matches[2].downcase
32
+ when 'min' then 0
33
+ when 'mid' then (h_container - (w_container / object_ratio)) / 2
34
+ when 'max' then h_container - (w_container / object_ratio)
35
+ end
36
+ else
37
+ @width = h_container * object_ratio
38
+ @height = h_container
39
+ @x = case matches[1].downcase
40
+ when 'min' then 0
41
+ when 'mid' then (w_container - (h_container * object_ratio)) / 2
42
+ when 'max' then w_container - (h_container * object_ratio)
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ def slice?
49
+ @meet_or_slice == 'slice'
50
+ end
51
+
52
+ def meet?
53
+ @meet_or_slice != 'slice'
54
+ end
55
+
56
+ def inspect
57
+ "[AspectRatio: #{@width},#{@height} offset #{@x},#{@y}]"
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,103 @@
1
+ module Prawn::SVG::Calculators
2
+ class DocumentSizing
3
+ DEFAULT_ASPECT_RATIO = 'xMidYMid meet'.freeze
4
+
5
+ attr_writer :document_width, :document_height
6
+ attr_writer :view_box, :preserve_aspect_ratio
7
+
8
+ attr_reader :bounds
9
+ attr_reader :x_offset, :y_offset, :x_scale, :y_scale
10
+ attr_reader :viewport_width, :viewport_height, :viewport_diagonal, :output_width, :output_height
11
+
12
+ def initialize(bounds, attributes = nil)
13
+ @bounds = bounds
14
+ set_from_attributes(attributes) if attributes
15
+ end
16
+
17
+ def set_from_attributes(attributes)
18
+ @document_width = attributes['width']
19
+ @document_height = attributes['height']
20
+ @view_box = attributes['viewBox']
21
+ @preserve_aspect_ratio = attributes['preserveAspectRatio'] || DEFAULT_ASPECT_RATIO
22
+ end
23
+
24
+ def calculate
25
+ @x_offset = @y_offset = 0
26
+ @x_scale = @y_scale = 1
27
+
28
+ container_width = @requested_width || @bounds[0]
29
+ container_height = @requested_height || @bounds[1]
30
+
31
+ @output_width = Pixels::Measurement.to_pixels(@document_width || @requested_width, container_width)
32
+ @output_height = Pixels::Measurement.to_pixels(@document_height || @requested_height, container_height)
33
+
34
+ if @view_box
35
+ values = @view_box.strip.split(Prawn::SVG::Elements::COMMA_WSP_REGEXP)
36
+ @x_offset, @y_offset, @viewport_width, @viewport_height = values.map(&:to_f)
37
+
38
+ if @viewport_width.positive? && @viewport_height.positive?
39
+ # If neither the width nor height was specified, use the entire width and the viewbox ratio
40
+ # to determine the height.
41
+ @output_width = container_width if @output_width.nil? && @output_height.nil?
42
+
43
+ # If one of the output dimensions is missing, calculate it from the other one
44
+ # using the ratio of the viewport width to height.
45
+ @output_width ||= @output_height * @viewport_width / @viewport_height
46
+ @output_height ||= @output_width * @viewport_height / @viewport_width
47
+
48
+ aspect = AspectRatio.new(@preserve_aspect_ratio, [@output_width, @output_height],
49
+ [@viewport_width, @viewport_height])
50
+ @x_scale = aspect.width / @viewport_width
51
+ @y_scale = aspect.height / @viewport_height
52
+ @x_offset -= aspect.x / @x_scale
53
+ @y_offset -= aspect.y / @y_scale
54
+ end
55
+ else
56
+ @output_width ||= container_width
57
+ @output_height ||= container_height
58
+
59
+ @viewport_width = @output_width
60
+ @viewport_height = @output_height
61
+ end
62
+
63
+ return if invalid?
64
+
65
+ # SVG 1.1 section 7.10
66
+ @viewport_diagonal = Math.sqrt((@viewport_width**2) + (@viewport_height**2)) / Math.sqrt(2)
67
+
68
+ if @requested_width
69
+ scale = @requested_width / @output_width
70
+ @output_width = @requested_width
71
+ @output_height *= scale
72
+ @x_scale *= scale
73
+ @y_scale *= scale
74
+
75
+ elsif @requested_height
76
+ scale = @requested_height / @output_height
77
+ @output_height = @requested_height
78
+ @output_width *= scale
79
+ @x_scale *= scale
80
+ @y_scale *= scale
81
+ end
82
+
83
+ self
84
+ end
85
+
86
+ def invalid?
87
+ @viewport_width <= 0 ||
88
+ @viewport_height <= 0 ||
89
+ @output_width <= 0 ||
90
+ @output_height <= 0 ||
91
+ (@requested_width && @requested_width <= 0) ||
92
+ (@requested_height && @requested_height <= 0)
93
+ end
94
+
95
+ def requested_width=(value)
96
+ @requested_width = value&.to_f
97
+ end
98
+
99
+ def requested_height=(value)
100
+ @requested_height = value&.to_f
101
+ end
102
+ end
103
+ end