@@ -1,45 +1,24 @@
11
2−ElmRuntime.Render.Collage = function(rts) {
3− /*
4−var JS = Elm.JavaScript;
2+ElmRuntime.Render.Collage = function() {
3+'use strict';
54
6−function tracePoints(ctx,points) {
5+var Utils = ElmRuntime.use(ElmRuntime.Render.Utils);
6+var newElement = Utils.newElement, addTo = Utils.addTo, extract = Utils.extract;
7+
8+function trace(ctx, path) {
79 var i = points.length - 1;
810 if (i <= 0) return;
9− ctx.moveTo(points[i][1], points[i][2]);
10− while (i--) { ctx.lineTo(points[i][1], points[i][2]); }
11+ ctx.moveTo(points[i]._0, points[i]._1);
12+ while (i--) { ctx.lineTo(points[i]._0, points[i]._1); }
1113}
1214
13−function solid(ctx,color,points) {
14− tracePoints(ctx,points);
15− ctx.strokeStyle = Elm.Color.extract(color);
15+function line(ctx,style,path) {
16+ var isSolid = style.dashing.ctor === 'Nil';
17+ isSolid ? trace(ctx, path) : customLineHelp(ctx, style, path);
1618 ctx.stroke();
17−};
18−
19−function filled(ctx,color,points) {
20− tracePoints(ctx,points);
21− ctx.fillStyle = Elm.Color.extract(color);
22− ctx.fill();
2319}
2420
25−function textured(redo,ctx,src,points) {
26− var img = new Image();
27− img.src = JS.castStringToJSString(src);
28− img.onload = redo;
29−
30− tracePoints(ctx,points);
31− ctx.fillStyle = ctx.createPattern(img,'repeat');
32− ctx.fill();
33−}
34−
35−function customLine(pattern,ctx,color,points) {
36− if (pattern.length === 0) { pattern = [8,4]; }
37− customLineHelp(ctx, pattern, points);
38− ctx.strokeStyle = Elm.Color.extract(color);
39− ctx.stroke();
40−};
41−
42−var customLineHelp = function(ctx, pattern, points) {
21+function customLineHelp(ctx, pattern, points) {
4322 var i = points.length - 1;
4423 if (i <= 0) return;
4524 var x0 = points[i][1], y0 = points[i][2];
@@ -69,17 +48,32 @@ var customLineHelp = function(ctx, pattern, points) {
6948 }
7049 x0 = x1; y0 = y1;
7150 }
72−};
51+}
7352
74−function drawLine(ctx,form) {
75− var points = form[3][1];
76− switch(form[1][0]) {
77− case "Solid" : return solid(ctx,form[2],points);
78− case "Dotted": return customLine([3,3],ctx,form[2],points);
79− case "Dashed": return customLine([8,4],ctx,form[2],points);
80− case "Custom": return customLine(form[1][1],ctx,form[2],points);
81− }
82−};
53+function drawLine(ctx, style, path) {
54+ ctx.lineWidth = style.width;
55+ ctx.lineCap = style.cap.ctor.toLowerCase();
56+ ctx.lineJoin = style.join.ctor.toLowerCase();
57+ ctx.miterLimit = style.miterLimit;
58+ ctx.strokeStyle = extract(style.color);
59+ return line(ctx, style, path);
60+}
61+
62+function filled(ctx,color,points) {
63+ tracePoints(ctx,points);
64+ ctx.fillStyle = extract(color);
65+ ctx.fill();
66+}
67+
68+function textured(redo,ctx,src,points) {
69+ var img = new Image();
70+ img.src = JS.castStringToJSString(src);
71+ img.onload = redo;
72+
73+ tracePoints(ctx,points);
74+ ctx.fillStyle = ctx.createPattern(img,'repeat');
75+ ctx.fill();
76+}
8377
8478function drawShape(redo,ctx,shapeStyle,color,points) {
8579 switch(shapeStyle[0]) {
@@ -98,25 +92,24 @@ function drawImage(redo,ctx,w,h,src) {
9892 ctx.drawImage(img,-w/2,-h/2,w,h);
9993}
10094
101−function renderForm(redo,ctx,theta,scale,x,y,form) {
95+function renderForm(redo,ctx,form) {
10296 ctx.save();
103− if (x !== 0 || y !== 0) ctx.translate(x,y);
104− if (theta !== ~~theta) ctx.rotate(2*Math.PI*theta);
105− if (scale !== 1) ctx.scale(scale,scale);
97+ var m = form.transform;
98+ ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);
10699 ctx.beginPath();
107− switch(form[0]) {
108− case "FLine": drawLine(ctx,form); break;
109− case "FShape": drawShape(redo,ctx,form[1],form[2],form[3][1]); break;
110− case "FImage": drawImage(redo,ctx,form[1],form[2],form[3]); break;
100+ switch(form.form.ctor) {
101+ case 'FPath' : drawLine(ctx, form._0, form._1); break;
102+ case 'FShape': drawShape(redo, ctx, form._0, form._1); break;
103+ case 'FImage': drawImage(redo, ctx, form._0, form._1, form._2, form._3); break;
104+ case 'FGroup': renderForms(redo, ctx, form.form._0); break;
111105 }
112106 ctx.restore();
113−};
107+}
114108
115−function renderForms(redo,ctx,w,h,forms) {
116− ctx.clearRect(0,0,w,h);
109+function renderForms(redo, ctx, forms) {
110+ forms = toArray(forms);
117111 for (var i = forms.length; i--; ) {
118− var f = forms[i];
119− renderForm(redo,ctx,f[1],f[2],f[3][1],f[3][2],f[4]);
112+ renderForm(redo,ctx,forms[i]);
120113 }
121114}
122115
@@ -313,5 +306,5 @@ function insideShape(point,theta,scale,pos,points) {
313306}
314307
315308return {collage:collage, updateCollage:updateCollage, insideForm:insideForm};
316− */
309+
317310};