@@ -3,9 +3,12 @@ ElmRuntime.Render.Collage = function() {
3'use strict';
3'use strict';
5var Utils = ElmRuntime.use(ElmRuntime.Render.Utils);
5var Utils = ElmRuntime.use(ElmRuntime.Render.Utils);
6−var newElement = Utils.newElement, addTo = Utils.addTo, extract = Utils.extract;
6+var newElement = Utils.newElement, addTo = Utils.addTo,
7+ extract = Utils.extract, fromList = Utils.fromList,
8+ fromString = Utils.fromString;
8function trace(ctx, path) {
10function trace(ctx, path) {
11+ var points = fromList(path);
9 var i = points.length - 1;
12 var i = points.length - 1;
10 if (i <= 0) return;
13 if (i <= 0) return;
11 ctx.moveTo(points[i]._0, points[i]._1);
14 ctx.moveTo(points[i]._0, points[i]._1);
@@ -57,39 +60,47 @@ function drawLine(ctx, style, path) {
57 ctx.miterLimit = style.miterLimit;
60 ctx.miterLimit = style.miterLimit;
58 ctx.strokeStyle = extract(style.color);
61 ctx.strokeStyle = extract(style.color);
59 return line(ctx, style, path);
62 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) {
65+function texture(redo, ctx, src) {
69 var img = new Image();
66 var img = new Image();
70− img.src = JS.castStringToJSString(src);
67+ img.src = fromString(src);
71 img.onload = redo;
68 img.onload = redo;
73− tracePoints(ctx,points);
74− ctx.fillStyle = ctx.createPattern(img,'repeat');
69+ return ctx.createPattern(img, 'repeat');
78−function drawShape(redo,ctx,shapeStyle,color,points) {
72+function gradient(ctx, grad) {
79− switch(shapeStyle[0]) {
73+ var g;
80− case "Filled": return filled(ctx,color,points);
74+ if (grad.ctor === 'Linear') {
81− case "Outlined": return solid(ctx,color,points);
75+ var p1 = grad._1, p2 = grad._2;
82− case "Textured": return textured(redo,ctx,shapeStyle[1],points);
76+ g = ctx.createLinearGradient(p1._0, p1._1, p2._0, p2._1);
83− case "CustomOutline":
77+ } else {
84− return customLine(shapeStyle[1],ctx,color,points);
78+ var p1 = grad._1, p2 = grad._3;
79+ g = ctx.createRadialGradient(p1._0, p1._1, grad._2, p2._0, p2._1, grad._4);
81+ var stops = fromList(grad._0);
82+ for (var i = stops.length; i--; ) {
84+ g.addColorStop(stop._0, extract(stop._1));
89+function drawShape(redo, ctx, style, path) {
91+ var sty = style.ctor;
93+ sty === 'Solid' ? extract(style._0) :
94+ sty === 'Texture' ? texture(redo, ctx, style._0) : gradient(ctx, style._0);
88−function drawImage(redo,ctx,w,h,src) {
98+function drawImage(redo, ctx, form) {
89 var img = new Image();
99 var img = new Image();
90 img.onload = redo;
100 img.onload = redo;
91− img.src = JS.castStringToJSString(src);
101+ img.src = fromString(form._3);
102+ var w = form._0, h = form._1, pos = form._2;
92− ctx.drawImage(img,-w/2,-h/2,w,h);
103+ ctx.drawImage(img, pos._0, pos._1, w, h, -w/2, -h/2, w, h);
95function renderForm(redo,ctx,form) {
106function renderForm(redo,ctx,form) {
@@ -97,17 +108,21 @@ function renderForm(redo,ctx,form) {
97 var m = form.transform;
108 var m = form.transform;
98 ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);
109 ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);
99 ctx.beginPath();
110 ctx.beginPath();
100− switch(form.form.ctor) {
112+ switch(f.ctor) {
101− case 'FPath' : drawLine(ctx, form._0, form._1); break;
113+ case 'FPath' : drawLine(ctx, f._0, f._1); break;
115+ if (form.form._0.ctor === 'Left') drawLine(ctx, f._0._0, f._1);
102− case 'FShape': drawShape(redo, ctx, form._0, form._1); break;
116+ else drawShape(redo, ctx, f._0._0, f._1);
103− case 'FImage': drawImage(redo, ctx, form._0, form._1, form._2, form._3); break;
118+ case 'FImage': drawImage(redo, ctx, f); break;
104− case 'FGroup': renderForms(redo, ctx, form.form._0); break;
119+ case 'FGroup': renderForms(redo, ctx, f._0); break;
106 ctx.restore();
121 ctx.restore();
109function renderForms(redo, ctx, forms) {
124function renderForms(redo, ctx, forms) {
110− forms = toArray(forms);
125+ forms = fromList(forms);
111 for (var i = forms.length; i--; ) {
126 for (var i = forms.length; i--; ) {
112 renderForm(redo,ctx,forms[i]);
127 renderForm(redo,ctx,forms[i]);