class Gpx2png::RmagickRenderer

Attributes

licence_string[RW]
markers[RW]
x[RW]
y[RW]

Public Class Methods

new(_options = {}) click to toggle source
# File lib/gpx2png/renderers/rmagick_renderer.rb, line 7
def initialize(_options = {})
  @options = _options || {}
  @color = @options[:color] || '#FF0000'
  @width = @options[:width] || 3
  @aa = @options[:aa] == true
  @opacity = @options[:opacity] || 1.0
  @crop_margin = @options[:crop_margin] || 50
  @crop_enabled = @options[:crop_enabled] == true

  @line = Magick::Draw.new
  @line.stroke_antialias(@aa)
  @line.stroke(@color)
  @line.stroke_opacity(@opacity)
  @line.stroke_width(@width)

  @marker_label = Magick::Draw.new
  @marker_label.text_antialias(@aa)
  @marker_label.font_family('helvetica')
  @marker_label.font_style(Magick::NormalStyle)
  @marker_label.text_align(Magick::LeftAlign)
  @marker_label.pointsize(12)

  @marker_frame = Magick::Draw.new
  @marker_frame.stroke_antialias(@aa)
  @marker_frame.stroke('black')
  @marker_frame.stroke_opacity(0.3)
  @marker_frame.fill('white')
  @marker_frame.fill_opacity(0.3)

  @licence_text = Magick::Draw.new
  @licence_text.text_antialias(@aa)
  @licence_text.font_family('helvetica')
  @licence_text.font_style(Magick::NormalStyle)
  @licence_text.text_align(Magick::RightAlign)
  @licence_text.pointsize(12)

  @markers = Array.new
end

Public Instance Methods

add_tile(blob, x_offset, y_offset) click to toggle source

Add one tile to full image

# File lib/gpx2png/renderers/rmagick_renderer.rb, line 59
def add_tile(blob, x_offset, y_offset)
  tile_image = Magick::Image.from_blob(blob)[0]
  @image = @image.composite(
    tile_image,
    x_offset,
    y_offset,
    Magick::OverCompositeOp
  )
end
blank_tile(width, height, index = 0) click to toggle source
# File lib/gpx2png/renderers/rmagick_renderer.rb, line 197
def blank_tile(width, height, index = 0)
  _image = Magick::Image.new(
    width,
    height
  ) do |i|
    _color = "#dddddd"
    _color = "#eeeeee" if index % 2 == 0
    i.background_color = _color
  end
  _image.format = 'PNG'
  _image.to_blob
end
crop!() click to toggle source

Setup crop image using CSS padding style data

# File lib/gpx2png/renderers/rmagick_renderer.rb, line 103
def crop!
  return unless @crop_enabled

  @new_x = @x - @crop_r.to_i - @crop_l.to_i
  @new_y = @y - @crop_b.to_i - @crop_t.to_i
  @image = @image.crop(@crop_l.to_i, @crop_t.to_i, @new_x, @new_y, true)
  # changing image size
  @x = @new_x
  @y = @new_y
end
destroy() click to toggle source

remove object, memory issues

# File lib/gpx2png/renderers/rmagick_renderer.rb, line 182
def destroy
  @image.destroy!
end
line(xa, ya, xb, yb) click to toggle source
# File lib/gpx2png/renderers/rmagick_renderer.rb, line 69
def line(xa, ya, xb, yb)
  @line.line(
    xa, ya,
    xb, yb
  )
end
new_image() click to toggle source

Create new (full) image

# File lib/gpx2png/renderers/rmagick_renderer.rb, line 51
def new_image
  @image = Magick::Image.new(
    @x,
    @y
  )
end
render() click to toggle source
# File lib/gpx2png/renderers/rmagick_renderer.rb, line 166
def render
  @line.draw(@image)

  # crop after drawing lines, before drawing "legend"
  crop!

  # "static" elements
  @licence_text.text(@x - 10, @y - 10, @licence_string)
  @licence_text.draw(@image)

  # draw point images
  render_markers
  render_marker_labels
end
render_marker_labels() click to toggle source

Render nice looking labels

# File lib/gpx2png/renderers/rmagick_renderer.rb, line 139
def render_marker_labels
  #http://www.simplesystems.org/RMagick/doc/draw.html#get_type_metrics
  #http://rmagick.rubyforge.org/web2/web2-3.html

  @markers.each do |p|
    p[:x_label] = p[:x_after_crop] + 10
    p[:y_label] = p[:y_after_crop] - 15

    tm = @marker_label.get_type_metrics(@image, p[:label])
    p[:text_width] = tm.width
    p[:text_height] = tm.height
    p[:text_padding] = 3

    @marker_frame.rectangle(
      p[:x_label],
      p[:y_label],
      p[:x_label] + p[:text_width] + p[:text_padding] * 2,
      p[:y_label] + p[:text_height] + p[:text_padding] * 2
    )
    # text
    @marker_label.text(p[:x_label] + p[:text_padding], p[:y_label] + p[:text_padding] + 12, p[:label].to_s + " ")
  end

  @marker_frame.draw(@image)
  @marker_label.draw(@image)
end
render_markers() click to toggle source

Render only marker images, and perform some calculations

# File lib/gpx2png/renderers/rmagick_renderer.rb, line 115
def render_markers
  @markers.each do |p|
    # using custom marker
    _blob = p[:blob]
    # or default
    _blob = SampleMarker::BLOB if _blob.nil?

    img_tile = Magick::Image.from_blob(_blob)[0]
    p[:x_after_crop] = p[:x] - @crop_l.to_i
    p[:y_after_crop] = p[:y] - @crop_t.to_i
    p[:x_center] = p[:x_after_crop] - img_tile.columns / 2
    p[:y_center] = p[:y_after_crop] - img_tile.rows / 2
    p[:x_next_to_image] = p[:x_after_crop] + img_tile.columns

    @image = @image.composite(
      img_tile,
      p[:x_center],
      p[:y_center],
      Magick::OverCompositeOp
    )
  end
end
save(filename) click to toggle source
# File lib/gpx2png/renderers/rmagick_renderer.rb, line 186
def save(filename)
  render
  @image.write(filename)
end
set_crop(x_min, x_max, y_min, y_max) click to toggle source

Setup crop image using CSS padding style data

# File lib/gpx2png/renderers/rmagick_renderer.rb, line 77
def set_crop(x_min, x_max, y_min, y_max)
  @crop_t = y_min - @crop_margin
  @crop_r = (@x - x_max) - @crop_margin
  @crop_b = (@y - y_max) - @crop_margin
  @crop_l = x_min - @crop_margin

  @crop_t = 0 if @crop_t < 0
  @crop_r = 0 if @crop_r < 0
  @crop_b = 0 if @crop_b < 0
  @crop_l = 0 if @crop_l < 0
end
set_crop_fixed(x_center, y_center, width, height) click to toggle source

Setup crop for autozoom/fixed size

# File lib/gpx2png/renderers/rmagick_renderer.rb, line 90
def set_crop_fixed(x_center, y_center, width, height)
  @crop_margin = 0
  @crop_enabled = true

  set_crop(
    x_center - (width / 2),
    x_center + (width / 2),
    y_center - (height / 2),
    y_center + (height / 2)
  )
end
to_png() click to toggle source
# File lib/gpx2png/renderers/rmagick_renderer.rb, line 191
def to_png
  render
  @image.format = 'PNG'
  @image.to_blob
end