class Dragonfly::ImageMagick::Generators::Text

Constants

FONT_STRETCHES
FONT_STYLES
FONT_WEIGHTS

Public Instance Methods

call(content, string, opts={}) click to toggle source
# File lib/dragonfly/image_magick/generators/text.rb, line 46
def call(content, string, opts={})
  opts = HashWithCssStyleKeys[opts]
  args = []
  format = extract_format(opts)
  background = opts['background_color'] || 'none'
  font_size = (opts['font_size'] || 12).to_i
  escaped_string = "\"#{string.gsub(/"/, '\"')}\""

  # Settings
  args.push("-gravity NorthWest")
  args.push("-antialias")
  args.push("-pointsize #{font_size}")
  args.push("-font \"#{opts['font']}\"") if opts['font']
  args.push("-family '#{opts['font_family']}'") if opts['font_family']
  args.push("-fill #{opts['color']}") if opts['color']
  args.push("-stroke #{opts['stroke_color']}") if opts['stroke_color']
  args.push("-style #{FONT_STYLES[opts['font_style']]}") if opts['font_style']
  args.push("-stretch #{FONT_STRETCHES[opts['font_stretch']]}") if opts['font_stretch']
  args.push("-weight #{FONT_WEIGHTS[opts['font_weight']]}") if opts['font_weight']
  args.push("-background #{background}")
  args.push("label:#{escaped_string}")

  # Padding
  pt, pr, pb, pl = parse_padding_string(opts['padding']) if opts['padding']
  padding_top    = (opts['padding_top']    || pt || 0)
  padding_right  = (opts['padding_right']  || pr || 0)
  padding_bottom = (opts['padding_bottom'] || pb || 0)
  padding_left   = (opts['padding_left']   || pl || 0)

  content.generate!(:convert, args.join(' '), format)

  if (padding_top || padding_right || padding_bottom || padding_left)
    dimensions = content.analyse(:image_properties)
    text_width  = dimensions['width']
    text_height = dimensions['height']
    width  = padding_left + text_width  + padding_right
    height = padding_top  + text_height + padding_bottom

    args = args.slice(0, args.length - 2)
    args.push("-size #{width}x#{height}")
    args.push("xc:#{background}")
    args.push("-annotate 0x0+#{padding_left}+#{padding_top} #{escaped_string}")
    content.generate!(:convert, args.join(' '), format)
  end

  content.add_meta('format' => format, 'name' => "text.#{format}")
end
update_url(url_attributes, string, opts={}) click to toggle source
# File lib/dragonfly/image_magick/generators/text.rb, line 42
def update_url(url_attributes, string, opts={})
  url_attributes.name = "text.#{extract_format(opts)}"
end

Private Instance Methods

extract_format(opts) click to toggle source
# File lib/dragonfly/image_magick/generators/text.rb, line 96
def extract_format(opts)
  opts['format'] || 'png'
end
parse_padding_string(str) click to toggle source

Use css-style padding declaration, i.e. 10 (all sides) 10 5 (top/bottom, left/right) 10 5 10 (top, left/right, bottom) 10 5 10 5 (top, right, bottom, left)

# File lib/dragonfly/image_magick/generators/text.rb, line 105
def parse_padding_string(str)
  padding_parts = str.gsub('px','').split(/\s+/).map{|px| px.to_i}
  case padding_parts.size
  when 1
    p = padding_parts.first
    [p,p,p,p]
  when 2
    p,q = padding_parts
    [p,q,p,q]
  when 3
    p,q,r = padding_parts
    [p,q,r,q]
  when 4
    padding_parts
  else raise ArgumentError, "Couldn't parse padding string '#{str}' - should be a css-style string"
  end
end