class Magick::RVG::Utility::TextStrategy
def enquote(text)
def enquote(text) return text if text.length > 2 && /\A(?:"[^\"]+"|'[^\']+'|\{[^\}]+\})\z/.match(text) if !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
def glyph_metrics(glyph_orientation, glyph)
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.zero? || glyph_orientation == 180 [w, h] else [h, w] end end
def initialize(context)
def initialize(context) @ctx = context @ctx.shadow.affine = @ctx.text_attrs.affine end
def render_glyph(glyph_orientation, x, y, glyph)
def render_glyph(glyph_orientation, x, y, glyph) if glyph_orientation.zero? @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
def shift_baseline(glyph_orientation, glyph)
def shift_baseline(glyph_orientation, glyph) glyph_dimensions = @ctx.shadow.get_type_metrics(glyph) x = if glyph_orientation.zero? || glyph_orientation == 180 glyph_dimensions.width else 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 = Regexp.last_match(1) == '-' ? -1.0 : 1.0 x = (m * x * Regexp.last_match(1).to_f / 100.0) else x = -@ctx.text_attrs.baseline_shift end x end
def text_rel_coords(text)
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.chars.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