Composite a raster image in the viewport defined by [x,y] and
width
and height
. Use the
Magick::RVG::ImageConstructors#image
method to create Text objects in a container.
# File lib/rvg/embellishable.rb, line 219 def initialize(image, width=nil, height=nil, x=0, y=0) super() # run module initializers @image = image.copy # use a copy of the image in case app. re-uses the argument @x, @y, @width, @height = Magick::RVG.convert_to_float(x, y, width || @image.columns, height || @image.rows) if @width < 0 || @height < 0 fail ArgumentError, 'width, height must be >= 0' end init_viewbox end
# File lib/rvg/embellishable.rb, line 185 def add_composite_primitive(gc) if @align == 'none' # Let RMagick do the scaling scale = 1.0 width, height = @width, @height elsif @meet_or_slice == 'meet' scale = [@width/@image.columns, @height/@image.rows].min width, height = @image.columns, @image.rows else # Establish clipping path around the current viewport name = __id__.to_s gc.define_clip_path(name) do gc.path("M#{@x},#{@y} l#{@width},0 l0,#{@height} l-#{@width},0 l0,-#{@height}z") end gc.clip_path(name) scale = [@width/@image.columns, @height/@image.rows].max width, height = @image.columns, @image.rows end tx, ty = align_to_viewport(scale) gc.composite(@x+tx, @y+ty, width*scale, height*scale, @image) end
# File lib/rvg/embellishable.rb, line 164 def align_to_viewport(scale) tx = case @align when 'none', /\AxMin/ 0 when NilClass, /\AxMid/ (@width - @image.columns*scale) / 2.0 when /\AxMax/ @width - @image.columns*scale end ty = case @align when 'none', /YMin\z/ 0 when NilClass, /YMid\z/ (@height - @image.rows*scale) / 2.0 when /YMax\z/ @height - @image.rows*scale end [tx, ty] end
# File lib/rvg/embellishable.rb, line 208 def init_viewbox @align = nil @vbx_width, @vbx_height = @image.columns, @image.rows @meet_or_slice = 'meet' end