class Magick::Draw

Constants

ALIGN_TYPE_NAMES

Thse hashes are used to map Magick constant values to the strings used in the primitives.

ANCHOR_TYPE_NAMES
DECORATION_TYPE_NAMES
FONT_WEIGHT_NAMES
GRAVITY_NAMES
PAINT_METHOD_NAMES
STRETCH_TYPE_NAMES
STYLE_TYPE_NAMES

Public Class Methods

new() click to toggle source
# File lib/rmagick4j/draw.rb, line 62
def initialize
  # Docs say that you can initialize with a block, but it doesn't really work because it inits an ImageInfo not a DrawInfo.
  # instance_eval &add if add
  @draw = Magick4J::DrawInfo.new
  @primitives = ''
end

Public Instance Methods

affine(sx, rx, ry, sy, tx, ty) click to toggle source

Apply coordinate transformations to support scaling (s), rotation ®, and translation (t). Angles are specified in radians.

# File lib/RMagick.rb, line 207
def affine(sx, rx, ry, sy, tx, ty)
    primitive "affine " + sprintf("%g,%g,%g,%g,%g,%g", sx, rx, ry, sy, tx, ty)
end
annotate(img, width, height, x, y, text, &add) click to toggle source
# File lib/rmagick4j/draw.rb, line 5
def annotate(img, width, height, x, y, text, &add)
  instance_eval &add if add
  text = parse_string(text)
  @draw.annotate(img._image, width, height, x, y, text)
  self
end
arc(startX, startY, endX, endY, startDegrees, endDegrees) click to toggle source

Draw an arc.

# File lib/RMagick.rb, line 212
def arc(startX, startY, endX, endY, startDegrees, endDegrees)
    primitive "arc " + sprintf("%g,%g %g,%g %g,%g",
                startX, startY, endX, endY, startDegrees, endDegrees)
end
bezier(*points) click to toggle source

Draw a bezier curve.

# File lib/RMagick.rb, line 218
def bezier(*points)
    if points.length == 0
        Kernel.raise ArgumentError, "no points specified"
    elsif points.length % 2 != 0
        Kernel.raise ArgumentError, "odd number of arguments specified"
    end
    primitive "bezier " + points.join(',')
end
circle(originX, originY, perimX, perimY) click to toggle source

Draw a circle

# File lib/RMagick.rb, line 228
def circle(originX, originY, perimX, perimY)
    primitive "circle " + sprintf("%g,%g %g,%g", originX, originY, perimX, perimY)
end
clip_path(name) click to toggle source

Invoke a clip-path defined by def_clip_path.

# File lib/RMagick.rb, line 233
def clip_path(name)
    primitive "clip-path #{name}"
end
clip_rule(rule) click to toggle source

Define the clipping rule.

# File lib/RMagick.rb, line 238
def clip_rule(rule)
    if ( not ["evenodd", "nonzero"].include?(rule.downcase) )
        Kernel.raise ArgumentError, "Unknown clipping rule #{rule}"
    end
    primitive "clip-rule #{rule}"
end
clip_units(unit) click to toggle source

Define the clip units

# File lib/RMagick.rb, line 246
def clip_units(unit)
    if ( not ["userspace", "userspaceonuse", "objectboundingbox"].include?(unit.downcase) )
        Kernel.raise ArgumentError, "Unknown clip unit #{unit}"
    end
    primitive "clip-units #{unit}"
end
clone() click to toggle source
# File lib/rmagick4j/draw.rb, line 12
def clone
  b = Draw.new
  b.primitives = @primitives.clone
  b._draw = @draw.clone
  b.freeze if self.frozen?
  b
end
color(x, y, method) click to toggle source

Set color in image according to specified colorization rule. Rule is one of point, replace, floodfill, filltoborder,reset

# File lib/RMagick.rb, line 255
def color(x, y, method)
    if ( not PAINT_METHOD_NAMES.has_key?(method.to_i) )
        Kernel.raise ArgumentError, "Unknown PaintMethod: #{method}"
    end
    primitive "color #{x},#{y},#{PAINT_METHOD_NAMES[method.to_i]}"
end
decorate(decoration) click to toggle source

Specify EITHER the text decoration (none, underline, overline, line-through) OR the text solid background color (any color name or spec)

# File lib/RMagick.rb, line 264
def decorate(decoration)
    if ( DECORATION_TYPE_NAMES.has_key?(decoration.to_i) )
        primitive "decorate #{DECORATION_TYPE_NAMES[decoration.to_i]}"
    else
        primitive "decorate #{enquote(decoration)}"
    end
end
define_clip_path(name) { || ... } click to toggle source

Define a clip-path. A clip-path is a sequence of primitives bracketed by the “push clip-path <name>” and “pop clip-path” primitives. Upon advice from the IM guys, we also bracket the clip-path primitives with “push(pop) defs” and “push (pop) graphic-context”.

# File lib/RMagick.rb, line 277
def define_clip_path(name)
    begin
        push('defs')
        push('clip-path', name)
        push('graphic-context')
        yield
    ensure
        pop('graphic-context')
        pop('clip-path')
        pop('defs')
    end
end
draw(image) click to toggle source
# File lib/rmagick4j/draw.rb, line 20
def draw(image)
  @draw.clone.draw(image._image, Magick4J.CommandParser.parse(@primitives))
  self
end
ellipse(originX, originY, width, height, arcStart, arcEnd) click to toggle source

Draw an ellipse

# File lib/RMagick.rb, line 291
def ellipse(originX, originY, width, height, arcStart, arcEnd)
    primitive "ellipse " + sprintf("%g,%g %g,%g %g,%g",
                    originX, originY, width, height, arcStart, arcEnd)
end
encoding(encoding) click to toggle source

Let anything through, but the only defined argument is “UTF-8”. All others are apparently ignored.

# File lib/RMagick.rb, line 298
def encoding(encoding)
    primitive "encoding #{encoding}"
end
fill(colorspec) click to toggle source

Specify object fill, a color name or pattern name

# File lib/RMagick.rb, line 303
def fill(colorspec)
    primitive "fill #{enquote(colorspec)}"
end
Also aliased as: fill_color, fill_pattern
fill=(fill) click to toggle source
# File lib/rmagick4j/draw.rb, line 25
def fill= fill
  @draw.fill = Magick4J.ColorDatabase.query_default(fill)
  self
end
fill_color(colorspec)
Alias for: fill
fill_opacity(opacity) click to toggle source

Specify fill opacity (use “xx%” to indicate percentage)

# File lib/RMagick.rb, line 310
def fill_opacity(opacity)
    primitive "fill-opacity #{opacity}"
end
fill_pattern(colorspec)
Alias for: fill
fill_rule(rule) click to toggle source
# File lib/RMagick.rb, line 314
def fill_rule(rule)
    if ( not ["evenodd", "nonzero"].include?(rule.downcase) )
        Kernel.raise ArgumentError, "Unknown fill rule #{rule}"
    end
    primitive "fill-rule #{rule}"
end
font(name) click to toggle source

Specify text drawing font

# File lib/RMagick.rb, line 322
def font(name)
    primitive "font #{name}"
end
font=(font) click to toggle source
# File lib/rmagick4j/draw.rb, line 54
def font= font
  # TODO
end
font_family(name) click to toggle source
# File lib/RMagick.rb, line 326
def font_family(name)
    primitive "font-family \'#{name}\'"
end
font_family=(font_family) click to toggle source
# File lib/rmagick4j/draw.rb, line 30
def font_family= font_family
  @draw.font_family = font_family
  self
end
font_size(points)
Alias for: pointsize
font_stretch(stretch) click to toggle source
# File lib/RMagick.rb, line 330
def font_stretch(stretch)
    if ( not STRETCH_TYPE_NAMES.has_key?(stretch.to_i) )
        Kernel.raise ArgumentError, "Unknown stretch type"
    end
    primitive "font-stretch #{STRETCH_TYPE_NAMES[stretch.to_i]}"
end
font_style(style) click to toggle source
# File lib/RMagick.rb, line 337
def font_style(style)
    if ( not STYLE_TYPE_NAMES.has_key?(style.to_i) )
        Kernel.raise ArgumentError, "Unknown style type"
    end
    primitive "font-style #{STYLE_TYPE_NAMES[style.to_i]}"
end
font_weight(weight) click to toggle source

The font weight argument can be either a font weight constant or [100,200,…,900]

# File lib/RMagick.rb, line 346
def font_weight(weight)
    if ( FONT_WEIGHT_NAMES.has_key?(weight.to_i) )
        primitive "font-weight #{FONT_WEIGHT_NAMES[weight.to_i]}"
    else
        primitive "font-weight #{weight}"
    end
end
font_weight=(font_weight) click to toggle source
# File lib/rmagick4j/draw.rb, line 35
def font_weight= font_weight
  font_weight = {BoldWeight => 700, NormalWeight => 400}[font_weight]
  @draw.font_weight = font_weight
end
get_multiline_type_metrics(*args) click to toggle source
# File lib/rmagick4j/draw.rb, line 40
def get_multiline_type_metrics(*args)
  raise ArgumentError.new('wrong number of arguments (#{args.length})') if not (1..2) === args.length
  string = parse_string(args.last)
  image = args.first._image if args.length == 2
  type_metrics_from_java(@draw.getMultilineTypeMetrics(string, image))
end
get_type_metrics(*args) click to toggle source
# File lib/rmagick4j/draw.rb, line 47
def get_type_metrics(*args)
  raise ArgumentError.new('wrong number of arguments (#{args.length})') if not (1..2) === args.length
  string = parse_string(args.last)
  image = args.first._image if args.length == 2
  type_metrics_from_java(@draw.getTypeMetrics(string, image))
end
gravity(grav) click to toggle source

Specify the text positioning gravity, one of: NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast

# File lib/RMagick.rb, line 356
def gravity(grav)
    if ( not GRAVITY_NAMES.has_key?(grav.to_i) )
        Kernel.raise ArgumentError, "Unknown text positioning gravity"
    end
    primitive "gravity #{GRAVITY_NAMES[grav.to_i]}"
end
gravity=(gravity) click to toggle source
# File lib/rmagick4j/draw.rb, line 58
def gravity= gravity
  @draw.setGravity(gravity._val)
end
inspect() click to toggle source
# File lib/rmagick4j/draw.rb, line 69
def inspect
  if @primitives == ''
    '(no primitives defined)'
  else
    @primitives
  end
end
interword_spacing(space) click to toggle source

IM 6.4.8-3 and later

# File lib/RMagick.rb, line 364
def interword_spacing(space)
    begin
        Float(space)
    rescue ArgumentError
        Kernel.raise ArgumentError, "invalid value for interword_spacing"
    rescue TypeError
        Kernel.raise TypeError, "can't convert #{space.class} into Float"
    end
    primitive "interword-spacing #{space}"
end
kerning(space) click to toggle source

IM 6.4.8-3 and later

# File lib/RMagick.rb, line 376
def kerning(space)
    begin
        Float(space)
    rescue ArgumentError
        Kernel.raise ArgumentError, "invalid value for kerning"
    rescue TypeError
        Kernel.raise TypeError, "can't convert #{space.class} into Float"
    end
    primitive "kerning #{space}"
end
line(startX, startY, endX, endY) click to toggle source

Draw a line

# File lib/RMagick.rb, line 388
def line(startX, startY, endX, endY)
    primitive "line " + sprintf("%g,%g %g,%g", startX, startY, endX, endY)
end
matte(x, y, method) click to toggle source

Set matte (make transparent) in image according to the specified colorization rule

# File lib/RMagick.rb, line 394
def matte(x, y, method)
    if ( not PAINT_METHOD_NAMES.has_key?(method.to_i) )
        Kernel.raise ArgumentError, "Unknown paint method"
    end
    primitive "matte #{x},#{y} #{PAINT_METHOD_NAMES[method.to_i]}"
end
opacity(opacity) click to toggle source

Specify drawing fill and stroke opacities. If the value is a string ending with a %, the number will be multiplied by 0.01.

# File lib/RMagick.rb, line 403
def opacity(opacity)
    if (Numeric === opacity)
        if (opacity < 0 || opacity > 1.0)
            Kernel.raise ArgumentError, "opacity must be >= 0 and <= 1.0"
        end
    end
    primitive "opacity #{opacity}"
end
path(cmds) click to toggle source

Draw using SVG-compatible path drawing commands. Note that the primitive requires that the commands be surrounded by quotes or apostrophes. Here we simply use apostrophes.

# File lib/RMagick.rb, line 415
def path(cmds)
    primitive "path '" + cmds + "'"
end
pattern(name, x, y, width, height) { || ... } click to toggle source

Define a pattern. In the block, call primitive methods to draw the pattern. Reference the pattern by using its name as the argument to the 'fill' or 'stroke' methods

# File lib/RMagick.rb, line 422
def pattern(name, x, y, width, height)
    begin
        push('defs')
        push("pattern #{name} #{x} #{y} #{width} #{height}")
        push('graphic-context')
        yield
    ensure
        pop('graphic-context')
        pop('pattern')
        pop('defs')
    end
end
point(x, y) click to toggle source

Set point to fill color.

# File lib/RMagick.rb, line 436
def point(x, y)
    primitive "point #{x},#{y}"
end
pointsize(points) click to toggle source

Specify the font size in points. Yes, the primitive is “font-size” but in other places this value is called the “pointsize”. Give it both names.

# File lib/RMagick.rb, line 442
def pointsize(points)
    primitive "font-size #{points}"
end
Also aliased as: font_size
pointsize=(pointsize) click to toggle source
# File lib/rmagick4j/draw.rb, line 77
def pointsize= pointsize
  @draw.setPointSize(pointsize)
end
polygon(*points) click to toggle source

Draw a polygon

# File lib/RMagick.rb, line 448
def polygon(*points)
    if points.length == 0
        Kernel.raise ArgumentError, "no points specified"
    elsif points.length % 2 != 0
        Kernel.raise ArgumentError, "odd number of points specified"
    end
    primitive "polygon " + points.join(',')
end
polyline(*points) click to toggle source

Draw a polyline

# File lib/RMagick.rb, line 458
def polyline(*points)
    if points.length == 0
        Kernel.raise ArgumentError, "no points specified"
    elsif points.length % 2 != 0
        Kernel.raise ArgumentError, "odd number of points specified"
    end
    primitive "polyline " + points.join(',')
end
pop(*what) click to toggle source

Return to the previously-saved set of whatever pop('graphic-context') (the default if no arguments) pop('defs') pop('gradient') pop('pattern')

# File lib/RMagick.rb, line 473
def pop(*what)
    if what.length == 0
        primitive "pop graphic-context"
    else
        # to_s allows a Symbol to be used instead of a String
        primitive "pop " + what.map {|w| w.to_s}.join(' ')
    end
end
primitive(primitive) click to toggle source
# File lib/rmagick4j/draw.rb, line 81
def primitive primitive
  # TODO Concat in a string like they do, then use helper to parse later
  @primitives << "\n" unless @primitives.empty?
  @primitives << primitive.gsub(/[\r|\n]/, '')
  self
end
push(*what) click to toggle source

Push the current set of drawing options. Also you can use push('graphic-context') (the default if no arguments) push('defs') push('gradient') push('pattern')

# File lib/RMagick.rb, line 487
def push(*what)
    if what.length == 0
        primitive "push graphic-context"
    else
        # to_s allows a Symbol to be used instead of a String
        primitive "push " + what.map {|w| w.to_s}.join(' ')
    end
end
rectangle(upper_left_x, upper_left_y, lower_right_x, lower_right_y) click to toggle source

Draw a rectangle

# File lib/RMagick.rb, line 497
def rectangle(upper_left_x, upper_left_y, lower_right_x, lower_right_y)
    primitive "rectangle " + sprintf("%g,%g %g,%g",
            upper_left_x, upper_left_y, lower_right_x, lower_right_y)
end
rotate(angle) click to toggle source

Specify coordinate space rotation. “angle” is measured in degrees

# File lib/RMagick.rb, line 503
def rotate(angle)
    primitive "rotate #{angle}"
end
rotation=(rotation) click to toggle source
# File lib/rmagick4j/draw.rb, line 88
def rotation= rotation
  @draw.rotate(rotation)
  self
end
roundrectangle(center_x, center_y, width, height, corner_width, corner_height) click to toggle source

Draw a rectangle with rounded corners

# File lib/RMagick.rb, line 508
def roundrectangle(center_x, center_y, width, height, corner_width, corner_height)
    primitive "roundrectangle " + sprintf("%g,%g,%g,%g,%g,%g",
        center_x, center_y, width, height, corner_width, corner_height)
end
scale(x, y) click to toggle source

Specify scaling to be applied to coordinate space on subsequent drawing commands.

# File lib/RMagick.rb, line 514
def scale(x, y)
    primitive "scale #{x},#{y}"
end
skewx(angle) click to toggle source
# File lib/RMagick.rb, line 518
def skewx(angle)
    primitive "skewX #{angle}"
end
skewy(angle) click to toggle source
# File lib/RMagick.rb, line 522
def skewy(angle)
    primitive "skewY #{angle}"
end
stroke(colorspec) click to toggle source

Specify the object stroke, a color name or pattern name.

# File lib/RMagick.rb, line 527
def stroke(colorspec)
    primitive "stroke #{enquote(colorspec)}"
end
Also aliased as: stroke_color, stroke_pattern
stroke=(stroke) click to toggle source
# File lib/rmagick4j/draw.rb, line 93
def stroke= stroke
  @draw.setStroke(Magick4J.ColorDatabase.queryDefault(stroke))
  self
end
stroke_antialias(bool) click to toggle source

Specify if stroke should be antialiased or not

# File lib/RMagick.rb, line 534
def stroke_antialias(bool)
    bool = bool ? '1' : '0'
    primitive "stroke-antialias #{bool}"
end
stroke_color(colorspec)
Alias for: stroke
stroke_dasharray(*list) click to toggle source

Specify a stroke dash pattern

# File lib/RMagick.rb, line 540
def stroke_dasharray(*list)
    if list.length == 0
        primitive "stroke-dasharray none"
    else
        list.each { |x|
            if x <= 0 then
                Kernel.raise ArgumentError, "dash array elements must be > 0 (#{x} given)"
            end
        }
        primitive "stroke-dasharray #{list.join(',')}"
    end
end
stroke_dashoffset(value=0) click to toggle source

Specify the initial offset in the dash pattern

# File lib/RMagick.rb, line 554
def stroke_dashoffset(value=0)
    primitive "stroke-dashoffset #{value}"
end
stroke_linecap(value) click to toggle source
# File lib/RMagick.rb, line 558
def stroke_linecap(value)
    if ( not ["butt", "round", "square"].include?(value.downcase) )
        Kernel.raise ArgumentError, "Unknown linecap type: #{value}"
    end
    primitive "stroke-linecap #{value}"
end
stroke_linejoin(value) click to toggle source
# File lib/RMagick.rb, line 565
def stroke_linejoin(value)
    if ( not ["round", "miter", "bevel"].include?(value.downcase) )
        Kernel.raise ArgumentError, "Unknown linejoin type: #{value}"
    end
    primitive "stroke-linejoin #{value}"
end
stroke_miterlimit(value) click to toggle source
# File lib/RMagick.rb, line 572
def stroke_miterlimit(value)
    if (value < 1)
        Kernel.raise ArgumentError, "miterlimit must be >= 1"
    end
    primitive "stroke-miterlimit #{value}"
end
stroke_opacity(value) click to toggle source

Specify opacity of stroke drawing color

(use "xx%" to indicate percentage)
# File lib/RMagick.rb, line 581
def stroke_opacity(value)
    primitive "stroke-opacity #{value}"
end
stroke_pattern(colorspec)
Alias for: stroke
stroke_width(pixels) click to toggle source

Specify stroke (outline) width in pixels.

# File lib/RMagick.rb, line 586
def stroke_width(pixels)
    primitive "stroke-width #{pixels}"
end
text(x, y, text) click to toggle source

Draw text at position x,y. Add quotes to text that is not already quoted.

# File lib/RMagick.rb, line 591
def text(x, y, text)
    if text.to_s.empty?
        Kernel.raise ArgumentError, "missing text argument"
    end
    if text.length > 2 && /\A(?:\"[^\"]+\"|\'[^\']+\'|\{[^\}]+\})\z/.match(text)
        ; # text already quoted
    elsif !text['\'']
        text = '\''+text+'\''
    elsif !text['"']
        text = '"'+text+'"'
    elsif !(text['{'] || text['}'])
        text = '{'+text+'}'
    else
        # escape existing braces, surround with braces
        text = '{' +  text.gsub(/[}]/) { |b| '\\' + b } + '}'
    end
    primitive "text #{x},#{y} #{text}"
end
text_align(alignment) click to toggle source

Specify text alignment relative to a given point

# File lib/RMagick.rb, line 611
def text_align(alignment)
    if ( not ALIGN_TYPE_NAMES.has_key?(alignment.to_i) )
        Kernel.raise ArgumentError, "Unknown alignment constant: #{alignment}"
    end
    primitive "text-align #{ALIGN_TYPE_NAMES[alignment.to_i]}"
end
text_anchor(anchor) click to toggle source

SVG-compatible version of text_align

# File lib/RMagick.rb, line 619
def text_anchor(anchor)
    if ( not ANCHOR_TYPE_NAMES.has_key?(anchor.to_i) )
        Kernel.raise ArgumentError, "Unknown anchor constant: #{anchor}"
    end
    primitive "text-anchor #{ANCHOR_TYPE_NAMES[anchor.to_i]}"
end
text_antialias(boolean) click to toggle source

Specify if rendered text is to be antialiased.

# File lib/RMagick.rb, line 627
def text_antialias(boolean)
    boolean = boolean ? '1' : '0'
    primitive "text-antialias #{boolean}"
end
text_undercolor(color) click to toggle source

Specify color underneath text

# File lib/RMagick.rb, line 633
def text_undercolor(color)
    primitive "text-undercolor #{enquote(color)}"
end
translate(x, y) click to toggle source

Specify center of coordinate space to use for subsequent drawing commands.

# File lib/RMagick.rb, line 639
def translate(x, y)
    primitive "translate #{x},#{y}"
end

Protected Instance Methods

_draw=(value) click to toggle source
# File lib/rmagick4j/draw.rb, line 120
def _draw=(value)
  @draw = value
end
primitives=(value) click to toggle source
# File lib/rmagick4j/draw.rb, line 116
def primitives=(value)
  @primitives = value.to_str
end

Private Instance Methods

enquote(str) click to toggle source
# File lib/RMagick.rb, line 195
def enquote(str)
    if str.length > 2 && /\A(?:\"[^\"]+\"|\'[^\']+\'|\{[^\}]+\})\z/.match(str)
        return str
    else
        return '"' + str + '"'
    end
end
parse_string(text) click to toggle source
# File lib/rmagick4j/draw.rb, line 100
def parse_string(text)
  text.split(/\\n/).join("\n")
end
type_metrics_from_java(jmetrics) click to toggle source
# File lib/rmagick4j/draw.rb, line 104
def type_metrics_from_java(jmetrics)
  metrics = TypeMetric.new
  metrics.ascent = jmetrics.getAscent
  metrics.descent = jmetrics.getDescent
  metrics.height = jmetrics.getHeight
  metrics.max_advance = jmetrics.getMaxAdvance
  metrics.width = jmetrics.getWidth
  metrics
end