hexapdf 0.15.9 → 0.17.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (216) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +62 -0
  3. data/LICENSE +1 -1
  4. data/README.md +11 -2
  5. data/Rakefile +2 -1
  6. data/examples/002-graphics.rb +4 -4
  7. data/lib/hexapdf/cli/batch.rb +1 -1
  8. data/lib/hexapdf/cli/command.rb +10 -1
  9. data/lib/hexapdf/cli/files.rb +1 -1
  10. data/lib/hexapdf/cli/fonts.rb +145 -0
  11. data/lib/hexapdf/cli/form.rb +27 -26
  12. data/lib/hexapdf/cli/image2pdf.rb +1 -1
  13. data/lib/hexapdf/cli/images.rb +1 -10
  14. data/lib/hexapdf/cli/info.rb +1 -1
  15. data/lib/hexapdf/cli/inspect.rb +1 -1
  16. data/lib/hexapdf/cli/merge.rb +1 -1
  17. data/lib/hexapdf/cli/modify.rb +1 -1
  18. data/lib/hexapdf/cli/optimize.rb +1 -1
  19. data/lib/hexapdf/cli/split.rb +1 -1
  20. data/lib/hexapdf/cli/watermark.rb +1 -1
  21. data/lib/hexapdf/cli.rb +3 -1
  22. data/lib/hexapdf/composer.rb +1 -1
  23. data/lib/hexapdf/configuration.rb +11 -2
  24. data/lib/hexapdf/content/canvas.rb +658 -167
  25. data/lib/hexapdf/content/color_space.rb +185 -3
  26. data/lib/hexapdf/content/graphic_object/arc.rb +111 -12
  27. data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +67 -1
  28. data/lib/hexapdf/content/graphic_object/geom2d.rb +14 -1
  29. data/lib/hexapdf/content/graphic_object/solid_arc.rb +1 -1
  30. data/lib/hexapdf/content/graphic_object.rb +1 -1
  31. data/lib/hexapdf/content/graphics_state.rb +1 -1
  32. data/lib/hexapdf/content/operator.rb +1 -1
  33. data/lib/hexapdf/content/parser.rb +1 -1
  34. data/lib/hexapdf/content/processor.rb +1 -1
  35. data/lib/hexapdf/content/transformation_matrix.rb +1 -1
  36. data/lib/hexapdf/content.rb +1 -1
  37. data/lib/hexapdf/data_dir.rb +1 -1
  38. data/lib/hexapdf/dictionary.rb +1 -1
  39. data/lib/hexapdf/dictionary_fields.rb +30 -4
  40. data/lib/hexapdf/document/files.rb +3 -3
  41. data/lib/hexapdf/document/fonts.rb +1 -1
  42. data/lib/hexapdf/document/images.rb +1 -1
  43. data/lib/hexapdf/document/pages.rb +1 -1
  44. data/lib/hexapdf/document.rb +1 -1
  45. data/lib/hexapdf/encryption/aes.rb +1 -1
  46. data/lib/hexapdf/encryption/arc4.rb +1 -1
  47. data/lib/hexapdf/encryption/fast_aes.rb +1 -1
  48. data/lib/hexapdf/encryption/fast_arc4.rb +1 -1
  49. data/lib/hexapdf/encryption/identity.rb +1 -1
  50. data/lib/hexapdf/encryption/ruby_aes.rb +1 -1
  51. data/lib/hexapdf/encryption/ruby_arc4.rb +1 -1
  52. data/lib/hexapdf/encryption/security_handler.rb +1 -1
  53. data/lib/hexapdf/encryption/standard_security_handler.rb +1 -1
  54. data/lib/hexapdf/encryption.rb +1 -1
  55. data/lib/hexapdf/error.rb +1 -1
  56. data/lib/hexapdf/filter/ascii85_decode.rb +1 -1
  57. data/lib/hexapdf/filter/ascii_hex_decode.rb +1 -1
  58. data/lib/hexapdf/filter/crypt.rb +1 -1
  59. data/lib/hexapdf/filter/encryption.rb +1 -1
  60. data/lib/hexapdf/filter/flate_decode.rb +1 -1
  61. data/lib/hexapdf/filter/lzw_decode.rb +1 -1
  62. data/lib/hexapdf/filter/pass_through.rb +1 -1
  63. data/lib/hexapdf/filter/predictor.rb +1 -1
  64. data/lib/hexapdf/filter/run_length_decode.rb +1 -1
  65. data/lib/hexapdf/filter.rb +1 -1
  66. data/lib/hexapdf/font/cmap/parser.rb +1 -1
  67. data/lib/hexapdf/font/cmap/writer.rb +1 -1
  68. data/lib/hexapdf/font/cmap.rb +1 -1
  69. data/lib/hexapdf/font/encoding/base.rb +1 -1
  70. data/lib/hexapdf/font/encoding/difference_encoding.rb +1 -1
  71. data/lib/hexapdf/font/encoding/glyph_list.rb +1 -1
  72. data/lib/hexapdf/font/encoding/mac_expert_encoding.rb +1 -1
  73. data/lib/hexapdf/font/encoding/mac_roman_encoding.rb +1 -1
  74. data/lib/hexapdf/font/encoding/standard_encoding.rb +1 -1
  75. data/lib/hexapdf/font/encoding/symbol_encoding.rb +1 -1
  76. data/lib/hexapdf/font/encoding/win_ansi_encoding.rb +1 -1
  77. data/lib/hexapdf/font/encoding/zapf_dingbats_encoding.rb +1 -1
  78. data/lib/hexapdf/font/encoding.rb +1 -1
  79. data/lib/hexapdf/font/invalid_glyph.rb +1 -1
  80. data/lib/hexapdf/font/true_type/builder.rb +1 -1
  81. data/lib/hexapdf/font/true_type/font.rb +1 -1
  82. data/lib/hexapdf/font/true_type/optimizer.rb +1 -1
  83. data/lib/hexapdf/font/true_type/subsetter.rb +1 -1
  84. data/lib/hexapdf/font/true_type/table/cmap.rb +1 -1
  85. data/lib/hexapdf/font/true_type/table/cmap_subtable.rb +1 -1
  86. data/lib/hexapdf/font/true_type/table/directory.rb +1 -1
  87. data/lib/hexapdf/font/true_type/table/glyf.rb +1 -1
  88. data/lib/hexapdf/font/true_type/table/head.rb +1 -1
  89. data/lib/hexapdf/font/true_type/table/hhea.rb +1 -1
  90. data/lib/hexapdf/font/true_type/table/hmtx.rb +1 -1
  91. data/lib/hexapdf/font/true_type/table/kern.rb +1 -1
  92. data/lib/hexapdf/font/true_type/table/loca.rb +1 -1
  93. data/lib/hexapdf/font/true_type/table/maxp.rb +1 -1
  94. data/lib/hexapdf/font/true_type/table/name.rb +1 -1
  95. data/lib/hexapdf/font/true_type/table/os2.rb +1 -1
  96. data/lib/hexapdf/font/true_type/table/post.rb +1 -1
  97. data/lib/hexapdf/font/true_type/table.rb +1 -1
  98. data/lib/hexapdf/font/true_type.rb +1 -1
  99. data/lib/hexapdf/font/true_type_wrapper.rb +1 -1
  100. data/lib/hexapdf/font/type1/afm_parser.rb +1 -1
  101. data/lib/hexapdf/font/type1/character_metrics.rb +1 -1
  102. data/lib/hexapdf/font/type1/font.rb +1 -1
  103. data/lib/hexapdf/font/type1/font_metrics.rb +1 -1
  104. data/lib/hexapdf/font/type1/pfb_parser.rb +1 -1
  105. data/lib/hexapdf/font/type1.rb +1 -1
  106. data/lib/hexapdf/font/type1_wrapper.rb +1 -1
  107. data/lib/hexapdf/font_loader/from_configuration.rb +1 -1
  108. data/lib/hexapdf/font_loader/from_file.rb +1 -1
  109. data/lib/hexapdf/font_loader/standard14.rb +1 -1
  110. data/lib/hexapdf/font_loader.rb +1 -1
  111. data/lib/hexapdf/image_loader/jpeg.rb +1 -1
  112. data/lib/hexapdf/image_loader/pdf.rb +1 -1
  113. data/lib/hexapdf/image_loader/png.rb +1 -1
  114. data/lib/hexapdf/image_loader.rb +1 -1
  115. data/lib/hexapdf/importer.rb +1 -1
  116. data/lib/hexapdf/layout/box.rb +4 -2
  117. data/lib/hexapdf/layout/frame.rb +1 -1
  118. data/lib/hexapdf/layout/image_box.rb +1 -1
  119. data/lib/hexapdf/layout/inline_box.rb +1 -1
  120. data/lib/hexapdf/layout/line.rb +1 -1
  121. data/lib/hexapdf/layout/numeric_refinements.rb +1 -1
  122. data/lib/hexapdf/layout/style.rb +40 -2
  123. data/lib/hexapdf/layout/text_box.rb +1 -1
  124. data/lib/hexapdf/layout/text_fragment.rb +1 -1
  125. data/lib/hexapdf/layout/text_layouter.rb +1 -1
  126. data/lib/hexapdf/layout/text_shaper.rb +1 -1
  127. data/lib/hexapdf/layout/width_from_polygon.rb +2 -2
  128. data/lib/hexapdf/layout.rb +1 -1
  129. data/lib/hexapdf/name_tree_node.rb +1 -1
  130. data/lib/hexapdf/number_tree_node.rb +1 -1
  131. data/lib/hexapdf/object.rb +1 -1
  132. data/lib/hexapdf/parser.rb +1 -1
  133. data/lib/hexapdf/pdf_array.rb +1 -1
  134. data/lib/hexapdf/rectangle.rb +1 -1
  135. data/lib/hexapdf/reference.rb +1 -1
  136. data/lib/hexapdf/revision.rb +1 -1
  137. data/lib/hexapdf/revisions.rb +1 -1
  138. data/lib/hexapdf/serializer.rb +1 -1
  139. data/lib/hexapdf/stream.rb +1 -1
  140. data/lib/hexapdf/task/dereference.rb +1 -1
  141. data/lib/hexapdf/task/optimize.rb +1 -1
  142. data/lib/hexapdf/task.rb +1 -1
  143. data/lib/hexapdf/tokenizer.rb +1 -1
  144. data/lib/hexapdf/type/acro_form/appearance_generator.rb +14 -7
  145. data/lib/hexapdf/type/acro_form/button_field.rb +53 -28
  146. data/lib/hexapdf/type/acro_form/choice_field.rb +1 -1
  147. data/lib/hexapdf/type/acro_form/field.rb +21 -2
  148. data/lib/hexapdf/type/acro_form/form.rb +48 -29
  149. data/lib/hexapdf/type/acro_form/text_field.rb +2 -2
  150. data/lib/hexapdf/type/acro_form/variable_text_field.rb +17 -9
  151. data/lib/hexapdf/type/acro_form.rb +1 -1
  152. data/lib/hexapdf/type/action.rb +1 -1
  153. data/lib/hexapdf/type/actions/go_to.rb +1 -1
  154. data/lib/hexapdf/type/actions/go_to_r.rb +1 -1
  155. data/lib/hexapdf/type/actions/launch.rb +1 -1
  156. data/lib/hexapdf/type/actions/uri.rb +1 -1
  157. data/lib/hexapdf/type/actions.rb +1 -1
  158. data/lib/hexapdf/type/annotation.rb +1 -1
  159. data/lib/hexapdf/type/annotations/link.rb +1 -1
  160. data/lib/hexapdf/type/annotations/markup_annotation.rb +1 -1
  161. data/lib/hexapdf/type/annotations/text.rb +1 -1
  162. data/lib/hexapdf/type/annotations/widget.rb +2 -2
  163. data/lib/hexapdf/type/annotations.rb +1 -1
  164. data/lib/hexapdf/type/catalog.rb +1 -1
  165. data/lib/hexapdf/type/cid_font.rb +1 -1
  166. data/lib/hexapdf/type/embedded_file.rb +1 -1
  167. data/lib/hexapdf/type/file_specification.rb +1 -1
  168. data/lib/hexapdf/type/font.rb +1 -1
  169. data/lib/hexapdf/type/font_descriptor.rb +1 -1
  170. data/lib/hexapdf/type/font_simple.rb +1 -1
  171. data/lib/hexapdf/type/font_true_type.rb +1 -1
  172. data/lib/hexapdf/type/font_type0.rb +1 -1
  173. data/lib/hexapdf/type/font_type1.rb +1 -1
  174. data/lib/hexapdf/type/font_type3.rb +1 -1
  175. data/lib/hexapdf/type/form.rb +1 -1
  176. data/lib/hexapdf/type/graphics_state_parameter.rb +1 -1
  177. data/lib/hexapdf/type/icon_fit.rb +1 -1
  178. data/lib/hexapdf/type/image.rb +1 -1
  179. data/lib/hexapdf/type/info.rb +1 -1
  180. data/lib/hexapdf/type/names.rb +1 -1
  181. data/lib/hexapdf/type/object_stream.rb +1 -1
  182. data/lib/hexapdf/type/page.rb +15 -1
  183. data/lib/hexapdf/type/page_tree_node.rb +1 -1
  184. data/lib/hexapdf/type/resources.rb +1 -1
  185. data/lib/hexapdf/type/trailer.rb +1 -1
  186. data/lib/hexapdf/type/viewer_preferences.rb +1 -1
  187. data/lib/hexapdf/type/xref_stream.rb +1 -1
  188. data/lib/hexapdf/type.rb +1 -1
  189. data/lib/hexapdf/utils/bit_field.rb +1 -1
  190. data/lib/hexapdf/utils/bit_stream.rb +1 -1
  191. data/lib/hexapdf/utils/graphics_helpers.rb +1 -1
  192. data/lib/hexapdf/utils/lru_cache.rb +1 -1
  193. data/lib/hexapdf/utils/math_helpers.rb +1 -1
  194. data/lib/hexapdf/utils/object_hash.rb +1 -1
  195. data/lib/hexapdf/utils/pdf_doc_encoding.rb +1 -1
  196. data/lib/hexapdf/utils/sorted_tree_node.rb +1 -1
  197. data/lib/hexapdf/version.rb +2 -2
  198. data/lib/hexapdf/writer.rb +1 -1
  199. data/lib/hexapdf/xref_section.rb +1 -1
  200. data/lib/hexapdf.rb +1 -1
  201. data/test/hexapdf/content/graphic_object/test_arc.rb +16 -7
  202. data/test/hexapdf/content/test_canvas.rb +63 -0
  203. data/test/hexapdf/content/test_color_space.rb +13 -1
  204. data/test/hexapdf/layout/test_box.rb +2 -0
  205. data/test/hexapdf/layout/test_style.rb +11 -0
  206. data/test/hexapdf/layout/test_width_from_polygon.rb +1 -0
  207. data/test/hexapdf/test_dictionary_fields.rb +24 -0
  208. data/test/hexapdf/test_writer.rb +2 -2
  209. data/test/hexapdf/type/acro_form/test_appearance_generator.rb +2 -1
  210. data/test/hexapdf/type/acro_form/test_button_field.rb +19 -13
  211. data/test/hexapdf/type/acro_form/test_field.rb +12 -0
  212. data/test/hexapdf/type/acro_form/test_form.rb +4 -0
  213. data/test/hexapdf/type/acro_form/test_text_field.rb +6 -0
  214. data/test/hexapdf/type/acro_form/test_variable_text_field.rb +15 -4
  215. data/test/hexapdf/type/test_page.rb +11 -0
  216. metadata +4 -3
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -96,6 +96,170 @@ module HexaPDF
96
96
  # See: PDF1.7 s8.6
97
97
  module ColorSpace
98
98
 
99
+ # Mapping of CSS Color Module Level 3 names to RGB values.
100
+ #
101
+ # Visual listing of all colors:
102
+ #
103
+ # #>pdf-big
104
+ # canvas.font("Helvetica", size: 8)
105
+ # map = HexaPDF::Content::ColorSpace::CSS_COLOR_NAMES
106
+ # map.each_slice(38).each_with_index do |slice, col|
107
+ # x = 10 + col * 100
108
+ # slice.each_with_index do |(name, rgb), row|
109
+ # canvas.fill_color(rgb).rectangle(x, 380 - row * 10, 10, 10).fill
110
+ # canvas.fill_color("black").text(name, at: [x + 15, 380 - row * 10 + 2])
111
+ # end
112
+ # end
113
+ CSS_COLOR_NAMES = {
114
+ "aliceblue" => [240, 248, 255],
115
+ "antiquewhite" => [250, 235, 215],
116
+ "aqua" => [0, 255, 255],
117
+ "aquamarine" => [127, 255, 212],
118
+ "azure" => [240, 255, 255],
119
+ "beige" => [245, 245, 220],
120
+ "bisque" => [255, 228, 196],
121
+ "black" => [0, 0, 0],
122
+ "blanchedalmond" => [255, 235, 205],
123
+ "blue" => [0, 0, 255],
124
+ "blueviolet" => [138, 43, 226],
125
+ "brown" => [165, 42, 42],
126
+ "burlywood" => [222, 184, 135],
127
+ "cadetblue" => [95, 158, 160],
128
+ "chartreuse" => [127, 255, 0],
129
+ "chocolate" => [210, 105, 30],
130
+ "coral" => [255, 127, 80],
131
+ "cornflowerblue" => [100, 149, 237],
132
+ "cornsilk" => [255, 248, 220],
133
+ "crimson" => [220, 20, 60],
134
+ "cyan" => [0, 255, 255],
135
+ "darkblue" => [0, 0, 139],
136
+ "darkcyan" => [0, 139, 139],
137
+ "darkgoldenrod" => [184, 134, 11],
138
+ "darkgray" => [169, 169, 169],
139
+ "darkgreen" => [0, 100, 0],
140
+ "darkgrey" => [169, 169, 169],
141
+ "darkkhaki" => [189, 183, 107],
142
+ "darkmagenta" => [139, 0, 139],
143
+ "darkolivegreen" => [85, 107, 47],
144
+ "darkorange" => [255, 140, 0],
145
+ "darkorchid" => [153, 50, 204],
146
+ "darkred" => [139, 0, 0],
147
+ "darksalmon" => [233, 150, 122],
148
+ "darkseagreen" => [143, 188, 143],
149
+ "darkslateblue" => [72, 61, 139],
150
+ "darkslategray" => [47, 79, 79],
151
+ "darkslategrey" => [47, 79, 79],
152
+ "darkturquoise" => [0, 206, 209],
153
+ "darkviolet" => [148, 0, 211],
154
+ "deeppink" => [255, 20, 147],
155
+ "deepskyblue" => [0, 191, 255],
156
+ "dimgray" => [105, 105, 105],
157
+ "dimgrey" => [105, 105, 105],
158
+ "dodgerblue" => [30, 144, 255],
159
+ "firebrick" => [178, 34, 34],
160
+ "floralwhite" => [255, 250, 240],
161
+ "forestgreen" => [34, 139, 34],
162
+ "fuchsia" => [255, 0, 255],
163
+ "gainsboro" => [220, 220, 220],
164
+ "ghostwhite" => [248, 248, 255],
165
+ "gold" => [255, 215, 0],
166
+ "goldenrod" => [218, 165, 32],
167
+ "gray" => [128, 128, 128],
168
+ "green" => [0, 128, 0],
169
+ "greenyellow" => [173, 255, 47],
170
+ "grey" => [128, 128, 128],
171
+ "honeydew" => [240, 255, 240],
172
+ "hotpink" => [255, 105, 180],
173
+ "indianred" => [205, 92, 92],
174
+ "indigo" => [75, 0, 130],
175
+ "ivory" => [255, 255, 240],
176
+ "khaki" => [240, 230, 140],
177
+ "lavender" => [230, 230, 250],
178
+ "lavenderblush" => [255, 240, 245],
179
+ "lawngreen" => [124, 252, 0],
180
+ "lemonchiffon" => [255, 250, 205],
181
+ "lightblue" => [173, 216, 230],
182
+ "lightcoral" => [240, 128, 128],
183
+ "lightcyan" => [224, 255, 255],
184
+ "lightgoldenrodyellow" => [250, 250, 210],
185
+ "lightgray" => [211, 211, 211],
186
+ "lightgreen" => [144, 238, 144],
187
+ "lightgrey" => [211, 211, 211],
188
+ "lightpink" => [255, 182, 193],
189
+ "lightsalmon" => [255, 160, 122],
190
+ "lightseagreen" => [32, 178, 170],
191
+ "lightskyblue" => [135, 206, 250],
192
+ "lightslategray" => [119, 136, 153],
193
+ "lightslategrey" => [119, 136, 153],
194
+ "lightsteelblue" => [176, 196, 222],
195
+ "lightyellow" => [255, 255, 224],
196
+ "lime" => [0, 255, 0],
197
+ "limegreen" => [50, 205, 50],
198
+ "linen" => [250, 240, 230],
199
+ "magenta" => [255, 0, 255],
200
+ "maroon" => [128, 0, 0],
201
+ "mediumaquamarine" => [102, 205, 170],
202
+ "mediumblue" => [0, 0, 205],
203
+ "mediumorchid" => [186, 85, 211],
204
+ "mediumpurple" => [147, 112, 219],
205
+ "mediumseagreen" => [60, 179, 113],
206
+ "mediumslateblue" => [123, 104, 238],
207
+ "mediumspringgreen" => [0, 250, 154],
208
+ "mediumturquoise" => [72, 209, 204],
209
+ "mediumvioletred" => [199, 21, 133],
210
+ "midnightblue" => [25, 25, 112],
211
+ "mintcream" => [245, 255, 250],
212
+ "mistyrose" => [255, 228, 225],
213
+ "moccasin" => [255, 228, 181],
214
+ "navajowhite" => [255, 222, 173],
215
+ "navy" => [0, 0, 128],
216
+ "oldlace" => [253, 245, 230],
217
+ "olive" => [128, 128, 0],
218
+ "olivedrab" => [107, 142, 35],
219
+ "orange" => [255, 165, 0],
220
+ "orangered" => [255, 69, 0],
221
+ "orchid" => [218, 112, 214],
222
+ "palegoldenrod" => [238, 232, 170],
223
+ "palegreen" => [152, 251, 152],
224
+ "paleturquoise" => [175, 238, 238],
225
+ "palevioletred" => [219, 112, 147],
226
+ "papayawhip" => [255, 239, 213],
227
+ "peachpuff" => [255, 218, 185],
228
+ "peru" => [205, 133, 63],
229
+ "pink" => [255, 192, 203],
230
+ "plum" => [221, 160, 221],
231
+ "powderblue" => [176, 224, 230],
232
+ "purple" => [128, 0, 128],
233
+ "red" => [255, 0, 0],
234
+ "rosybrown" => [188, 143, 143],
235
+ "royalblue" => [65, 105, 225],
236
+ "saddlebrown" => [139, 69, 19],
237
+ "salmon" => [250, 128, 114],
238
+ "sandybrown" => [244, 164, 96],
239
+ "seagreen" => [46, 139, 87],
240
+ "seashell" => [255, 245, 238],
241
+ "sienna" => [160, 82, 45],
242
+ "silver" => [192, 192, 192],
243
+ "skyblue" => [135, 206, 235],
244
+ "slateblue" => [106, 90, 205],
245
+ "slategray" => [112, 128, 144],
246
+ "slategrey" => [112, 128, 144],
247
+ "snow" => [255, 250, 250],
248
+ "springgreen" => [0, 255, 127],
249
+ "steelblue" => [70, 130, 180],
250
+ "tan" => [210, 180, 140],
251
+ "teal" => [0, 128, 128],
252
+ "thistle" => [216, 191, 216],
253
+ "tomato" => [255, 99, 71],
254
+ "turquoise" => [64, 224, 208],
255
+ "violet" => [238, 130, 238],
256
+ "wheat" => [245, 222, 179],
257
+ "white" => [255, 255, 255],
258
+ "whitesmoke" => [245, 245, 245],
259
+ "yellow" => [255, 255, 0],
260
+ "yellowgreen" => [154, 205, 50],
261
+ }.freeze
262
+
99
263
  # :call-seq:
100
264
  # ColorSpace.device_color_from_specification(gray) => color
101
265
  # ColorSpace.device_color_from_specification(r, g, b) => color
@@ -111,14 +275,32 @@ module HexaPDF
111
275
  # * Three numeric arguments specify an RGB color (see DeviceRGB::Color).
112
276
  # * A string in the format "RRGGBB" where "RR" is the hexadecimal number for the red, "GG"
113
277
  # for the green and "BB" for the blue color value also specifies an RGB color.
278
+ # * As does a string in the format "RGB" where "RR", "GG" and "BB" would be used as the
279
+ # hexadecimal numbers for the red, green and blue color values of an RGB color.
280
+ # * Any other string is treated as a CSS Color Module Level 3 color name, see
281
+ # https://www.w3.org/TR/css-color-3/#svg-color.
114
282
  # * Four numeric arguments specify a CMYK color (see DeviceCMYK::Color).
115
283
  # * An array is treated as if its items were specified separately as arguments.
116
284
  #
117
285
  # Note that it makes a difference whether integer or float values are used because the given
118
- # values are first normalized - see DeviceGray#color, DeviceRGB#color and DeviceCMYK#color.
286
+ # values are first normalized (expected range by the PDF specification is 0.0 - 1.0) - see
287
+ # DeviceGray#color, DeviceRGB#color and DeviceCMYK#color for details.
288
+ #
289
+ # For examples see HexaPDF::Content::Canvas#stroke_color.
119
290
  def self.device_color_from_specification(*spec)
120
291
  spec.flatten!
121
- spec = spec[0].scan(/../).map!(&:hex) if spec.length == 1 && spec[0].kind_of?(String)
292
+ first_item = spec[0]
293
+ if spec.length == 1 && first_item.kind_of?(String)
294
+ spec = if first_item.match?(/\A\h{6}\z/)
295
+ first_item.scan(/../).map!(&:hex)
296
+ elsif first_item.match?(/\A\h{3}\z/)
297
+ first_item.each_char.map {|x| (x*2).hex}
298
+ elsif CSS_COLOR_NAMES.key?(first_item)
299
+ CSS_COLOR_NAMES[first_item]
300
+ else
301
+ raise ArgumentError, "Given string is neither a hex color nor a color name"
302
+ end
303
+ end
122
304
  GlobalConfiguration.constantize('color_space.map', for_components(spec)).new.color(*spec)
123
305
  end
124
306
 
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -40,11 +40,20 @@ module HexaPDF
40
40
  module Content
41
41
  module GraphicObject
42
42
 
43
- # This class describes an elliptical in center parameterization arc that is approximated using
43
+ # This class describes an elliptical arc in center parameterization that is approximated using
44
44
  # Bezier curves. It can be used to draw circles, circular arcs, ellipses and elliptical arcs,
45
45
  # all either in clockwise or counterclockwise direction and optionally inclined in respect to
46
46
  # the x-axis.
47
47
  #
48
+ # This graphic object is registered under the :arc key for use with the
49
+ # HexaPDF::Content::Canvas class.
50
+ #
51
+ # Examples:
52
+ #
53
+ # #>pdf-center
54
+ # arc = canvas.graphic_object(:arc, a: 100, b: 50).stroke
55
+ # arc.draw(canvas).stroke # or: canvas.draw(arc).stroke
56
+ #
48
57
  # See: ELL - https://spaceroots.org/documents/ellipse/elliptical-arc.pdf
49
58
  class Arc
50
59
 
@@ -62,36 +71,111 @@ module HexaPDF
62
71
  # The higher the value the better the approximation will be but it will also take longer
63
72
  # to compute. The value should not be lower than 4. Default value is 6 which already
64
73
  # provides a good approximation.
74
+ #
75
+ # Examples:
76
+ #
77
+ # #>pdf-center
78
+ # arc = canvas.graphic_object(:arc, cx: -50, a: 40, b: 40)
79
+ # arc.max_curves = 2
80
+ # canvas.draw(arc)
81
+ # arc.max_curves = 10
82
+ # canvas.draw(arc, cx: 50)
83
+ # canvas.stroke
65
84
  attr_accessor :max_curves
66
85
 
67
86
  # x-coordinate of center point
87
+ #
88
+ # Examples:
89
+ #
90
+ # #>pdf-center
91
+ # arc = canvas.graphic_object(:arc, a: 30, b: 20)
92
+ # canvas.draw(arc).stroke
93
+ # canvas.stroke_color("red").draw(arc, cx: -50).stroke
68
94
  attr_reader :cx
69
95
 
70
96
  # y-coordinate of center point
97
+ #
98
+ # Examples:
99
+ #
100
+ # #>pdf-center
101
+ # arc = canvas.graphic_object(:arc, a: 30, b: 20)
102
+ # canvas.draw(arc).stroke
103
+ # canvas.stroke_color("red").draw(arc, cy: 50).stroke
71
104
  attr_reader :cy
72
105
 
73
- # Length of semi-major axis
106
+ # Length of semi-major axis which (without altering the #inclination) is parallel to the
107
+ # x-axis
108
+ #
109
+ # Examples:
110
+ #
111
+ # #>pdf-center
112
+ # arc = canvas.graphic_object(:arc, a: 30, b: 30)
113
+ # canvas.draw(arc).stroke
114
+ # canvas.stroke_color("red").draw(arc, a: 60).stroke
74
115
  attr_reader :a
75
116
 
76
- # Length of semi-minor axis
117
+ # Length of semi-minor axis which (without altering the #inclination) is parallel to the
118
+ # y-axis
119
+ #
120
+ # Examples:
121
+ #
122
+ # #>pdf-center
123
+ # arc = canvas.graphic_object(:arc, a: 30, b: 30)
124
+ # canvas.draw(arc).stroke
125
+ # canvas.stroke_color("red").draw(arc, b: 60).stroke
77
126
  attr_reader :b
78
127
 
79
- # Start angle in degrees
128
+ # Start angle of the arc in degrees
129
+ #
130
+ # Examples:
131
+ #
132
+ # #>pdf-center
133
+ # arc = canvas.graphic_object(:arc, a: 30, b: 30)
134
+ # canvas.draw(arc, start_angle: 45).stroke
80
135
  attr_reader :start_angle
81
136
 
82
- # End angle in degrees
137
+ # End angle of the arc in degrees
138
+ #
139
+ # Examples:
140
+ #
141
+ # #>pdf-center
142
+ # arc = canvas.graphic_object(:arc, a: 30, b: 30)
143
+ # canvas.draw(arc, end_angle: 160).stroke
83
144
  attr_reader :end_angle
84
145
 
85
- # Inclination in degrees of semi-major axis in respect to x-axis
146
+ # Inclination in degrees of the semi-major axis with respect to the x-axis
147
+ #
148
+ # Examples:
149
+ #
150
+ # #>pdf-center
151
+ # arc = canvas.graphic_object(:arc, a: 60, b: 30)
152
+ # canvas.draw(arc, inclination: 45).stroke
86
153
  attr_reader :inclination
87
154
 
88
155
  # Direction of arc - if +true+ in clockwise direction, else in counterclockwise direction
156
+ #
157
+ # This is needed when filling paths using the nonzero winding number rule to achieve
158
+ # different effects.
159
+ #
160
+ # Examples:
161
+ #
162
+ # #>pdf-center
163
+ # arc = canvas.graphic_object(:arc, a: 40, b: 40)
164
+ # canvas.draw(arc, cx: -50).draw(arc, cx: 50).
165
+ # draw(arc, cx: -50, b: 80).
166
+ # draw(arc, cx: 50, b: 80, clockwise: true).
167
+ # fill(:nonzero)
89
168
  attr_reader :clockwise
90
169
 
91
170
  # Creates an elliptical arc with default values (a counterclockwise unit circle at the
92
171
  # origin).
172
+ #
173
+ # Examples:
174
+ #
175
+ # #>pdf-center
176
+ # canvas.draw(:arc).stroke
93
177
  def initialize
94
- @max_curves = 6
178
+ @max_curves = nil
95
179
  @cx = @cy = 0
96
180
  @a = @b = 1
97
181
  @start_angle = 0
@@ -135,11 +219,25 @@ module HexaPDF
135
219
  end
136
220
 
137
221
  # Returns the start point of the elliptical arc.
222
+ #
223
+ # Examples:
224
+ #
225
+ # #>pdf-center
226
+ # arc = canvas.graphic_object(:arc, a: 40, b: 30, start_angle: 60)
227
+ # canvas.draw(arc).stroke
228
+ # canvas.fill_color("red").circle(*arc.start_point, 2).fill
138
229
  def start_point
139
230
  evaluate(@start_eta)
140
231
  end
141
232
 
142
233
  # Returns the end point of the elliptical arc.
234
+ #
235
+ # Examples:
236
+ #
237
+ # #>pdf-center
238
+ # arc = canvas.graphic_object(:arc, a: 40, b: 30, end_angle: 245)
239
+ # canvas.draw(arc).stroke
240
+ # canvas.fill_color("red").circle(*arc.end_point, 2).fill
143
241
  def end_point
144
242
  evaluate(@end_eta)
145
243
  end
@@ -157,10 +255,10 @@ module HexaPDF
157
255
  # move the current point to the start point of the arc. Otherwise it is assumed that the
158
256
  # current point already coincides with the start point
159
257
  #
160
- # The #max_curves value is set to the value of the configuration option
161
- # 'graphic_object.arc.max_curves' before drawing.
258
+ # The #max_curves value, if not already changed, is set to the value of the configuration
259
+ # option 'graphic_object.arc.max_curves' before drawing.
162
260
  def draw(canvas, move_to_start: true)
163
- @max_curves = canvas.context.document.config['graphic_object.arc.max_curves']
261
+ @max_curves ||= canvas.context.document.config['graphic_object.arc.max_curves']
164
262
  canvas.move_to(*start_point) if move_to_start
165
263
  curves.each {|x, y, hash| canvas.curve_to(x, y, **hash) }
166
264
  end
@@ -183,7 +281,8 @@ module HexaPDF
183
281
  result = []
184
282
 
185
283
  # Number of curves to use, maximal segment angle is 2*PI/max_curves
186
- n = [@max_curves, ((@end_eta - @start_eta).abs / (2 * Math::PI / @max_curves)).ceil].min
284
+ max_curves = @max_curves || 6
285
+ n = [max_curves, ((@end_eta - @start_eta).abs / (2 * Math::PI / max_curves)).ceil].min
187
286
  d_eta = (@end_eta - @start_eta) / n
188
287
 
189
288
  alpha = Math.sin(d_eta) * (Math.sqrt(4 + 3 * Math.tan(d_eta / 2)**2) - 1) / 3
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -43,6 +43,15 @@ module HexaPDF
43
43
  # This class describes an elliptical arc in endpoint parameterization. It allows one to
44
44
  # generate an arc from the current point to a given point, similar to Content::Canvas#line_to.
45
45
  #
46
+ # This graphic object is registered under the :endpoint_arc key for use with the
47
+ # HexaPDF::Content::Canvas class.
48
+ #
49
+ # Examples:
50
+ #
51
+ # #>pdf-center
52
+ # arc = canvas.graphic_object(:endpoint_arc, x: 50, y: 20, a: 30, b: 10).stroke
53
+ # arc.move_to(0, 0).draw(canvas).stroke # or: canvas.draw(arc).stroke
54
+ #
46
55
  # See: GraphicObject::Arc, ARC - https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes
47
56
  class EndpointArc
48
57
 
@@ -58,29 +67,86 @@ module HexaPDF
58
67
  end
59
68
 
60
69
  # x-coordinate of endpoint
70
+ #
71
+ # Examples:
72
+ #
73
+ # #>pdf-center
74
+ # arc = canvas.graphic_object(:endpoint_arc, x: 50, y: 20, a: 30, b: 20)
75
+ # canvas.move_to(0, 0).draw(arc).stroke
76
+ # canvas.stroke_color("red").move_to(0, 0).draw(arc, x: -50).stroke
61
77
  attr_reader :x
62
78
 
63
79
  # y-coordinate of endpoint
80
+ #
81
+ # Examples:
82
+ #
83
+ # #>pdf-center
84
+ # arc = canvas.graphic_object(:endpoint_arc, x: 50, y: 20, a: 30, b: 20)
85
+ # canvas.move_to(0, 0).draw(arc).stroke
86
+ # canvas.stroke_color("red").move_to(0, 0).draw(arc, y: -20).stroke
64
87
  attr_reader :y
65
88
 
66
89
  # Length of semi-major axis
90
+ #
91
+ # Examples:
92
+ #
93
+ # #>pdf-center
94
+ # arc = canvas.graphic_object(:endpoint_arc, x: 50, y: 20, a: 30, b: 20)
95
+ # canvas.move_to(0, 0).draw(arc).stroke
96
+ # canvas.stroke_color("red").move_to(0, 0).draw(arc, a: 40).stroke
67
97
  attr_reader :a
68
98
 
69
99
  # Length of semi-minor axis
100
+ #
101
+ # Examples:
102
+ #
103
+ # #>pdf-center
104
+ # arc = canvas.graphic_object(:endpoint_arc, x: 50, y: 20, a: 30, b: 20)
105
+ # canvas.move_to(0, 0).draw(arc).stroke
106
+ # canvas.stroke_color("red").move_to(0, 0).draw(arc, b: 50).stroke
70
107
  attr_reader :b
71
108
 
72
109
  # Inclination in degrees of semi-major axis in respect to x-axis
110
+ #
111
+ # Examples:
112
+ #
113
+ # #>pdf-center
114
+ # arc = canvas.graphic_object(:endpoint_arc, x: 50, y: 20, a: 30, b: 20)
115
+ # canvas.move_to(0, 0).draw(arc).stroke
116
+ # canvas.stroke_color("red").move_to(0, 0).draw(arc, inclination: 45).stroke
73
117
  attr_reader :inclination
74
118
 
75
119
  # Large arc choice - if +true+ use the large arc (i.e. the one spanning more than 180
76
120
  # degrees), else the small arc
121
+ #
122
+ # Examples:
123
+ #
124
+ # #>pdf-center
125
+ # arc = canvas.graphic_object(:endpoint_arc, x: 50, y: 20, a: 30, b: 20)
126
+ # canvas.move_to(0, 0).draw(arc).stroke
127
+ # canvas.stroke_color("red").move_to(0, 0).draw(arc, large_arc: false, clockwise: true).stroke
77
128
  attr_reader :large_arc
78
129
 
79
130
  # Direction of arc - if +true+ in clockwise direction, else in counterclockwise direction
131
+ #
132
+ # This is needed, for example, when filling paths using the nonzero winding number rule to achieve
133
+ # different effects.
134
+ #
135
+ # Examples:
136
+ #
137
+ # #>pdf-center
138
+ # arc = canvas.graphic_object(:endpoint_arc, x: 50, y: 20, a: 30, b: 20)
139
+ # canvas.move_to(0, 0).draw(arc).stroke
140
+ # canvas.stroke_color("red").move_to(0, 0).draw(arc, clockwise: true).stroke
80
141
  attr_reader :clockwise
81
142
 
82
143
  # Creates an endpoint arc with default values x=0, y=0, a=0, b=0, inclination=0,
83
144
  # large_arc=true, clockwise=false (a line to the origin).
145
+ #
146
+ # Examples:
147
+ #
148
+ # #>pdf-center
149
+ # canvas.move_to(30, 30).draw(:endpoint_arc).stroke
84
150
  def initialize
85
151
  @x = @y = 0
86
152
  @a = @b = 0
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -57,9 +57,22 @@ module HexaPDF
57
57
  attr_accessor :object
58
58
 
59
59
  # The radius to use when drawing Geom2D::Point objects; defaults to 1
60
+ #
61
+ # Examples:
62
+ #
63
+ # #>pdf-center
64
+ # canvas.draw(:geom2d, object: ::Geom2D::Point(0, 0))
65
+ # canvas.draw(:geom2d, object: ::Geom2D::Point(50, 0), point_radius: 5)
60
66
  attr_accessor :point_radius
61
67
 
62
68
  # Specifies whether only paths should be drawn or if they should be stroked/filled too
69
+ # (default).
70
+ #
71
+ # Examples:
72
+ #
73
+ # #>pdf-center
74
+ # canvas.draw(:geom2d, object: ::Geom2D::Segment([0, 0], [0, 50]))
75
+ # canvas.draw(:geom2d, object: ::Geom2D::Segment([0, 0], [50, 0]), path_only: true)
63
76
  attr_accessor :path_only
64
77
 
65
78
  # Creates a Geom2D drawing support object.
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2020 Thomas Leitner
7
+ # Copyright (C) 2014-2021 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as