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.



569
570
571
# File 'lib/ctioga2/utils.rb', line 569

def initialize
  @watched_names = Set.new
end

Instance Attribute Details

#bbObject

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



567
568
569
# File 'lib/ctioga2/utils.rb', line 567

def bb
  @bb
end

#watched_namesObject

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