@@ -1,45 +1,24 @@
2−ElmRuntime.Render.Collage = function(rts) {
2+ElmRuntime.Render.Collage = function() {
4−var JS = Elm.JavaScript;
5+var Utils = ElmRuntime.use(ElmRuntime.Render.Utils);
6+var newElement = Utils.newElement, addTo = Utils.addTo, extract = Utils.extract;
6−function tracePoints(ctx,points) {
8+function trace(ctx, path) {
7 var i = points.length - 1;
9 var i = points.length - 1;
8 if (i <= 0) return;
10 if (i <= 0) return;
9− ctx.moveTo(points[i][1], points[i][2]);
11+ ctx.moveTo(points[i]._0, points[i]._1);
10− while (i--) { ctx.lineTo(points[i][1], points[i][2]); }
12+ while (i--) { ctx.lineTo(points[i]._0, points[i]._1); }
13−function solid(ctx,color,points) {
15+function line(ctx,style,path) {
14− tracePoints(ctx,points);
16+ var isSolid = style.dashing.ctor === 'Nil';
15− ctx.strokeStyle = Elm.Color.extract(color);
17+ isSolid ? trace(ctx, path) : customLineHelp(ctx, style, path);
16 ctx.stroke();
18 ctx.stroke();
19−function filled(ctx,color,points) {
20− tracePoints(ctx,points);
21− ctx.fillStyle = Elm.Color.extract(color);
25−function textured(redo,ctx,src,points) {
26− var img = new Image();
27− img.src = JS.castStringToJSString(src);
30− tracePoints(ctx,points);
31− ctx.fillStyle = ctx.createPattern(img,'repeat');
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);
42−var customLineHelp = function(ctx, pattern, points) {
21+function customLineHelp(ctx, pattern, points) {
43 var i = points.length - 1;
22 var i = points.length - 1;
44 if (i <= 0) return;
23 if (i <= 0) return;
45 var x0 = points[i][1], y0 = points[i][2];
24 var x0 = points[i][1], y0 = points[i][2];
@@ -69,17 +48,32 @@ var customLineHelp = function(ctx, pattern, points) {
70 x0 = x1; y0 = y1;
49 x0 = x1; y0 = y1;
74−function drawLine(ctx,form) {
53+function drawLine(ctx, style, path) {
75− var points = form[3][1];
54+ ctx.lineWidth = style.width;
76− switch(form[1][0]) {
55+ ctx.lineCap = style.cap.ctor.toLowerCase();
77− case "Solid" : return solid(ctx,form[2],points);
56+ ctx.lineJoin = style.join.ctor.toLowerCase();
78− case "Dotted": return customLine([3,3],ctx,form[2],points);
57+ ctx.miterLimit = style.miterLimit;
79− case "Dashed": return customLine([8,4],ctx,form[2],points);
58+ ctx.strokeStyle = extract(style.color);
80− case "Custom": return customLine(form[1][1],ctx,form[2],points);
59+ return line(ctx, style, path);
62+function filled(ctx,color,points) {
63+ tracePoints(ctx,points);
64+ ctx.fillStyle = extract(color);
68+function textured(redo,ctx,src,points) {
69+ var img = new Image();
70+ img.src = JS.castStringToJSString(src);
73+ tracePoints(ctx,points);
74+ ctx.fillStyle = ctx.createPattern(img,'repeat');
84function drawShape(redo,ctx,shapeStyle,color,points) {
78function drawShape(redo,ctx,shapeStyle,color,points) {
85 switch(shapeStyle[0]) {
79 switch(shapeStyle[0]) {
@@ -98,25 +92,24 @@ function drawImage(redo,ctx,w,h,src) {
98 ctx.drawImage(img,-w/2,-h/2,w,h);
92 ctx.drawImage(img,-w/2,-h/2,w,h);
101−function renderForm(redo,ctx,theta,scale,x,y,form) {
95+function renderForm(redo,ctx,form) {
102 ctx.save();
96 ctx.save();
103− if (x !== 0 || y !== 0) ctx.translate(x,y);
97+ var m = form.transform;
104− if (theta !== ~~theta) ctx.rotate(2*Math.PI*theta);
98+ ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);
105− if (scale !== 1) ctx.scale(scale,scale);
106 ctx.beginPath();
99 ctx.beginPath();
107− switch(form[0]) {
100+ switch(form.form.ctor) {
108− case "FLine": drawLine(ctx,form); break;
101+ case 'FPath' : drawLine(ctx, form._0, form._1); break;
109− case "FShape": drawShape(redo,ctx,form[1],form[2],form[3][1]); break;
102+ case 'FShape': drawShape(redo, ctx, form._0, form._1); break;
110− case "FImage": drawImage(redo,ctx,form[1],form[2],form[3]); 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;
112 ctx.restore();
106 ctx.restore();
115−function renderForms(redo,ctx,w,h,forms) {
109+function renderForms(redo, ctx, forms) {
116− ctx.clearRect(0,0,w,h);
110+ forms = toArray(forms);
117 for (var i = forms.length; i--; ) {
111 for (var i = forms.length; i--; ) {
119− renderForm(redo,ctx,f[1],f[2],f[3][1],f[3][2],f[4]);
112+ renderForm(redo,ctx,forms[i]);
@@ -313,5 +306,5 @@ function insideShape(point,theta,scale,pos,points) {
315return {collage:collage, updateCollage:updateCollage, insideForm:insideForm};
308return {collage:collage, updateCollage:updateCollage, insideForm:insideForm};