@@ -15,8 +15,8 @@ function trace(ctx, path) {
1515 ctx.moveTo(points[i]._0, points[i]._1);
1616 while (i--) { ctx.lineTo(points[i]._0, points[i]._1); }
1717 if (path.closed) {
18− i = points.length - 1;
19− ctx.lineTo(points[i]._0, points[i]._1);
18+ i = points.length - 1;
19+ ctx.lineTo(points[i]._0, points[i]._1);
2020 }
2121}
2222
@@ -37,26 +37,26 @@ function customLineHelp(ctx, style, path) {
3737 var draw = true, segmentLength = pattern[0];
3838 ctx.moveTo(x0,y0);
3939 while (i--) {
40− x1 = points[i]._0; y1 = points[i]._1;
41− dx = x1 - x0; dy = y1 - y0;
42− remaining = Math.sqrt(dx * dx + dy * dy);
43− while (segmentLength <= remaining) {
44− x0 += dx * segmentLength / remaining;
45− y0 += dy * segmentLength / remaining;
46− ctx[draw ? 'lineTo' : 'moveTo'](x0, y0);
47− // update starting position
40+ x1 = points[i]._0; y1 = points[i]._1;
4841 dx = x1 - x0; dy = y1 - y0;
4942 remaining = Math.sqrt(dx * dx + dy * dy);
50− // update pattern
51− draw = !draw;
52− pindex = (pindex + 1) % plen;
53− segmentLength = pattern[pindex];
54− }
55− if (remaining > 0) {
56− ctx[draw ? 'lineTo' : 'moveTo'](x1, y1);
57− segmentLength -= remaining;
58− }
59− x0 = x1; y0 = y1;
43+ while (segmentLength <= remaining) {
44+ x0 += dx * segmentLength / remaining;
45+ y0 += dy * segmentLength / remaining;
46+ ctx[draw ? 'lineTo' : 'moveTo'](x0, y0);
47+ // update starting position
48+ dx = x1 - x0; dy = y1 - y0;
49+ remaining = Math.sqrt(dx * dx + dy * dy);
50+ // update pattern
51+ draw = !draw;
52+ pindex = (pindex + 1) % plen;
53+ segmentLength = pattern[pindex];
54+ }
55+ if (remaining > 0) {
56+ ctx[draw ? 'lineTo' : 'moveTo'](x1, y1);
57+ segmentLength -= remaining;
58+ }
59+ x0 = x1; y0 = y1;
6060 }
6161}
6262
@@ -108,8 +108,19 @@ function drawImage(redo, ctx, form) {
108108 var img = new Image();
109109 img.onload = redo;
110110 img.src = fromString(form._3);
111− var w = form._0, h = form._1, pos = form._2;
112− ctx.drawImage(img, pos._0, pos._1, w, h, -w/2, -h/2, w, h);
111+ var w = form._0,
112+ h = form._1,
113+ pos = form._2,
114+ srcX = pos._0,
115+ srcY = pos._1,
116+ srcW = w,
117+ srcH = h,
118+ destX = -w/2,
119+ destY = -h/2,
120+ destW = w,
121+ destH = h;
122+
123+ ctx.drawImage(img, srcX, srcY, srcW, srcH, destX, destY, destW, destH);
113124}
114125
115126function renderForm(stack, redo, ctx, form) {
@@ -121,25 +132,25 @@ function renderForm(stack, redo, ctx, form) {
121132 ctx.beginPath();
122133 var f = form.form;
123134 switch(f.ctor) {
124− case 'FPath' : drawLine(ctx, f._0, f._1); break;
125− case 'FShape':
126− if (f._0.ctor === 'Left') {
127− f._1.closed = true;
128− drawLine(ctx, f._0._0, f._1);
129− } else {
130− drawShape(redo, ctx, f._0._0, f._1);
131− }
132− break;
133− case 'FImage': drawImage(redo, ctx, f); break;
134− case 'FGroup':
135− ctx.save();
136− var m = f._0;
137− // stack.push(makeTransform(x, y, theta, scale, m));
138− ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);
139− renderForms(stack, redo, ctx, f._1);
140− // stack.pop();
141− ctx.restore();
142− break;
135+ case 'FPath' : drawLine(ctx, f._0, f._1); break;
136+ case 'FShape':
137+ if (f._0.ctor === 'Left') {
138+ f._1.closed = true;
139+ drawLine(ctx, f._0._0, f._1);
140+ } else {
141+ drawShape(redo, ctx, f._0._0, f._1);
142+ }
143+ break;
144+ case 'FImage': drawImage(redo, ctx, f); break;
145+ case 'FGroup':
146+ ctx.save();
147+ var m = f._0;
148+ // stack.push(makeTransform(x, y, theta, scale, m));
149+ ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);
150+ renderForms(stack, redo, ctx, f._1);
151+ // stack.pop();
152+ ctx.restore();
153+ break;
143154 }
144155 ctx.restore();
145156}
@@ -156,7 +167,7 @@ function makeTransform(x, y, theta, scale, matrix) {
156167function renderForms(stack, redo, ctx, forms) {
157168 var fs = fromList(forms);
158169 for (var i = 0, len = fs.length; i < len; ++i) {
159− renderForm(stack, redo, ctx, fs[i]);
170+ renderForm(stack, redo, ctx, fs[i]);
160171 }
161172}
162173