Class: CTioga2::TextSizeWatcher

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

Constructor Details

#initializeTextSizeWatcher

Returns a new instance of TextSizeWatcher.



605
606
607
# File 'lib/ctioga2/utils.rb', line 605

def initialize
  @watched_names = Set.new
end

Instance Attribute Details

#bbObject

A left, bottom, right, up bounding box (postscript points)



603
604
605
# File 'lib/ctioga2/utils.rb', line 603

def bb
  @bb
end

#watched_namesObject

Watched text names



600
601
602
# File 'lib/ctioga2/utils.rb', line 600

def watched_names
  @watched_names
end

Instance Method Details

#compute_bb(t) ⇒ Object



649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
# File 'lib/ctioga2/utils.rb', line 649

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.



621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
# File 'lib/ctioga2/utils.rb', line 621

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



609
610
611
# File 'lib/ctioga2/utils.rb', line 609

def watch(*names)
  @watched_names += names
end