Font.js 3.1 KB
Newer Older
1 2 3 4 5
/**
 * @author zz85 / http://www.lab4games.net/zz85/blog
 * @author mrdoob / http://mrdoob.com/
 */

M
Mr.doob 已提交
6 7 8 9
import { QuadraticBezier, CubicBezier } from './Interpolations';
import { ShapePath } from './ShapePath';


M
Mr.doob 已提交
10
function Font( data ) {
11 12 13

	this.data = data;

M
Mr.doob 已提交
14
}
15

R
Rich Harris 已提交
16
Object.assign( Font.prototype, {
17

18 19
	isFont: true,

M
Mr.doob 已提交
20
	generateShapes: function ( text, size, divisions ) {
21 22 23 24 25 26 27 28 29 30 31

		function createPaths( text ) {

			var chars = String( text ).split( '' );
			var scale = size / data.resolution;
			var offset = 0;

			var paths = [];

			for ( var i = 0; i < chars.length; i ++ ) {

M
Mr.doob 已提交
32
				var ret = createPath( chars[ i ], scale, offset );
33 34 35 36 37 38 39 40 41 42
				offset += ret.offset;

				paths.push( ret.path );

			}

			return paths;

		}

M
Mr.doob 已提交
43
		function createPath( c, scale, offset ) {
44

M
Mr.doob 已提交
45
			var glyph = data.glyphs[ c ] || data.glyphs[ '?' ];
46 47 48

			if ( ! glyph ) return;

R
Rich Harris 已提交
49
			var path = new ShapePath();
50

51
			var pts = [];
M
Mr.doob 已提交
52
			var x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste;
53

M
Mr.doob 已提交
54
			if ( glyph.o ) {
55

M
Mr.doob 已提交
56
				var outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );
57

M
Mr.doob 已提交
58
				for ( var i = 0, l = outline.length; i < l; ) {
59

M
Mr.doob 已提交
60
					var action = outline[ i ++ ];
61 62 63

					switch ( action ) {

M
Mr.doob 已提交
64
						case 'm': // moveTo
65

M
Mr.doob 已提交
66 67
							x = outline[ i ++ ] * scale + offset;
							y = outline[ i ++ ] * scale;
68

M
Mr.doob 已提交
69
							path.moveTo( x, y );
70

M
Mr.doob 已提交
71
							break;
72

M
Mr.doob 已提交
73
						case 'l': // lineTo
74

M
Mr.doob 已提交
75 76
							x = outline[ i ++ ] * scale + offset;
							y = outline[ i ++ ] * scale;
77

M
Mr.doob 已提交
78
							path.lineTo( x, y );
79

M
Mr.doob 已提交
80
							break;
81

M
Mr.doob 已提交
82
						case 'q': // quadraticCurveTo
83

M
Mr.doob 已提交
84 85 86 87
							cpx  = outline[ i ++ ] * scale + offset;
							cpy  = outline[ i ++ ] * scale;
							cpx1 = outline[ i ++ ] * scale + offset;
							cpy1 = outline[ i ++ ] * scale;
88

M
Mr.doob 已提交
89
							path.quadraticCurveTo( cpx1, cpy1, cpx, cpy );
90

M
Mr.doob 已提交
91
							laste = pts[ pts.length - 1 ];
92

M
Mr.doob 已提交
93
							if ( laste ) {
94

M
Mr.doob 已提交
95 96
								cpx0 = laste.x;
								cpy0 = laste.y;
97

M
Mr.doob 已提交
98
								for ( var i2 = 1; i2 <= divisions; i2 ++ ) {
99

M
Mr.doob 已提交
100
									var t = i2 / divisions;
M
Mr.doob 已提交
101 102
									QuadraticBezier( t, cpx0, cpx1, cpx );
									QuadraticBezier( t, cpy0, cpy1, cpy );
103

M
Mr.doob 已提交
104
								}
105

M
Mr.doob 已提交
106
							}
107

M
Mr.doob 已提交
108
							break;
109

M
Mr.doob 已提交
110
						case 'b': // bezierCurveTo
111

M
Mr.doob 已提交
112 113 114 115 116 117
							cpx  = outline[ i ++ ] * scale + offset;
							cpy  = outline[ i ++ ] * scale;
							cpx1 = outline[ i ++ ] * scale + offset;
							cpy1 = outline[ i ++ ] * scale;
							cpx2 = outline[ i ++ ] * scale + offset;
							cpy2 = outline[ i ++ ] * scale;
118

M
Mr.doob 已提交
119
							path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );
120

M
Mr.doob 已提交
121
							laste = pts[ pts.length - 1 ];
122

M
Mr.doob 已提交
123
							if ( laste ) {
124

M
Mr.doob 已提交
125 126
								cpx0 = laste.x;
								cpy0 = laste.y;
127

M
Mr.doob 已提交
128
								for ( var i2 = 1; i2 <= divisions; i2 ++ ) {
129

M
Mr.doob 已提交
130
									var t = i2 / divisions;
M
Mr.doob 已提交
131 132
									CubicBezier( t, cpx0, cpx1, cpx2, cpx );
									CubicBezier( t, cpy0, cpy1, cpy2, cpy );
133

M
Mr.doob 已提交
134
								}
135 136 137

							}

M
Mr.doob 已提交
138
							break;
139 140 141 142 143 144 145 146 147 148 149 150 151 152

					}

				}

			}

			return { offset: glyph.ha * scale, path: path };

		}

		//

		if ( size === undefined ) size = 100;
M
Mr.doob 已提交
153
		if ( divisions === undefined ) divisions = 4;
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169

		var data = this.data;

		var paths = createPaths( text );
		var shapes = [];

		for ( var p = 0, pl = paths.length; p < pl; p ++ ) {

			Array.prototype.push.apply( shapes, paths[ p ].toShapes() );

		}

		return shapes;

	}

170
} );
R
Rich Harris 已提交
171 172


173
export { Font };