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