class Magick::RVG::Image
def add_composite_primitive(gc)
def add_composite_primitive(gc) if @align == 'none' # Let RMagick do the scaling scale = 1.0 width = @width height = @height elsif @meet_or_slice == 'meet' scale = [@width / @image.columns, @height / @image.rows].min || 1.0 width = @image.columns height = @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 || 1.0 width = @image.columns height = @image.rows end tx, ty = align_to_viewport(scale) gc.composite(@x + tx, @y + ty, width * scale, height * scale, @image) end
def add_primitives(gc)
- Private: -
def add_primitives(gc) # Do not render if width or height is 0 return if @width.zero? || @height.zero? gc.push add_transform_primitives(gc) add_style_primitives(gc) add_composite_primitive(gc) gc.pop end
def align_to_viewport(scale)
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 else 0 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 else 0 end [tx, ty] end
def init_viewbox
def init_viewbox @align = nil @vbx_width = @image.columns @vbx_height = @image.rows @meet_or_slice = 'meet' end
def initialize(image, width = nil, height = nil, x = 0, y = 0)
+width+ and +height+.
Composite a raster image in the viewport defined by [x,y] and
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) raise ArgumentError, 'width, height must be >= 0' if @width < 0 || @height < 0 init_viewbox end