prawn 2.3.0 → 2.5.0

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 (203) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/prawn/document/bounding_box.rb +223 -143
  4. data/lib/prawn/document/column_box.rb +61 -26
  5. data/lib/prawn/document/internals.rb +25 -16
  6. data/lib/prawn/document/span.rb +21 -18
  7. data/lib/prawn/document.rb +273 -182
  8. data/lib/prawn/encoding.rb +2 -5
  9. data/lib/prawn/errors.rb +23 -34
  10. data/lib/prawn/font.rb +254 -139
  11. data/lib/prawn/font_metric_cache.rb +18 -16
  12. data/lib/prawn/fonts/afm.rb +99 -57
  13. data/lib/prawn/fonts/dfont.rb +7 -1
  14. data/lib/prawn/fonts/otf.rb +4 -1
  15. data/lib/prawn/fonts/to_unicode_cmap.rb +151 -0
  16. data/lib/prawn/fonts/ttc.rb +7 -2
  17. data/lib/prawn/fonts/ttf.rb +345 -107
  18. data/lib/prawn/fonts.rb +14 -0
  19. data/lib/prawn/graphics/blend_mode.rb +25 -28
  20. data/lib/prawn/graphics/cap_style.rb +9 -12
  21. data/lib/prawn/graphics/color.rb +75 -50
  22. data/lib/prawn/graphics/dash.rb +45 -42
  23. data/lib/prawn/graphics/join_style.rb +18 -12
  24. data/lib/prawn/graphics/patterns.rb +239 -110
  25. data/lib/prawn/graphics/transformation.rb +51 -44
  26. data/lib/prawn/graphics/transparency.rb +16 -40
  27. data/lib/prawn/graphics.rb +370 -260
  28. data/lib/prawn/grid.rb +219 -57
  29. data/lib/prawn/image_handler.rb +27 -10
  30. data/lib/prawn/images/image.rb +8 -10
  31. data/lib/prawn/images/jpg.rb +46 -20
  32. data/lib/prawn/images/png.rb +94 -42
  33. data/lib/prawn/images.rb +70 -81
  34. data/lib/prawn/measurement_extensions.rb +39 -8
  35. data/lib/prawn/measurements.rb +60 -5
  36. data/lib/prawn/outline.rb +120 -113
  37. data/lib/prawn/repeater.rb +52 -36
  38. data/lib/prawn/security/arcfour.rb +4 -4
  39. data/lib/prawn/security.rb +106 -98
  40. data/lib/prawn/soft_mask.rb +42 -30
  41. data/lib/prawn/stamp.rb +38 -42
  42. data/lib/prawn/text/box.rb +156 -105
  43. data/lib/prawn/text/formatted/arranger.rb +121 -41
  44. data/lib/prawn/text/formatted/box.rb +239 -163
  45. data/lib/prawn/text/formatted/fragment.rb +130 -14
  46. data/lib/prawn/text/formatted/line_wrap.rb +49 -38
  47. data/lib/prawn/text/formatted/parser.rb +116 -74
  48. data/lib/prawn/text/formatted/wrap.rb +25 -26
  49. data/lib/prawn/text/formatted.rb +75 -0
  50. data/lib/prawn/text.rb +456 -211
  51. data/lib/prawn/transformation_stack.rb +29 -10
  52. data/lib/prawn/utilities.rb +13 -13
  53. data/lib/prawn/version.rb +2 -1
  54. data/lib/prawn/view.rb +69 -54
  55. data/lib/prawn.rb +24 -18
  56. data.tar.gz.sig +0 -0
  57. metadata +55 -262
  58. metadata.gz.sig +3 -4
  59. data/.yardopts +0 -10
  60. data/Gemfile +0 -5
  61. data/Rakefile +0 -54
  62. data/manual/absolute_position.pdf +0 -0
  63. data/manual/basic_concepts/adding_pages.rb +0 -26
  64. data/manual/basic_concepts/basic_concepts.rb +0 -43
  65. data/manual/basic_concepts/creation.rb +0 -38
  66. data/manual/basic_concepts/cursor.rb +0 -32
  67. data/manual/basic_concepts/measurement.rb +0 -24
  68. data/manual/basic_concepts/origin.rb +0 -37
  69. data/manual/basic_concepts/other_cursor_helpers.rb +0 -39
  70. data/manual/basic_concepts/view.rb +0 -48
  71. data/manual/bounding_box/bounding_box.rb +0 -41
  72. data/manual/bounding_box/bounds.rb +0 -48
  73. data/manual/bounding_box/canvas.rb +0 -23
  74. data/manual/bounding_box/creation.rb +0 -22
  75. data/manual/bounding_box/indentation.rb +0 -45
  76. data/manual/bounding_box/nesting.rb +0 -52
  77. data/manual/bounding_box/russian_boxes.rb +0 -40
  78. data/manual/bounding_box/stretchy.rb +0 -29
  79. data/manual/contents.rb +0 -35
  80. data/manual/cover.rb +0 -43
  81. data/manual/document_and_page_options/background.rb +0 -25
  82. data/manual/document_and_page_options/document_and_page_options.rb +0 -34
  83. data/manual/document_and_page_options/metadata.rb +0 -25
  84. data/manual/document_and_page_options/page_margins.rb +0 -36
  85. data/manual/document_and_page_options/page_size.rb +0 -34
  86. data/manual/document_and_page_options/print_scaling.rb +0 -22
  87. data/manual/example_helper.rb +0 -8
  88. data/manual/graphics/blend_mode.rb +0 -52
  89. data/manual/graphics/circle_and_ellipse.rb +0 -21
  90. data/manual/graphics/color.rb +0 -22
  91. data/manual/graphics/common_lines.rb +0 -29
  92. data/manual/graphics/fill_and_stroke.rb +0 -41
  93. data/manual/graphics/fill_rules.rb +0 -37
  94. data/manual/graphics/gradients.rb +0 -43
  95. data/manual/graphics/graphics.rb +0 -64
  96. data/manual/graphics/helper.rb +0 -27
  97. data/manual/graphics/line_width.rb +0 -36
  98. data/manual/graphics/lines_and_curves.rb +0 -40
  99. data/manual/graphics/polygon.rb +0 -27
  100. data/manual/graphics/rectangle.rb +0 -20
  101. data/manual/graphics/rotate.rb +0 -25
  102. data/manual/graphics/scale.rb +0 -42
  103. data/manual/graphics/soft_masks.rb +0 -44
  104. data/manual/graphics/stroke_cap.rb +0 -30
  105. data/manual/graphics/stroke_dash.rb +0 -47
  106. data/manual/graphics/stroke_join.rb +0 -29
  107. data/manual/graphics/translate.rb +0 -28
  108. data/manual/graphics/transparency.rb +0 -33
  109. data/manual/how_to_read_this_manual.rb +0 -39
  110. data/manual/images/absolute_position.rb +0 -22
  111. data/manual/images/fit.rb +0 -20
  112. data/manual/images/horizontal.rb +0 -24
  113. data/manual/images/images.rb +0 -41
  114. data/manual/images/plain_image.rb +0 -17
  115. data/manual/images/scale.rb +0 -21
  116. data/manual/images/vertical.rb +0 -27
  117. data/manual/images/width_and_height.rb +0 -24
  118. data/manual/layout/boxes.rb +0 -26
  119. data/manual/layout/content.rb +0 -24
  120. data/manual/layout/layout.rb +0 -27
  121. data/manual/layout/simple_grid.rb +0 -22
  122. data/manual/outline/add_subsection_to.rb +0 -60
  123. data/manual/outline/insert_section_after.rb +0 -46
  124. data/manual/outline/outline.rb +0 -33
  125. data/manual/outline/sections_and_pages.rb +0 -66
  126. data/manual/repeatable_content/alternate_page_numbering.rb +0 -36
  127. data/manual/repeatable_content/page_numbering.rb +0 -55
  128. data/manual/repeatable_content/repeatable_content.rb +0 -35
  129. data/manual/repeatable_content/repeater.rb +0 -54
  130. data/manual/repeatable_content/stamp.rb +0 -40
  131. data/manual/security/encryption.rb +0 -28
  132. data/manual/security/permissions.rb +0 -41
  133. data/manual/security/security.rb +0 -28
  134. data/manual/table.rb +0 -16
  135. data/manual/text/alignment.rb +0 -43
  136. data/manual/text/color.rb +0 -24
  137. data/manual/text/column_box.rb +0 -30
  138. data/manual/text/fallback_fonts.rb +0 -41
  139. data/manual/text/font.rb +0 -40
  140. data/manual/text/font_size.rb +0 -44
  141. data/manual/text/font_style.rb +0 -22
  142. data/manual/text/formatted_callbacks.rb +0 -65
  143. data/manual/text/formatted_text.rb +0 -58
  144. data/manual/text/free_flowing_text.rb +0 -50
  145. data/manual/text/inline.rb +0 -40
  146. data/manual/text/kerning_and_character_spacing.rb +0 -38
  147. data/manual/text/leading.rb +0 -24
  148. data/manual/text/line_wrapping.rb +0 -60
  149. data/manual/text/paragraph_indentation.rb +0 -32
  150. data/manual/text/positioned_text.rb +0 -37
  151. data/manual/text/registering_families.rb +0 -51
  152. data/manual/text/rendering_and_color.rb +0 -36
  153. data/manual/text/right_to_left_text.rb +0 -54
  154. data/manual/text/rotation.rb +0 -47
  155. data/manual/text/single_usage.rb +0 -36
  156. data/manual/text/text.rb +0 -75
  157. data/manual/text/text_box_excess.rb +0 -35
  158. data/manual/text/text_box_extensions.rb +0 -48
  159. data/manual/text/text_box_overflow.rb +0 -49
  160. data/manual/text/utf8.rb +0 -27
  161. data/manual/text/win_ansi_charset.rb +0 -62
  162. data/prawn.gemspec +0 -57
  163. data/spec/data/curves.pdf +0 -66
  164. data/spec/extensions/encoding_helpers.rb +0 -11
  165. data/spec/prawn/document/bounding_box_spec.rb +0 -546
  166. data/spec/prawn/document/column_box_spec.rb +0 -75
  167. data/spec/prawn/document/security_spec.rb +0 -176
  168. data/spec/prawn/document_annotations_spec.rb +0 -76
  169. data/spec/prawn/document_destinations_spec.rb +0 -15
  170. data/spec/prawn/document_grid_spec.rb +0 -99
  171. data/spec/prawn/document_reference_spec.rb +0 -27
  172. data/spec/prawn/document_span_spec.rb +0 -36
  173. data/spec/prawn/document_spec.rb +0 -802
  174. data/spec/prawn/font_metric_cache_spec.rb +0 -54
  175. data/spec/prawn/font_spec.rb +0 -542
  176. data/spec/prawn/graphics/blend_mode_spec.rb +0 -63
  177. data/spec/prawn/graphics/transparency_spec.rb +0 -81
  178. data/spec/prawn/graphics_spec.rb +0 -837
  179. data/spec/prawn/graphics_stroke_styles_spec.rb +0 -229
  180. data/spec/prawn/image_handler_spec.rb +0 -53
  181. data/spec/prawn/images/jpg_spec.rb +0 -20
  182. data/spec/prawn/images/png_spec.rb +0 -283
  183. data/spec/prawn/images_spec.rb +0 -224
  184. data/spec/prawn/measurements_extensions_spec.rb +0 -24
  185. data/spec/prawn/outline_spec.rb +0 -412
  186. data/spec/prawn/repeater_spec.rb +0 -165
  187. data/spec/prawn/soft_mask_spec.rb +0 -74
  188. data/spec/prawn/stamp_spec.rb +0 -172
  189. data/spec/prawn/text/box_spec.rb +0 -1112
  190. data/spec/prawn/text/formatted/arranger_spec.rb +0 -466
  191. data/spec/prawn/text/formatted/box_spec.rb +0 -846
  192. data/spec/prawn/text/formatted/fragment_spec.rb +0 -343
  193. data/spec/prawn/text/formatted/line_wrap_spec.rb +0 -494
  194. data/spec/prawn/text/formatted/parser_spec.rb +0 -697
  195. data/spec/prawn/text_draw_text_spec.rb +0 -149
  196. data/spec/prawn/text_rendering_mode_spec.rb +0 -48
  197. data/spec/prawn/text_spacing_spec.rb +0 -95
  198. data/spec/prawn/text_spec.rb +0 -603
  199. data/spec/prawn/text_with_inline_formatting_spec.rb +0 -35
  200. data/spec/prawn/transformation_stack_spec.rb +0 -66
  201. data/spec/prawn/view_spec.rb +0 -63
  202. data/spec/prawn_manual_spec.rb +0 -35
  203. data/spec/spec_helper.rb +0 -48
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # (Optional; PDF 1.6) The page scaling option to be selected when a print dialog
4
- # is displayed for this document. Valid values are <code>None</code>, which
5
- # indicates that the print dialog should reflect no page scaling, and
6
- # <code>AppDefault</code>, which indicates that applications should use the
7
- # current print scaling. If this entry has an unrecognized value, applications
8
- # should use the current print scaling. Default value: <code>AppDefault</code>.
9
- #
10
- # Note: If the print dialog is suppressed and its parameters are provided
11
- # directly by the application, the value of this entry should still be used.
12
-
13
- require_relative '../example_helper'
14
-
15
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
16
- Prawn::Document.generate(
17
- filename,
18
- page_layout: :landscape, print_scaling: :none
19
- ) do
20
- text 'When you print this document, the scale to fit in print preview '\
21
- 'should be disabled by default.'
22
- end
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- $LOAD_PATH.unshift File.join(__dir__, '../lib')
4
- require 'prawn'
5
- require 'prawn/manual_builder'
6
-
7
- Prawn::ManualBuilder.manual_dir = File.dirname(__FILE__)
8
- Prawn::Fonts::AFM.hide_m17n_warning = true
@@ -1,52 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Blend modes can be used to change the way two layers (images, graphics,
4
- # text, etc.) are blended together. The <code>blend_mode</code> method
5
- # accepts a single blend mode or an array of blend modes. PDF viewers should
6
- # blend the layers based on the first recognized blend mode.
7
- #
8
- # Valid blend modes in v1.4 of the PDF spec include :Normal, :Multiply, :Screen,
9
- # :Overlay, :Darken, :Lighten, :ColorDodge, :ColorBurn, :HardLight, :SoftLight,
10
- # :Difference, :Exclusion, :Hue, :Saturation, :Color, and :Luminosity.
11
-
12
- require_relative '../example_helper'
13
-
14
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
15
- Prawn::ManualBuilder::Example.generate(filename) do
16
- start_new_page
17
-
18
- # https://commons.wikimedia.org/wiki/File:Blend_modes_2.-bottom-layer.jpg#/media/File:Blend_modes_2.-bottom-layer.jpg
19
- bottom_layer = "#{Prawn::DATADIR}/images/blend_modes_bottom_layer.jpg"
20
-
21
- # https://commons.wikimedia.org/wiki/File:Blend_modes_1.-top-layer.jpg#/media/File:Blend_modes_1.-top-layer.jpg
22
- top_layer = "#{Prawn::DATADIR}/images/blend_modes_top_layer.jpg"
23
-
24
- blend_modes = %i[
25
- Normal Multiply Screen Overlay Darken Lighten ColorDodge
26
- ColorBurn HardLight SoftLight Difference Exclusion Hue
27
- Saturation Color Luminosity
28
- ]
29
- blend_modes.each_with_index do |blend_mode, index|
30
- x = index % 4 * 135
31
- y = cursor - (index / 4 * 200)
32
-
33
- image bottom_layer, at: [x, y], fit: [125, 125]
34
- blend_mode(blend_mode) do
35
- image top_layer, at: [x, y], fit: [125, 125]
36
- end
37
-
38
- y -= 130
39
-
40
- fill_color '009ddc'
41
- fill_rectangle [x, y], 75, 25
42
- blend_mode(blend_mode) do
43
- fill_color 'fdb827'
44
- fill_rectangle [x + 50, y], 75, 25
45
- end
46
-
47
- y -= 30
48
-
49
- fill_color '000000'
50
- text_box blend_mode.to_s, at: [x, y]
51
- end
52
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # To define a <code>circle</code> all you need is the center point and the
4
- # radius.
5
- #
6
- # To define an <code>ellipse</code> you provide the center point and two radii
7
- # (or axes) values. If the second radius value is ommitted, both radii will be
8
- # equal and you will end up drawing a circle.
9
-
10
- require_relative '../example_helper'
11
-
12
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
13
- Prawn::ManualBuilder::Example.generate(filename) do
14
- stroke_axis
15
-
16
- stroke_circle [100, 300], 100
17
-
18
- fill_ellipse [200, 100], 100, 50
19
-
20
- fill_ellipse [400, 100], 50
21
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # We can change the stroke and fill colors providing an HTML rgb 6 digit color
4
- # code string ("AB1234") or 4 values for CMYK.
5
-
6
- require_relative '../example_helper'
7
-
8
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
9
- Prawn::ManualBuilder::Example.generate(filename) do
10
- stroke_axis
11
-
12
- # Fill with Yellow using RGB (Unlike css, there is no leading #)
13
- fill_color 'FFFFCC'
14
- fill_polygon [50, 150], [150, 200], [250, 150], [250, 50], [150, 0], [50, 50]
15
-
16
- # Stroke with Purple using CMYK
17
- stroke_color 50, 100, 0, 0
18
- stroke_rectangle [300, 300], 200, 100
19
-
20
- # Both together
21
- fill_and_stroke_circle [400, 100], 50
22
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Prawn provides helpers for drawing some commonly used lines:
4
- #
5
- # <code>vertical_line</code> and <code>horizontal_line</code> do just what their
6
- # names imply. Specify the start and end point at a fixed coordinate to define
7
- # the line.
8
- #
9
- # <code>horizontal_rule</code> draws a horizontal line on the current bounding
10
- # box from border to border, using the current y position.
11
-
12
- require_relative '../example_helper'
13
-
14
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
15
- Prawn::ManualBuilder::Example.generate(filename) do
16
- stroke_axis
17
-
18
- stroke_color 'ff0000'
19
-
20
- stroke do
21
- # just lower the current y position
22
- move_down 50
23
- horizontal_rule
24
-
25
- vertical_line 100, 300, at: 50
26
-
27
- horizontal_line 200, 500, at: 150
28
- end
29
- end
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # There are two drawing primitives in Prawn: <code>fill</code> and
4
- # <code>stroke</code>.
5
- #
6
- # These are the methods that actually draw stuff on the document. All the other
7
- # drawing shapes like <code>rectangle</code>, <code>circle</code> or
8
- # <code>line_to</code> define drawing paths. These paths need to be either
9
- # stroked or filled to gain form on the document.
10
- #
11
- # Calling these methods without a block will act on the drawing path that
12
- # has been defined prior to the call.
13
- #
14
- # Calling with a block will act on the drawing path set within the
15
- # block.
16
- #
17
- # Most of the methods which define drawing paths have methods of the same name
18
- # starting with stroke_ and fill_ which create the drawing path and then stroke
19
- # or fill it.
20
-
21
- require_relative '../example_helper'
22
-
23
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
24
- Prawn::ManualBuilder::Example.generate(filename) do
25
- stroke_axis
26
-
27
- # No block
28
- line [0, 200], [100, 150]
29
- stroke
30
-
31
- rectangle [0, 100], 100, 100
32
- fill
33
-
34
- # With block
35
- stroke { line [200, 200], [300, 150] }
36
- fill { rectangle [200, 100], 100, 100 }
37
-
38
- # Method hook
39
- stroke_line [400, 200], [500, 150]
40
- fill_rectangle [400, 100], 100, 100
41
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Prawn's fill operators (<code>fill</code> and <code>fill_and_stroke</code>
4
- # both accept a <code>:fill_rule</code> option. These rules determine which
5
- # parts of the page are counted as "inside" vs. "outside" the path. There are
6
- # two fill rules:
7
- #
8
- # * <code>:nonzero_winding_number</code> (default): a point is inside the path
9
- # if a ray from that point to infinity crosses a nonzero "net number" of path
10
- # segments, where path segments intersecting in one direction are counted as
11
- # positive and those in the other direction negative.
12
- #
13
- # * <code>:even_odd</code>: A point is inside the path if a ray from that point
14
- # to infinity crosses an odd number of path segments, regardless of direction.
15
- #
16
- # The differences between the fill rules only come into play with complex
17
- # paths; they are identical for simple shapes.
18
-
19
- require_relative '../example_helper'
20
-
21
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
22
- Prawn::ManualBuilder::Example.generate(filename) do
23
- pentagram = [[181, 95], [0, 36], [111, 190], [111, 0], [0, 154]]
24
-
25
- stroke_color 'ff0000'
26
- line_width 2
27
-
28
- text_box 'Nonzero Winding Number', at: [50, 215],
29
- width: 170,
30
- align: :center
31
- polygon(*pentagram.map { |x, y| [x + 50, y] })
32
- fill_and_stroke
33
-
34
- text_box 'Even-Odd', at: [330, 215], width: 170, align: :center
35
- polygon(*pentagram.map { |x, y| [x + 330, y] })
36
- fill_and_stroke(fill_rule: :even_odd)
37
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Note that because of the way PDF renders radial gradients in order to get
4
- # solid fill your start circle must be fully inside your end circle.
5
- # Otherwise you will get triangle fill like illustrated in the example below.
6
-
7
- require_relative '../example_helper'
8
-
9
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
10
- Prawn::ManualBuilder::Example.generate(filename) do
11
- self.line_width = 10
12
-
13
- # Linear Gradients
14
- fill_gradient [0, 250], [100, 150], 'ff0000', '0000ff'
15
- fill_rectangle [0, 250], 100, 100
16
-
17
- stroke_gradient [150, 150], [250, 250], '00ffff', 'ffff00'
18
- stroke_rectangle [150, 250], 100, 100
19
-
20
- fill_gradient [300, 250], [400, 150], 'ff0000', '0000ff'
21
- stroke_gradient [300, 150], [400, 250], '00ffff', 'ffff00'
22
- fill_and_stroke_rectangle [300, 250], 100, 100
23
-
24
- rotate 45, origin: [500, 200] do
25
- stops = { 0 => 'ff0000', 0.6 => '999900', 0.8 => '00cc00', 1 => '4444ff' }
26
- fill_gradient from: [460, 240], to: [540, 160], stops: stops
27
- fill_rectangle [460, 240], 80, 80
28
- end
29
-
30
- # Radial gradients
31
- fill_gradient [50, 50], 0, [50, 50], 70.71, 'ff0000', '0000ff'
32
- fill_rectangle [0, 100], 100, 100
33
-
34
- stroke_gradient [200, 50], 45, [200, 50], 70.71, '00ffff', 'ffff00'
35
- stroke_rectangle [150, 100], 100, 100
36
-
37
- stroke_gradient [350, 50], 45, [350, 50], 70.71, '00ffff', 'ffff00'
38
- fill_gradient [350, 50], 0, [350, 50], 70.71, 'ff0000', '0000ff'
39
- fill_and_stroke_rectangle [300, 100], 100, 100
40
-
41
- fill_gradient [500, 100], 50, [500, 0], 0, 'ff0000', '0000ff'
42
- fill_rectangle [450, 100], 100, 100
43
- end
@@ -1,64 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Examples for the Graphics package.
4
-
5
- require_relative '../example_helper'
6
-
7
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
8
- Prawn::ManualBuilder::Example.generate(filename, page_size: 'FOLIO') do
9
- package 'graphics' do |p|
10
- p.section 'Basics' do |s|
11
- s.example 'helper'
12
- s.example 'fill_and_stroke'
13
- end
14
-
15
- p.section 'Shapes' do |s|
16
- s.example 'lines_and_curves'
17
- s.example 'common_lines'
18
- s.example 'rectangle'
19
- s.example 'polygon'
20
- s.example 'circle_and_ellipse'
21
- end
22
-
23
- p.section 'Fill and Stroke settings' do |s|
24
- s.example 'line_width'
25
- s.example 'stroke_cap'
26
- s.example 'stroke_join'
27
- s.example 'stroke_dash'
28
- s.example 'color'
29
- s.example 'gradients'
30
- s.example 'transparency'
31
- s.example 'soft_masks'
32
- s.example 'blend_mode'
33
- s.example 'fill_rules'
34
- end
35
-
36
- p.section 'Transformations' do |s|
37
- s.example 'rotate'
38
- s.example 'translate'
39
- s.example 'scale'
40
- end
41
-
42
- p.intro do
43
- prose <<-TEXT
44
- Here we show all the drawing methods provided by Prawn. Use them to draw
45
- the most beautiful imaginable things.
46
-
47
- Most of the content that you'll add to your pdf document will use the
48
- graphics package. Even text is rendered on a page just like a rectangle
49
- so even if you never use any of the shapes described here you should at
50
- least read the basic examples.
51
-
52
- The examples show:
53
- TEXT
54
-
55
- list(
56
- 'All the possible ways that you can fill or stroke shapes on a page',
57
- 'How to draw all the shapes that Prawn has to offer from a measly '\
58
- 'line to a mighty polygon or ellipse',
59
- 'The configuration options for stroking lines and filling shapes',
60
- 'How to apply transformations to your drawing space'
61
- )
62
- end
63
- end
64
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # To produce this manual we use the <code>stroke_axis</code> helper method
4
- # within the examples.
5
- #
6
- # <code>stroke_axis</code> prints the x and y axis for the current bounding box
7
- # with markers in 100 increments. The defaults can be changed with various
8
- # options.
9
- #
10
- # Note that the examples define a custom <code>:height</code> option so that
11
- # only the example canvas is used (as seen with the output of the first line of
12
- # the example code).
13
-
14
- require_relative '../example_helper'
15
-
16
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
17
- Prawn::ManualBuilder::Example.generate(filename) do
18
- stroke_axis
19
- stroke_axis(
20
- at: [70, 70], height: 200, step_length: 50,
21
- negative_axes_length: 5, color: '0000FF'
22
- )
23
- stroke_axis(
24
- at: [140, 140], width: 200, height: cursor.to_i - 140,
25
- step_length: 20, negative_axes_length: 40, color: 'FF0000'
26
- )
27
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # The <code>line_width=</code> method sets the stroke width for subsequent
4
- # stroke calls.
5
- #
6
- # Since Ruby assumes that an unknown variable on the left hand side of an
7
- # assignment is a local temporary, rather than a setter method, if you are using
8
- # the block call to <code>Prawn::Document.generate</code> without passing params
9
- # you will need to call <code>line_width</code> on self.
10
-
11
- # rubocop: disable Lint/UselessAssignment
12
- require_relative '../example_helper'
13
-
14
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
15
- Prawn::ManualBuilder::Example.generate(filename) do
16
- stroke_axis
17
-
18
- y = 250
19
-
20
- 3.times do |i|
21
- case i
22
- when 0 then line_width = 10 # This call will have no effect
23
- when 1 then self.line_width = 10
24
- when 2 then self.line_width = 25
25
- end
26
-
27
- stroke do
28
- horizontal_line 50, 150, at: y
29
- rectangle [275, y + 25], 50, 50
30
- circle [500, y], 25
31
- end
32
-
33
- y -= 100
34
- end
35
- end
36
- # rubocop: enable Lint/UselessAssignment
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Prawn supports drawing both lines and curves starting either at the current
4
- # position, or from a specified starting position.
5
- #
6
- # <code>line_to</code> and <code>curve_to</code> set the drawing path from the
7
- # current drawing position to the specified point. The initial drawing position
8
- # can be set with <code>move_to</code>. They are useful when you want to chain
9
- # successive calls because the drawing position will be set to the specified
10
- # point afterwards.
11
- #
12
- # <code>line</code> and <code>curve</code> set the drawing path between the two
13
- # specified points.
14
- #
15
- # Both curve methods define a Bezier curve bounded by two aditional points
16
- # provided as the <code>:bounds</code> param.
17
-
18
- require_relative '../example_helper'
19
-
20
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
21
- Prawn::ManualBuilder::Example.generate(filename) do
22
- stroke_axis
23
-
24
- # line_to and curve_to
25
- stroke do
26
- move_to 0, 0
27
-
28
- line_to 100, 100
29
- line_to 0, 100
30
-
31
- curve_to [150, 250], bounds: [[20, 200], [120, 200]]
32
- curve_to [200, 0], bounds: [[150, 200], [450, 10]]
33
- end
34
-
35
- # line and curve
36
- stroke do
37
- line [300, 200], [400, 50]
38
- curve [500, 0], [400, 200], bounds: [[600, 300], [300, 390]]
39
- end
40
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Drawing polygons in Prawn is easy, just pass a sequence of points to one of
4
- # the polygon family of methods.
5
- #
6
- # Just like <code>rounded_rectangle</code> we also have
7
- # <code>rounded_polygon</code>. The only difference is the radius param comes
8
- # before the polygon points.
9
-
10
- require_relative '../example_helper'
11
-
12
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
13
- Prawn::ManualBuilder::Example.generate(filename) do
14
- stroke_axis
15
-
16
- # Triangle
17
- stroke_polygon [50, 200], [50, 300], [150, 300]
18
-
19
- # Hexagon
20
- fill_polygon [50, 150], [150, 200], [250, 150], [250, 50], [150, 0], [50, 50]
21
-
22
- # Pentagram
23
- pentagon_points = [500, 100], [430, 5], [319, 41], [319, 159], [430, 195]
24
- pentagram_points = [0, 2, 4, 1, 3].map { |i| pentagon_points[i] }
25
-
26
- stroke_rounded_polygon(20, *pentagram_points)
27
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # To draw a rectangle, just provide the upper-left corner, width and height to
4
- # the <code>rectangle</code> method.
5
- #
6
- # There's also <code>rounded_rectangle</code>. Just provide an additional radius
7
- # value for the rounded corners.
8
-
9
- require_relative '../example_helper'
10
-
11
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
12
- Prawn::ManualBuilder::Example.generate(filename) do
13
- stroke_axis
14
-
15
- stroke do
16
- rectangle [100, 300], 100, 200
17
-
18
- rounded_rectangle [300, 300], 100, 200, 20
19
- end
20
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # This transformation is used to rotate the user space. Give it an angle
4
- # and an <code>:origin</code> point about which to rotate and a block.
5
- # Everything inside the block will be drawn with the rotated coordinates.
6
- #
7
- # The angle is in degrees.
8
- #
9
- # If you omit the <code>:origin</code> option the page origin will be used.
10
-
11
- require_relative '../example_helper'
12
-
13
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
14
- Prawn::ManualBuilder::Example.generate(filename) do
15
- stroke_axis
16
-
17
- fill_circle [250, 200], 2
18
-
19
- 12.times do |i|
20
- rotate(i * 30, origin: [250, 200]) do
21
- stroke_rectangle [350, 225], 100, 50
22
- draw_text "Rotated #{i * 30}°", size: 10, at: [360, 205]
23
- end
24
- end
25
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # This transformation is used to scale the user space. Give it an scale factor
4
- # and an <code>:origin</code> point and everything inside the block will be
5
- # scaled using the origin point as reference.
6
- #
7
- # If you omit the <code>:origin</code> option the page origin will be used.
8
-
9
- require_relative '../example_helper'
10
-
11
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
12
- Prawn::ManualBuilder::Example.generate(filename) do
13
- stroke_axis
14
-
15
- width = 100
16
- height = 50
17
-
18
- x = 50
19
- y = 200
20
-
21
- stroke_rectangle [x, y], width, height
22
- text_box 'reference rectangle', at: [x + 10, y - 10], width: width - 20
23
-
24
- scale(2, origin: [x, y]) do
25
- stroke_rectangle [x, y], width, height
26
- text_box 'rectangle scaled from upper-left corner',
27
- at: [x, y - height - 5],
28
- width: width
29
- end
30
-
31
- x = 350
32
-
33
- stroke_rectangle [x, y], width, height
34
- text_box 'reference rectangle', at: [x + 10, y - 10], width: width - 20
35
-
36
- scale(2, origin: [x + width / 2, y - height / 2]) do
37
- stroke_rectangle [x, y], width, height
38
- text_box 'rectangle scaled from center',
39
- at: [x, y - height - 5],
40
- width: width
41
- end
42
- end
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Soft masks are used for more complex alpha channel manipulations. You can use
4
- # arbitrary drawing functions for creation of soft masks. The resulting alpha
5
- # channel is made of greyscale version of the drawing (luminosity channel to be
6
- # precise). So while you can use any combination of colors for soft masks it's
7
- # easier to use greyscales. Black will result in full transparency and white
8
- # will make region fully opaque.
9
- #
10
- # Soft mask is a part of page graphic state. So if you want to apply soft mask
11
- # only to a part of page you need to enclose drawing instructions in
12
- # <code>save_graphics_state</code> block.
13
-
14
- require_relative '../example_helper'
15
-
16
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
17
- Prawn::ManualBuilder::Example.generate(filename) do
18
- save_graphics_state do
19
- soft_mask do
20
- 0.upto 15 do |i|
21
- fill_color 0, 0, 0, 100.0 / 16.0 * (15 - i)
22
- fill_circle [75 + i * 25, 100], 60
23
- end
24
- end
25
-
26
- fill_color '009ddc'
27
- fill_rectangle [0, 60], 600, 20
28
-
29
- fill_color '963d97'
30
- fill_rectangle [0, 80], 600, 20
31
-
32
- fill_color 'e03a3e'
33
- fill_rectangle [0, 100], 600, 20
34
-
35
- fill_color 'f5821f'
36
- fill_rectangle [0, 120], 600, 20
37
-
38
- fill_color 'fdb827'
39
- fill_rectangle [0, 140], 600, 20
40
-
41
- fill_color '61bb46'
42
- fill_rectangle [0, 160], 600, 20
43
- end
44
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # The cap style defines how the edge of a line or curve will be drawn. There are
4
- # three types: <code>:butt</code> (the default), <code>:round</code> and
5
- # <code>:projecting_square</code>
6
- #
7
- # The difference is better seen with thicker lines. With <code>:butt</code>
8
- # lines are drawn starting and ending at the exact points provided. With both
9
- # <code>:round</code> and <code>:projecting_square</code> the line is projected
10
- # beyond the start and end points.
11
- #
12
- # Just like <code>line_width=</code> the <code>cap_style=</code> method needs an
13
- # explicit receiver to work.
14
-
15
- require_relative '../example_helper'
16
-
17
- filename = File.basename(__FILE__).gsub('.rb', '.pdf')
18
- Prawn::ManualBuilder::Example.generate(filename) do
19
- stroke_axis
20
-
21
- self.line_width = 25
22
-
23
- %i[butt round projecting_square].each_with_index do |cap, i|
24
- self.cap_style = cap
25
-
26
- y = 250 - i * 100
27
- stroke_horizontal_line 100, 300, at: y
28
- stroke_circle [400, y], 15
29
- end
30
- end