Class: Magick::RVG::Utility::TextStrategy

Inherits:
Object
  • Object
show all
Defined in:
lib/rvg/misc.rb

Instance Method Summary collapse

Constructor Details

#initialize(context) ⇒ TextStrategy

Returns a new instance of TextStrategy.



71
72
73
74
# File 'lib/rvg/misc.rb', line 71

def initialize(context)
    @ctx = context
    @ctx.shadow.affine = @ctx.text_attrs.affine
end

Instance Method Details

#enquote(text) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# 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) ⇒ Object



95
96
97
98
99
100
101
102
103
104
105
# 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) ⇒ Object



151
152
153
154
155
156
157
158
159
160
161
162
# 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) ⇒ Object



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# 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) ⇒ Object



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# 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