def apply_styles
if transform = @attributes['transform']
parse_css_method_calls(transform).each do |name, arguments|
case name
when 'translate'
x, y = arguments
x, y = x.split(/\s+/) if y.nil?
add_call_and_enter name, @document.distance(x), -@document.distance(y)
when 'rotate'
add_call_and_enter name, -arguments.first.to_f, :origin => [0, @document.y('0')]
when 'scale'
args = arguments.first.split(/\s+/)
x_scale = args[0].to_f
y_scale = (args[1] || x_scale).to_f
add_call_and_enter "transformation_matrix", x_scale, 0, 0, y_scale, 0, 0
when 'matrix'
args = arguments.first.split(/\s+/)
if args.length != 6
@document.warnings << "transform 'matrix' must have six arguments"
else
a, b, c, d, e, f = args.collect {|a| a.to_f}
add_call_and_enter "transformation_matrix", a, b, c, d, @document.distance(e), -@document.distance(f)
end
else
@document.warnings << "Unknown transformation '#{name}'; ignoring"
end
end
end
fill_opacity = stroke_opacity = clamp(@attributes['opacity'].to_f, 0, 1) if @attributes['opacity']
fill_opacity = clamp(@attributes['fill-opacity'].to_f, 0, 1) if @attributes['fill-opacity']
stroke_opacity = clamp(@attributes['stroke-opacity'].to_f, 0, 1) if @attributes['stroke-opacity']
if fill_opacity || stroke_opacity
state[:fill_opacity] = (state[:fill_opacity] || 1) * (fill_opacity || 1)
state[:stroke_opacity] = (state[:stroke_opacity] || 1) * (stroke_opacity || 1)
add_call_and_enter 'transparent', state[:fill_opacity], state[:stroke_opacity]
end
draw_types = []
[:fill, :stroke].each do |type|
dec = @attributes[type.to_s]
if dec == "none"
state[type] = false
elsif dec
state[type] = true
if color = color_to_hex(dec)
add_call "#{type}_color", color
end
end
draw_types << type.to_s if state[type]
end
add_call('line_width', @document.distance(@attributes['stroke-width'])) if @attributes['stroke-width']
if size = @attributes['font-size']
@state[:font_size] = size.to_f * @document.scale
end
if weight = @attributes['font-weight']
font_updated = true
@state[:font_style] = weight == 'bold' ? :bold : nil
end
if (family = @attributes['font-family']) && family.strip != ""
font_updated = true
@state[:font_family] = family
end
if @state[:font_family] && font_updated
if pdf_font = Prawn::Svg::Font.map_font_family_to_pdf_font(@state[:font_family], @state[:font_style])
add_call_and_enter 'font', pdf_font
else
@document.warnings << "Font family '#{@state[:font_family]}' style '#{@state[:font_style] || 'normal'}' is not a known font."
end
end
draw_type = draw_types.join("_and_")
if draw_type != "" && !Prawn::Svg::Parser::CONTAINER_TAGS.include?(element.name)
add_call_and_enter draw_type
end
end