idml 0.2.5 → 0.2.7

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.
@@ -43,15 +43,7 @@ module Idml
43
43
  private_class_method :chain_head?
44
44
 
45
45
  def self.frame_box(frame, page_height)
46
- bounds = frame.geometric_bounds
47
- unless bounds
48
- return { x: 72.0, y: page_height - 72.0, width: 400.0,
49
- height: 600.0 }
50
- end
51
-
52
- transform = Geometry.parse_transform(frame.item_transform)
53
- transformed = Geometry.transform_bounds(bounds, transform)
54
- Geometry.bounds_to_pdf_rect(transformed, page_height)
46
+ Placement.box(frame, page_height, fallback: true)
55
47
  end
56
48
  private_class_method :frame_box
57
49
 
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Idml
4
+ module Render
5
+ # Maps IDML stroke-style attributes on a page item to the four
6
+ # pdfrb Canvas setters that control PDF stroke rendering:
7
+ # `line_cap=`, `line_join=`, `miter_limit=`, `dash_pattern=`.
8
+ #
9
+ # IDML → PDF enum mapping per PDF 32000-1 §8.4.3:
10
+ #
11
+ # EndCap → LineCap
12
+ # ButtEndCap → 0
13
+ # RoundEndCap → 1
14
+ # ProjectingEndCap → 2
15
+ #
16
+ # EndJoin → LineJoin
17
+ # MiterEndJoin → 0
18
+ # RoundEndJoin → 1
19
+ # BevelEndJoin → 2
20
+ #
21
+ # `StrokeDashAndGap` is a flat list `[d1, g1, d2, g2, ...]` — pdfrb
22
+ # accepts the same shape as `dash_pattern=[array, phase]`.
23
+ module StrokeStyle
24
+ CAP_MAP = {
25
+ "ButtEndCap" => 0,
26
+ "RoundEndCap" => 1,
27
+ "ProjectingEndCap" => 2,
28
+ }.freeze
29
+
30
+ JOIN_MAP = {
31
+ "MiterEndJoin" => 0,
32
+ "RoundEndJoin" => 1,
33
+ "BevelEndJoin" => 2,
34
+ }.freeze
35
+
36
+ # True when the item has a renderable stroke: a non-None stroke
37
+ # color and a positive stroke weight.
38
+ def self.strokeable?(item)
39
+ !!(item.stroke_color &&
40
+ item.stroke_color != "Color/None" &&
41
+ item.stroke_weight&.positive?)
42
+ end
43
+
44
+ # Apply stroke-style settings from `item` to `canvas` inside a
45
+ # saved graphics state, then yield so the caller can emit the
46
+ # path and call `canvas.stroke`. The save/restore ensures
47
+ # cap/join/miter/dash settings don't bleed into subsequent
48
+ # strokes on the same page.
49
+ def self.apply(canvas, item)
50
+ canvas.save_graphics_state do
51
+ set_cap(canvas, item.end_cap)
52
+ set_join(canvas, item.end_join)
53
+ set_miter(canvas, item.miter_limit)
54
+ set_dash(canvas, item.stroke_dash_and_gap)
55
+ yield
56
+ end
57
+ end
58
+
59
+ def self.set_cap(canvas, raw)
60
+ code = CAP_MAP[raw]
61
+ canvas.line_cap = code if code
62
+ end
63
+ private_class_method :set_cap
64
+
65
+ def self.set_join(canvas, raw)
66
+ code = JOIN_MAP[raw]
67
+ canvas.line_join = code if code
68
+ end
69
+ private_class_method :set_join
70
+
71
+ def self.set_miter(canvas, raw)
72
+ return unless raw
73
+
74
+ value = raw.to_f
75
+ return unless value >= 1.0
76
+
77
+ canvas.miter_limit = value
78
+ end
79
+ private_class_method :set_miter
80
+
81
+ def self.set_dash(canvas, raw)
82
+ return unless raw
83
+
84
+ array = parse_dash_array(raw)
85
+ return unless array.length >= 2
86
+
87
+ canvas.dash_pattern = [array, 0]
88
+ end
89
+ private_class_method :set_dash
90
+
91
+ def self.parse_dash_array(raw)
92
+ raw.to_s.split(/\s+/).map(&:to_f)
93
+ end
94
+ private_class_method :parse_dash_array
95
+ end
96
+ end
97
+ end
data/lib/idml/render.rb CHANGED
@@ -11,7 +11,10 @@ module Idml
11
11
  autoload :FontReferenceResolver,
12
12
  "#{__dir__}/render/font_reference_resolver"
13
13
  autoload :GradientResolver, "#{__dir__}/render/gradient_resolver"
14
+ autoload :Blending, "#{__dir__}/render/blending"
15
+ autoload :StrokeStyle, "#{__dir__}/render/stroke_style"
14
16
  autoload :LayerFilter, "#{__dir__}/render/layer_filter"
17
+ autoload :Placement, "#{__dir__}/render/placement"
15
18
  autoload :StoryThreader, "#{__dir__}/render/story_threader"
16
19
  autoload :PdfrbWriter, "#{__dir__}/render/pdfrb_writer"
17
20
  autoload :SpreadRenderer, "#{__dir__}/render/spread_renderer"
data/lib/idml/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Idml
4
- VERSION = "0.2.5"
4
+ VERSION = "0.2.7"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: idml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose
@@ -207,6 +207,14 @@ files:
207
207
  - TODO.pdf/64-pipeline-cli-optimizations.md
208
208
  - TODO.pdf/65-pdfrb-019-integration.md
209
209
  - TODO.pdf/66-gradient-shadings-pdfrb.md
210
+ - TODO.pdf/67-text-rich-multi-run.md
211
+ - TODO.pdf/68-radial-gradient-shadings.md
212
+ - TODO.pdf/69-transparency-blend-modes.md
213
+ - TODO.pdf/70-stroke-styling.md
214
+ - TODO.pdf/71-shared-placement-module.md
215
+ - TODO.pdf/72-stroke-styling.md
216
+ - TODO.pdf/73-gradient-resolver-cleanup.md
217
+ - TODO.pdf/74-renderer-spec-coverage.md
210
218
  - TODO.pdf/README.md
211
219
  - exe/idml
212
220
  - idml.gemspec
@@ -371,6 +379,7 @@ files:
371
379
  - lib/idml/parts/style_mapping.rb
372
380
  - lib/idml/parts/tags.rb
373
381
  - lib/idml/render.rb
382
+ - lib/idml/render/blending.rb
374
383
  - lib/idml/render/color_helper.rb
375
384
  - lib/idml/render/color_resolver.rb
376
385
  - lib/idml/render/font_reference_resolver.rb
@@ -380,6 +389,7 @@ files:
380
389
  - lib/idml/render/page_item_renderer.rb
381
390
  - lib/idml/render/pdfrb_writer.rb
382
391
  - lib/idml/render/pipeline.rb
392
+ - lib/idml/render/placement.rb
383
393
  - lib/idml/render/render_context.rb
384
394
  - lib/idml/render/renderers.rb
385
395
  - lib/idml/render/renderers/graphic_line_renderer.rb
@@ -390,6 +400,7 @@ files:
390
400
  - lib/idml/render/renderers/text_frame_renderer.rb
391
401
  - lib/idml/render/spread_renderer.rb
392
402
  - lib/idml/render/story_threader.rb
403
+ - lib/idml/render/stroke_style.rb
393
404
  - lib/idml/render/style_resolver.rb
394
405
  - lib/idml/text_engine.rb
395
406
  - lib/idml/text_engine/cjk_layout.rb