class Magick::RVG::Utility::GraphicContext

Constants

ANCHOR_TO_ALIGN
FONT_STRETCH
FONT_STYLE
FONT_WEIGHT
TEXT_ANCHOR
TEXT_DECORATION
TEXT_STRATEGIES

Attributes

gc[R]
text_attrs[R]

Public Class Methods

degrees_to_radians(deg) click to toggle source
# File lib/rvg/misc.rb, line 489
def self.degrees_to_radians(deg)
  Math::PI * (deg % 360.0) / 180.0
end
new() click to toggle source
# File lib/rvg/misc.rb, line 517
def initialize
  @gc = Magick::Draw.new
  @shadow = []
  @shadow << Magick::Draw.new
  @text_attrs = TextAttributes.new
  init_matrix
end

Public Instance Methods

affine(sx, rx, ry, sy, tx, ty) click to toggle source
# File lib/rvg/misc.rb, line 529
def affine(sx, rx, ry, sy, tx, ty)
  sx, rx, ry, sy, tx, ty = Magick::RVG.convert_to_float(sx, rx, ry, sy, tx, ty)
  @gc.affine(sx, rx, ry, sy, tx, ty)
  @text_attrs.set_affine(sx, rx, ry, sy, tx, ty)
  nil
end
baseline_shift(value) click to toggle source
# File lib/rvg/misc.rb, line 536
def baseline_shift(value)
  @text_attrs.baseline_shift = case value
                               when 'baseline', 'sub', 'super'
                                 value.to_sym
                               when /[-+]?\d+%/, Numeric
                                 value
                               else
                                 :baseline
                               end
  nil
end
font(name) click to toggle source
# File lib/rvg/misc.rb, line 548
def font(name)
  @gc.font(name)
  @shadow[-1].font = name
  nil
end
font_family(name) click to toggle source
# File lib/rvg/misc.rb, line 554
def font_family(name)
  @gc.font_family(name)
  @shadow[-1].font_family = name
  nil
end
font_size(points) click to toggle source
# File lib/rvg/misc.rb, line 560
def font_size(points)
  @gc.font_size(points)
  @shadow[-1].pointsize = points
  nil
end
font_stretch(stretch) click to toggle source
# File lib/rvg/misc.rb, line 566
def font_stretch(stretch)
  stretch = FONT_STRETCH.fetch(stretch.to_sym, Magick::NormalStretch)
  @gc.font_stretch(stretch)
  @shadow[-1].font_stretch = stretch
  nil
end
font_style(style) click to toggle source
# File lib/rvg/misc.rb, line 573
def font_style(style)
  style = FONT_STYLE.fetch(style.to_sym, Magick::NormalStyle)
  @gc.font_style(style)
  @shadow[-1].font_style = style
  nil
end
font_weight(weight) click to toggle source
# File lib/rvg/misc.rb, line 580
def font_weight(weight)
  # If the arg is not in the hash use it directly. Handles numeric values.
  weight = FONT_WEIGHT.fetch(weight) { |key| key }
  @gc.font_weight(weight)
  @shadow[-1].font_weight = weight
  nil
end
glyph_orientation_horizontal(deg) click to toggle source
# File lib/rvg/misc.rb, line 588
def glyph_orientation_horizontal(deg)
  deg = Magick::RVG.convert_one_to_float(deg)
  @text_attrs.glyph_orientation_horizontal = (deg % 360) / 90 * 90
  nil
end
glyph_orientation_vertical(deg) click to toggle source
# File lib/rvg/misc.rb, line 594
def glyph_orientation_vertical(deg)
  deg = Magick::RVG.convert_one_to_float(deg)
  @text_attrs.glyph_orientation_vertical = (deg % 360) / 90 * 90
  nil
end
inspect() click to toggle source
# File lib/rvg/misc.rb, line 600
def inspect
  @gc.inspect
end
letter_spacing(value) click to toggle source
# File lib/rvg/misc.rb, line 604
def letter_spacing(value)
  @text_attrs.letter_spacing = Magick::RVG.convert_one_to_float(value)
  nil
end
method_missing(meth_id, *args, &block) click to toggle source
# File lib/rvg/misc.rb, line 525
def method_missing(meth_id, *args, &block)
  @gc.__send__(meth_id, *args, &block)
end
pop() click to toggle source
# File lib/rvg/misc.rb, line 616
def pop
  @gc.pop
  @shadow.pop
  @text_attrs.pop
  nil
end
push() click to toggle source
# File lib/rvg/misc.rb, line 609
def push
  @gc.push
  @shadow.push(@shadow.last.dup)
  @text_attrs.push
  nil
end
rotate(degrees) click to toggle source
# File lib/rvg/misc.rb, line 623
def rotate(degrees)
  degrees = Magick::RVG.convert_one_to_float(degrees)
  @gc.rotate(degrees)
  @sx =  Math.cos(GraphicContext.degrees_to_radians(degrees))
  @rx =  Math.sin(GraphicContext.degrees_to_radians(degrees))
  @ry = -Math.sin(GraphicContext.degrees_to_radians(degrees))
  @sy =  Math.cos(GraphicContext.degrees_to_radians(degrees))
  concat_matrix
  nil
end
scale(sx, sy) click to toggle source
# File lib/rvg/misc.rb, line 634
def scale(sx, sy)
  sx, sy = Magick::RVG.convert_to_float(sx, sy)
  @gc.scale(sx, sy)
  @sx = sx
  @sy = sy
  concat_matrix
  nil
end
shadow() click to toggle source
# File lib/rvg/misc.rb, line 643
def shadow
  @shadow.last
end
skewX(degrees) click to toggle source
# File lib/rvg/misc.rb, line 647
def skewX(degrees)
  degrees = Magick::RVG.convert_one_to_float(degrees)
  @gc.skewX(degrees)
  @ry = Math.tan(GraphicContext.degrees_to_radians(degrees))
  concat_matrix
  nil
end
skewY(degrees) click to toggle source
# File lib/rvg/misc.rb, line 655
def skewY(degrees)
  degrees = Magick::RVG.convert_one_to_float(degrees)
  @gc.skewY(degrees)
  @rx = Math.tan(GraphicContext.degrees_to_radians(degrees))
  concat_matrix
  nil
end
stroke_width(width) click to toggle source
# File lib/rvg/misc.rb, line 663
def stroke_width(width)
  width = Magick::RVG.convert_one_to_float(width)
  @gc.stroke_width(width)
  @shadow[-1].stroke_width = width
  nil
end
text(x, y, text) click to toggle source
# File lib/rvg/misc.rb, line 670
def text(x, y, text)
  return if text.length.zero?

  text_renderer = if @text_attrs.non_default?
                    TEXT_STRATEGIES[@text_attrs.writing_mode].new(self)
                  else
                    DefaultTextStrategy.new(self)
                  end

  text_renderer.render(x, y, text)
end
text_anchor(anchor) click to toggle source
# File lib/rvg/misc.rb, line 682
def text_anchor(anchor)
  anchor = anchor.to_sym
  anchor_enum = TEXT_ANCHOR.fetch(anchor, Magick::StartAnchor)
  @gc.text_anchor(anchor_enum)
  align = ANCHOR_TO_ALIGN.fetch(anchor, Magick::LeftAlign)
  @shadow[-1].align = align
  @text_attrs.text_anchor = anchor
  nil
end
text_decoration(decoration) click to toggle source
# File lib/rvg/misc.rb, line 692
def text_decoration(decoration)
  decoration = TEXT_DECORATION.fetch(decoration.to_sym, Magick::NoDecoration)
  @gc.decorate(decoration)
  @shadow[-1].decorate = decoration
  nil
end
translate(tx, ty) click to toggle source
# File lib/rvg/misc.rb, line 699
def translate(tx, ty)
  tx, ty = Magick::RVG.convert_to_float(tx, ty)
  @gc.translate(tx, ty)
  @tx = tx
  @ty = ty
  concat_matrix
  nil
end
word_spacing(value) click to toggle source
# File lib/rvg/misc.rb, line 708
def word_spacing(value)
  @text_attrs.word_spacing = Magick::RVG.convert_one_to_float(value)
  nil
end
writing_mode(mode) click to toggle source
# File lib/rvg/misc.rb, line 713
def writing_mode(mode)
  @text_attrs.writing_mode = mode
  nil
end

Private Instance Methods

concat_matrix() click to toggle source
# File lib/rvg/misc.rb, line 501
def concat_matrix
  curr = @text_attrs.affine
  sx = curr.sx * @sx + curr.ry * @rx
  rx = curr.rx * @sx + curr.sy * @rx
  ry = curr.sx * @ry + curr.ry * @sy
  sy = curr.rx * @ry + curr.sy * @sy
  tx = curr.sx * @tx + curr.ry * @ty + curr.tx
  ty = curr.rx * @tx + curr.sy * @ty + curr.ty
  @text_attrs.set_affine(sx, rx, ry, sy, tx, ty)
  init_matrix
end
init_matrix() click to toggle source
# File lib/rvg/misc.rb, line 495
def init_matrix
  @rx = @ry = 0
  @sx = @sy = 1
  @tx = @ty = 0
end