class Magick::RVG::Utility::TextStrategy
Public Class Methods
new(context)
click to toggle source
# File lib/rvg/misc.rb, line 71 def initialize(context) @ctx = context @ctx.shadow.affine = @ctx.text_attrs.affine end
Public Instance Methods
enquote(text)
click to toggle source
# File lib/rvg/misc.rb, line 76 def enquote(text) if text.length > 2 && /\A(?:\"[^\"]+\"|\[^\]+\|\{[^\}]+\})\z/.match(text) return text elsif !text['\'] text = '\'+text+'\' return text elsif !text['"'] text = '"'+text+'"' return text elsif !(text['{'] || text['}']) text = '{'+text+'}' return text end # escape existing braces, surround with braces text.gsub!(/[}]/) { |b| '\' + b } '{' + text + '}' end
glyph_metrics(glyph_orientation, glyph)
click to toggle source
# File lib/rvg/misc.rb, line 95 def glyph_metrics(glyph_orientation, glyph) gm = @ctx.shadow.get_type_metrics('a' + glyph + 'a') gm2 = @ctx.shadow.get_type_metrics('aa') h = (gm.ascent - gm.descent + 0.5).to_i w = gm.width - gm2.width if glyph_orientation == 0 || glyph_orientation == 180 [w, h] else [h, w] end end
render_glyph(glyph_orientation, x, y, glyph)
click to toggle source
# File lib/rvg/misc.rb, line 151 def render_glyph(glyph_orientation, x, y, glyph) if glyph_orientation == 0 @ctx.gc.text(x, y, enquote(glyph)) else @ctx.gc.push @ctx.gc.translate(x, y) @ctx.gc.rotate(glyph_orientation) @ctx.gc.translate(-x, -y) @ctx.gc.text(x, y, enquote(glyph)) @ctx.gc.pop end end
shift_baseline(glyph_orientation, glyph)
click to toggle source
# File lib/rvg/misc.rb, line 128 def shift_baseline(glyph_orientation, glyph) glyph_dimensions = @ctx.shadow.get_type_metrics(glyph) if glyph_orientation == 0 || glyph_orientation == 180 x = glyph_dimensions.width else x = glyph_dimensions.ascent - glyph_dimensions.descent end case @ctx.text_attrs.baseline_shift when :baseline x = 0 when :sub when :super x = -x when /[-+]?(\d+)%/ m = $1 == '-' ? -1.0 : 1.0 x = (m * x * $1.to_f / 100.0) else x = -@ctx.text_attrs.baseline_shift end x end
text_rel_coords(text)
click to toggle source
# File lib/rvg/misc.rb, line 107 def text_rel_coords(text) y_rel_coords = [] x_rel_coords = [] first_word = true words = text.split(::Magick::RVG::WORD_SEP) words.each do |word| unless first_word wx, wy = get_word_spacing x_rel_coords << wx y_rel_coords << wy end first_word = false word.split('').each do |glyph| wx, wy = get_letter_spacing(glyph) x_rel_coords << wx y_rel_coords << wy end end [x_rel_coords, y_rel_coords] end