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
# 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
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
# 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
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
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
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
Invoke a clip-path defined by def_clip_path.
# File lib/RMagick.rb, line 233 def clip_path(name) primitive "clip-path #{name}" end
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
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
# 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
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
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 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
# File lib/rmagick4j/draw.rb, line 20 def draw(image) @draw.clone.draw(image._image, Magick4J.CommandParser.parse(@primitives)) self end
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
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
Specify object fill, a color name or pattern name
# File lib/RMagick.rb, line 303 def fill(colorspec) primitive "fill #{enquote(colorspec)}" end
# File lib/rmagick4j/draw.rb, line 25 def fill= fill @draw.fill = Magick4J.ColorDatabase.query_default(fill) self end
Specify fill opacity (use “xx%” to indicate percentage)
# File lib/RMagick.rb, line 310 def fill_opacity(opacity) primitive "fill-opacity #{opacity}" end
# 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
Specify text drawing font
# File lib/RMagick.rb, line 322 def font(name) primitive "font #{name}" end
# File lib/rmagick4j/draw.rb, line 54 def font= font # TODO end
# File lib/RMagick.rb, line 326 def font_family(name) primitive "font-family \'#{name}\'" end
# File lib/rmagick4j/draw.rb, line 30 def font_family= font_family @draw.font_family = font_family self end
# 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
# 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
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
# 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
# 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
# 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
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
# File lib/rmagick4j/draw.rb, line 58 def gravity= gravity @draw.setGravity(gravity._val) end
# File lib/rmagick4j/draw.rb, line 69 def inspect if @primitives == '' '(no primitives defined)' else @primitives end end
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
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
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
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
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
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
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
Set point to fill color.
# File lib/RMagick.rb, line 436 def point(x, y) primitive "point #{x},#{y}" end
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
# File lib/rmagick4j/draw.rb, line 77 def pointsize= pointsize @draw.setPointSize(pointsize) end
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
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
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
# 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 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
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
Specify coordinate space rotation. “angle” is measured in degrees
# File lib/RMagick.rb, line 503 def rotate(angle) primitive "rotate #{angle}" end
# File lib/rmagick4j/draw.rb, line 88 def rotation= rotation @draw.rotate(rotation) self end
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
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
# File lib/RMagick.rb, line 518 def skewx(angle) primitive "skewX #{angle}" end
# File lib/RMagick.rb, line 522 def skewy(angle) primitive "skewY #{angle}" end
Specify the object stroke, a color name or pattern name.
# File lib/RMagick.rb, line 527 def stroke(colorspec) primitive "stroke #{enquote(colorspec)}" end
# File lib/rmagick4j/draw.rb, line 93 def stroke= stroke @draw.setStroke(Magick4J.ColorDatabase.queryDefault(stroke)) self end
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
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
Specify the initial offset in the dash pattern
# File lib/RMagick.rb, line 554 def stroke_dashoffset(value=0) primitive "stroke-dashoffset #{value}" end
# 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
# 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
# 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
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
Specify stroke (outline) width in pixels.
# File lib/RMagick.rb, line 586 def stroke_width(pixels) primitive "stroke-width #{pixels}" end
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
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
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
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
Specify color underneath text
# File lib/RMagick.rb, line 633 def text_undercolor(color) primitive "text-undercolor #{enquote(color)}" end
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
# File lib/rmagick4j/draw.rb, line 120 def _draw=(value) @draw = value end
# File lib/rmagick4j/draw.rb, line 116 def primitives=(value) @primitives = value.to_str end
Private Instance Methods
# File lib/RMagick.rb, line 195 def enquote(str) if str.length > 2 && /\A(?:\"[^\"]+\"|\'[^\']+\'|\{[^\}]+\})\z/.match(str) return str else return '"' + str + '"' end end
# File lib/rmagick4j/draw.rb, line 100 def parse_string(text) text.split(/\\n/).join("\n") end
# 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