-
Notifications
You must be signed in to change notification settings - Fork 7
/
ART.Text.js
79 lines (66 loc) · 1.99 KB
/
ART.Text.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
Script: ART.Font.js
License:
MIT-style license.
*/
// ==========================================
// This file implements code from Cufón
// http://wiki.github.com/sorccu/cufon/about
// http://cufon.shoqolate.com/
// MIT License
// ==========================================
ART.Font = new Class({
initialize: function(font){
this.ascent = font.face.ascent;
this.units = font.face['units-per-em'];
this.glyphs = font.glyphs;
this.width = font.w;
},
measure: function(size, text){
var width = 0, height = size;
size = size / this.units;
Array.each(text, function(t){
var glyph = this.glyphs[t] || this.glyphs[' '];
width += size * (glyph.w || this.width);
}, this);
return {x: width, y: size * this.ascent};
}
});
ART.Paint.defineFont = function(name, font){
ART.Font[name.camelCase()] = new ART.Font(font);
return this;
};
ART.Paint.lookupFont = function(name, font){
return ART.Font[name.camelCase()];
};
(function(){
var renderGlyph = function(ctx, s, glyph){
var regexp = /([mrvxe])([^a-z]*)/g, match;
for (var i = 0; match = regexp.exec(glyph); i++){
var c = match[2].split(',');
switch (match[1]){
case 'v': ctx.bezierBy({x: s * ~~c[0], y: s * ~~c[1]}, {x: s * ~~c[2], y: s * ~~c[3]}, {x: s * ~~c[4], y: s * ~~c[5]}); break;
case 'r': ctx.lineBy({x: s * ~~c[0], y: s * ~~c[1]}); break;
case 'm': ctx.moveTo({x: s * ~~c[0], y: s * ~~c[1]}); break;
case 'x': ctx.join(); break;
case 'e': return;
}
}
};
ART.Paint.implement('text', function(font, size, text){
if (typeof font == 'string') font = ART.Paint.lookupFont(font);
if (!font) return this;
this.save();
var width = 0;
size = size / font.units;
this.shift({x: 0, y: Math.round(size * font.ascent)});
Array.each(text, function(t){
var glyph = font.glyphs[t] || font.glyphs[' '];
if (glyph.d) renderGlyph(this, size, 'm' + glyph.d);
var w = size * (glyph.w || font.width);
width += w;
this.shift({x: w, y: 0});
}, this);
return this.restore();
});
})();