# File lib/prawn/svg/element.rb, line 49
  def apply_styles
    # Transform
    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    
        
    # Opacity:
    # We can't do nested opacities quite like the SVG requires, but this is close enough.
    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

    # Fill and stroke
    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
    
    # Stroke width
    add_call('line_width', @document.distance(@attributes['stroke-width'])) if @attributes['stroke-width']      

    # Fonts        
    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    
    
    # Call fill, stroke, or both
    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