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.



82
83
84
85
# File 'lib/rvg/misc.rb', line 82

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

Instance Method Details

#enquote(text) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/rvg/misc.rb', line 87

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 }
    return '{' +  text + '}'
end

#glyph_metrics(glyph_orientation, glyph) ⇒ Object



106
107
108
109
110
111
112
113
114
115
# File 'lib/rvg/misc.rb', line 106

def glyph_metrics(glyph_orientation, glyph)
    glyph_metrics = @ctx.shadow.get_type_metrics(glyph)
    h = glyph_metrics.ascent - glyph_metrics.descent
    w = glyph_metrics.width
    if glyph_orientation == 0 || glyph_orientation == 180
        [w, h]
    else
        [h, w]
    end
end

#render_glyph(glyph_orientation, x, y, glyph) ⇒ Object



161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/rvg/misc.rb', line 161

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



138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/rvg/misc.rb', line 138

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
    return x
end

#text_rel_coords(text) ⇒ Object



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/rvg/misc.rb', line 117

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