Class: CTioga2::TextSizeWatcher
- Inherits:
-
Object
- Object
- CTioga2::TextSizeWatcher
- Defined in:
- lib/ctioga2/utils.rb
Overview
This class watches over a list of named texts and can be queried for size/position information.
Instance Attribute Summary collapse
-
#bb ⇒ Object
A left, bottom, right, up bounding box (postscript points).
-
#watched_names ⇒ Object
Watched text names.
Instance Method Summary collapse
- #compute_bb(t) ⇒ Object
-
#initialize ⇒ TextSizeWatcher
constructor
A new instance of TextSizeWatcher.
-
#update_margins(t, margins, padding = 2, min = 4) ⇒ Object
Given the MarginsBox with which the text was drawn, returns another MarginsBox item that specifies how much the text extends from the previous box.
- #watch(*names) ⇒ Object
Constructor Details
#initialize ⇒ TextSizeWatcher
Returns a new instance of TextSizeWatcher.
569 570 571 |
# File 'lib/ctioga2/utils.rb', line 569 def initialize @watched_names = Set.new end |
Instance Attribute Details
#bb ⇒ Object
A left, bottom, right, up bounding box (postscript points)
567 568 569 |
# File 'lib/ctioga2/utils.rb', line 567 def bb @bb end |
#watched_names ⇒ Object
Watched text names
564 565 566 |
# File 'lib/ctioga2/utils.rb', line 564 def watched_names @watched_names end |
Instance Method Details
#compute_bb(t) ⇒ Object
613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 |
# File 'lib/ctioga2/utils.rb', line 613 def compute_bb(t) @bb = nil for w in @watched_names info = t.get_text_size(w) if info.key? 'points' # We need to take every single point, since for rotated # text, potentially all coordinates are different for p in info['points'] update_bb(*p) end end end end |
#update_margins(t, margins, padding = 2, min = 4) ⇒ Object
Given the MarginsBox with which the text was drawn, returns another MarginsBox item that specifies how much the text extends from the previous box. Works using the current frame coordinates.
Padding in big points
Min is the minimum size, also in big points.
585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 |
# File 'lib/ctioga2/utils.rb', line 585 def update_margins(t, margins, padding = 2, min = 4) compute_bb(t) if ! @bb # Don't change anything if the bounding box does not exist return margins end left, top, right, bottom = *margins.to_frame_coordinates(t) scl = 1/t.scaling_factor xl = scl * t.convert_page_to_output_x(t.convert_frame_to_page_x(left)) xr = scl * t.convert_page_to_output_x(t.convert_frame_to_page_x(right)) yt = scl * t.convert_page_to_output_y(t.convert_frame_to_page_y(top)) yb = scl * t.convert_page_to_output_y(t.convert_frame_to_page_y(bottom)) vals = [ xl - @bb[0], @bb[2] - xr, @bb[3] - yt, yb - @bb[1]].map do |x| x += padding x = if x > min x else min end Graphics::Types::Dimension.new(:bp, x) end return Graphics::Types::MarginsBox. new(*vals) end |
#watch(*names) ⇒ Object
573 574 575 |
# File 'lib/ctioga2/utils.rb', line 573 def watch(*names) @watched_names += names end |