class Magick::RVG::PathData

The PathData class provides an object-oriented way to produce an SVG path. Each of the methods corresponds to a path command. Construct a path by calling one or more methods. The path object can be passed as an argument to the RVG::ShapeConstructors#path method.

Public Class Methods

new() click to toggle source

Construct an empty path

# File lib/rvg/pathdata.rb, line 24
def initialize
  @path = ''
end

Public Instance Methods

arc(abs, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, x, y) click to toggle source

Add an arc command. If abs is true the coordinates are absolute, otherwise the coordinates are relative.

# File lib/rvg/pathdata.rb, line 120
def arc(abs, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, x, y)
  @path << sprintf('%s%g,%g %g %d %d %g,%g ', (abs ? 'A' : 'a'), rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, x, y)
end
closepath(_abs = true) click to toggle source

Add a closepath command. The abs argument is ignored.

# File lib/rvg/pathdata.rb, line 49
def closepath(_abs = true)
  @path << 'Z' # ignore `abs'
end
curveto(abs, x1, y1, x2, y2, x, y, *coords) click to toggle source

Add a curveto (cubic Bezier) command. If abs is true the coordinates are absolute, otherwise the coordinates are relative.

# File lib/rvg/pathdata.rb, line 81
def curveto(abs, x1, y1, x2, y2, x, y, *coords)
  @path << sprintf('%s%g,%g %g,%g %g,%g ', (abs ? 'C' : 'c'), x1, y1, x2, y2, x, y)
  # "multiple sets of coordinates may be specified to draw a polybezier"
  add_points(6, *coords)
end
deep_copy(_h = nil) click to toggle source

@private

# File lib/rvg/pathdata.rb, line 34
def deep_copy(_h = nil)
  @path.dup
end
hlineto(abs, x) click to toggle source

Add a horizontal lineto command. If abs is true the coordinates are absolute, otherwise the coordinates are relative.

# File lib/rvg/pathdata.rb, line 66
def hlineto(abs, x)
  @path << sprintf('%s%g ', (abs ? 'H' : 'h'), x)
end
lineto(abs, x, y, *coords) click to toggle source

Add a lineto command. Any number of x,y coordinate pairs may be specified. If abs is true the coordinates are absolute, otherwise the coordinates are relative.

# File lib/rvg/pathdata.rb, line 57
def lineto(abs, x, y, *coords)
  @path << sprintf('%s%g,%g ', (abs ? 'L' : 'l'), x, y)
  # "a number of coordinate pairs may be specified to draw a polyline"
  add_points(2, *coords)
end
moveto(abs, x, y, *coords) click to toggle source

Add a moveto command. If abs is true the coordinates are absolute, otherwise the coordinates are relative.

# File lib/rvg/pathdata.rb, line 41
def moveto(abs, x, y, *coords)
  @path << sprintf('%s%g,%g ', (abs ? 'M' : 'm'), x, y)
  # "subsequent pairs are treated as implicit lineto commands"
  add_points(2, *coords)
end
quadratic_curveto(abs, x1, y1, x, y, *coords) click to toggle source

Add a quadratic Bezier curveto command. If abs is true the coordinates are absolute, otherwise the coordinates are relative.

# File lib/rvg/pathdata.rb, line 101
def quadratic_curveto(abs, x1, y1, x, y, *coords)
  @path << sprintf('%s%g,%g %g,%g ', (abs ? 'Q' : 'q'), x1, y1, x, y)
  add_points(4, *coords)
end
smooth_curveto(abs, x2, y2, x, y, *coords) click to toggle source

Add a smooth curveto (cubic Bezier) command. If abs is true the coordinates are absolute, otherwise the coordinates are relative.

# File lib/rvg/pathdata.rb, line 91
def smooth_curveto(abs, x2, y2, x, y, *coords)
  @path << sprintf('%s%g,%g %g,%g ', (abs ? 'S' : 's'), x2, y2, x, y)
  # "multiple sets of coordinates may be specified to draw a polybezier"
  add_points(4, *coords)
end
smooth_quadratic_curveto(abs, x, y, *coords) click to toggle source

Add a smooth quadratic Bezier curveto command. If abs is true the coordinates are absolute, otherwise the coordinates are relative.

# File lib/rvg/pathdata.rb, line 110
def smooth_quadratic_curveto(abs, x, y, *coords)
  @path << sprintf('%s%g,%g ', (abs ? 'T' : 't'), x, y)
  add_points(2, *coords)
end
to_s() click to toggle source

Convert the path to its string equivalent.

# File lib/rvg/pathdata.rb, line 29
def to_s
  @path
end
vlineto(abs, y) click to toggle source

Add a vertical lineto command. If abs is true the coordinates are absolute, otherwise the coordinates are relative.

# File lib/rvg/pathdata.rb, line 73
def vlineto(abs, y)
  @path << sprintf('%s%g ', (abs ? 'V' : 'v'), y)
end

Private Instance Methods

add_points(req, *coords) click to toggle source
# File lib/rvg/pathdata.rb, line 14
def add_points(req, *coords)
  return unless coords
  raise ArgumentError, "wrong number of coordinates specified. A multiple of #{req} required, #{req + coords.length} given." if coords.length % req != 0

  coords.each { |c| @path << sprintf('%g', c) }
end