You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
3.0 KiB
76 lines
3.0 KiB
module Squib |
|
|
|
# Cache all pngs we've already loaded |
|
# |
|
# :nodoc: |
|
# @api private |
|
def cache_load_image(file) |
|
@img_cache ||= {} |
|
@img_cache[file] || @img_cache[file] = Cairo::ImageSurface.from_png(file) |
|
end |
|
module_function :cache_load_image |
|
|
|
class Card |
|
|
|
# :nodoc: |
|
# @api private |
|
def png(file, box, paint, trans) |
|
Squib.logger.debug {"RENDERING PNG: \n file: #{file}\n box: #{box}\n paint: #{paint}\n trans: #{trans}"} |
|
return if file.nil? or file.eql? '' |
|
png = Squib.cache_load_image(file) |
|
use_cairo do |cc| |
|
cc.translate(box.x, box.y) |
|
if box.width != :native || box.height != :native |
|
box.width = png.width.to_f if box.width == :native |
|
box.height = png.height.to_f if box.height == :native |
|
box.width = png.width.to_f * box.height.to_f / png.height.to_f if box.width == :scale |
|
box.height = png.height.to_f * box.width.to_f / png.width.to_f if box.height == :scale |
|
Squib.logger.warn "PNG scaling results in aliasing." |
|
cc.scale(box.width.to_f / png.width.to_f, box.height.to_f / png.height.to_f) |
|
end |
|
cc.rotate(trans.angle) |
|
cc.translate(-box.x, -box.y) |
|
cc.set_source(png, box.x, box.y) |
|
cc.operator = paint.blend unless paint.blend == :none |
|
if paint.mask.empty? |
|
cc.paint(paint.alpha) |
|
else |
|
cc.set_source_squibcolor(paint.mask) |
|
cc.mask(png, box.x, box.y) |
|
end |
|
end |
|
end |
|
|
|
# :nodoc: |
|
# @api private |
|
def svg(file, svg_args, box, paint, trans) |
|
Squib.logger.debug {"Rendering: #{file}, id: #{id} @#{x},#{y} #{width}x#{height}, alpha: #{alpha}, blend: #{blend}, angle: #{angle}, mask: #{mask}"} |
|
Squib.logger.warn 'Both an SVG file and SVG data were specified' unless file.to_s.empty? || svg_args.data.to_s.empty? |
|
return if (file.nil? or file.eql? '') and svg_args.data.nil? # nothing specified TODO Move this out to arg validator |
|
svg_args.data = File.read(file) if svg_args.data.to_s.empty? |
|
svg = RSVG::Handle.new_from_data(svg_args.data) |
|
box.width = svg.width if box.width == :native |
|
box.height = svg.height if box.height == :native |
|
box.width = svg.width.to_f * box.height.to_f / svg.height.to_f if box.width == :scale |
|
box.height = svg.height.to_f * box.width.to_f / svg.width.to_f if box.height == :scale |
|
scale_width = box.width.to_f / svg.width.to_f |
|
scale_height = box.height.to_f / svg.height.to_f |
|
use_cairo do |cc| |
|
cc.translate(box.x, box.y) |
|
cc.rotate(trans.angle) |
|
cc.scale(scale_width, scale_height) |
|
cc.operator = paint.blend unless paint.blend == :none |
|
if paint.mask.to_s.empty? |
|
cc.render_rsvg_handle(svg, svg_args.id) |
|
else |
|
tmp = Cairo::ImageSurface.new(box.width / scale_width, box.height / scale_height) |
|
tmp_cc = Cairo::Context.new(tmp) |
|
tmp_cc.render_rsvg_handle(svg, svg_args.id) |
|
cc.set_source_squibcolor(paint.mask) |
|
cc.mask(tmp, 0, 0) |
|
end |
|
end |
|
end |
|
|
|
end |
|
end
|
|
|