Skip to content

Instantly share code, notes, and snippets.

@m1el
Last active August 29, 2015 14:20
Show Gist options
  • Save m1el/833f4fa23baeefed7a60 to your computer and use it in GitHub Desktop.
Save m1el/833f4fa23baeefed7a60 to your computer and use it in GitHub Desktop.
// License=WTFPLv2
function exportStrokes(glyph) {
var glArr = strokesToGlArray(glyph),
r = [];
for (var i = 0; i*4 < glArr.length; i ++) {
r.push('glyph[' + i + '] = vec4('
+ glArr.slice(i*4,i*4+4).join(',') + ');');
}
return r.join('\n');
}
function strokeToMatrix(sk) {
var d = Vec.sub(sk.control,sk.center),
dsq = Vec.dot(d,d);
if (dsq < 1E-6) {
return [[0,0,0], [0,0,0], [0,0,0]];
}
var tmatrix = Matrix.inv3([
[d[0], d[1], 0],
[-d[1], d[0], 0],
[sk.center[0], sk.center[1], 1]]),
tdet = Matrix.det3(tmatrix);
var pmatrix, result,
mul = sk.zscale;
switch (sk.type) {
case 'ellipse':
pmatrix = [
[1,0,0],
[0,1/sk.ratio,0],
[0,0,-1]];
mul /= Math.sqrt(tdet);
break;
case 'parabola':
pmatrix = [
[0, 0, sk.ratio*2],
[0, -1, 0],
[sk.ratio*2, 0, 0]];
mul /= Math.sqrt(tdet);
break;
case 'hyperbola':
var asq = sk.ratio*sk.ratio;
pmatrix = [
[asq, 0, 0],
[0, asq-1, 0],
[0, 0, -1]];
mul /= tdet;
break;
case 'band':
pmatrix = [
[1, 0, 0],
[0, 0, 0],
[0, 0, -1]];
mul /= Math.sqrt(tdet);
break;
case 'halfplane':
pmatrix = [
[0, 0, 0.5],
[0, 0, 0],
[0.5, 0, 0]];
break;
}
result = Matrix.mul(Matrix.mul(tmatrix, pmatrix),
Matrix.transpose(tmatrix));
return Matrix.smul(result, mul);
}
function strokesToGlArray(strokes, fillCount) {
var result = [];
for (var i = 0; i < strokes.length; i++) {
var mat = strokeToMatrix(strokes[i]);
result.push(mat[0][0]);
result.push(mat[1][1]);
result.push(mat[2][2]);
result.push(mat[0][1]);
result.push(mat[0][2]);
result.push(mat[1][2]);
result.push(!!strokes[i].or | (!!strokes[i].flush << 1));
result.push(0);
}
for (; i < fillCount; i++) {
for (var j = 0; j < 8; j++) {
result.push(0);
}
}
return result;
}
var Vec = {
add: function(a,b) {
var result = [];
for (var i = 0; i < a.length; i++) {
result.push(a[i]+b[i]);
}
return result;
},
sub: function(a,b) {
var result = [];
for (var i = 0; i < a.length; i++) {
result.push(a[i]-b[i]);
}
return result;
},
dot: function(a,b) {
var result = 0;
for (var i = 0; i < a.length; i++) {
result += a[i]*b[i];
}
return result;
},
mul: function(a, m) {
var result = [];
for (var i = 0; i < a.length; i++) {
result.push(a[i]*m);
}
return result;
},
};
var Matrix = {
smul: function(a, s) {
var result = [];
for (var i = 0; i < a.length; i++) {
result[i] = [];
for (var j = 0; j < a[i].length; j++) {
result[i][j] = a[i][j] * s;
}
}
return result;
},
mul: function(a, b) {
var widthA = a[0].length,
widthB = b[0].length;
if (widthA != b.length) {
throw "cant haz multiply different matrices";
}
var result = [];
for (var i = 0; i < a.length; i++) {
result[i] = [];
for (var j = 0; j < widthB; j++) {
var sum = 0;
for (var k = 0; k < widthA; k++) {
sum += a[i][k] * b[k][j];
}
result[i][j] = sum;
}
}
return result;
},
transpose: function(a) {
var result = [];
var width = a[0].length
for (var i = 0; i < width; i++) {
result[i] = [];
for (var j = 0; j < a.length; j++) {
result[i][j] = a[j][i];
}
}
return result;
},
det3: function(a) {
return a[0][2]*(a[1][0]*a[2][1]-a[1][1]*a[2][0])
+ a[0][1]*(a[1][2]*a[2][0]-a[1][0]*a[2][2])
+ a[0][0]*(a[1][1]*a[2][2]-a[1][2]*a[2][1]);
},
inv3: function(a) {
var det = Matrix.det3(a);
if (Math.abs(det) < 1E-6) {
throw 'no can inverse zero det matrix';
}
// eeh, who needs loops anyway?
return Matrix.smul([
[a[1][1]*a[2][2]-a[1][2]*a[2][1],a[0][2]*a[2][1]-a[0][1]*a[2][2],a[0][1]*a[1][2]-a[0][2]*a[1][1]],
[a[1][2]*a[2][0]-a[1][0]*a[2][2],a[0][0]*a[2][2]-a[0][2]*a[2][0],a[0][2]*a[1][0]-a[0][0]*a[1][2]],
[a[1][0]*a[2][1]-a[1][1]*a[2][0],a[0][1]*a[2][0]-a[0][0]*a[2][1],a[0][0]*a[1][1]-a[0][1]*a[1][0]]]
, 1/det);
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment