on master help sign in
Fix basic transforms on groups
bba39f2evancz
runtime/Render/Collage.js+16−13
@@ -150,6 +150,16 @@ function renderForm(redo, ctx, form) {
150 ctx.restore();
150 ctx.restore();
151}
151}
152
152
153+function formToMatrix(form) {
154+ var scale = form.scale;
155+ var matrix = A6( Matrix.matrix, scale, 0, 0, scale, scale * form.x, scale * form.y );
156+
157+ var theta = form.theta
158+ if (theta !== 0) matrix = A2( Matrix.rotate, theta, matrix );
159+
160+ return matrix;
161+}
162+
153function makeTransform(w, h, form, matrices) {
163function makeTransform(w, h, form, matrices) {
154 var props = form.form._0.props;
164 var props = form.form._0.props;
155 var m = A6( Matrix.matrix, 1, 0, 0, 1,
165 var m = A6( Matrix.matrix, 1, 0, 0, 1,
@@ -157,14 +167,11 @@ function makeTransform(w, h, form, matrices) {
157 (h - props.height)/2 );
167 (h - props.height)/2 );
158 var len = matrices.length;
168 var len = matrices.length;
159 for (var i = 0; i < len; ++i) { m = A2( Matrix.multiply, m, matrices[i] ); }
169 for (var i = 0; i < len; ++i) { m = A2( Matrix.multiply, m, matrices[i] ); }
170+ m = A2( Matrix.multiply, m, formToMatrix(form) );
160
171
161− var x = form.x, y = form.y, theta = form.theta, scale = form.scale;
162− if (x !== 0 || y !== 0) m = A3( Matrix.move, x, y, m );
163− if (theta !== 0) m = A2( Matrix.rotate, theta, m );
164− m = A2( Matrix.scaleY, -scale, m );
165− if (scale !== 1) m = A2( Matrix.scale, scale, m);
166− return 'matrix(' + m[0] + ',' + m[3] + ',' + m[1] + ',' +
172+ return 'matrix(' + m[0] + ',' + m[3] + ',' +
173+ (-m[1]) + ',' + (-m[4]) + ',' +
167− m[4] + ',' + m[2] + ',' + m[5] + ')';
174+ m[2] + ',' + m[5] + ')';
168}
175}
169
176
170function stepperHelp(list) {
177function stepperHelp(list) {
@@ -200,14 +207,10 @@ function stepper(forms) {
200 var f = out.form;
207 var f = out.form;
201 if (f.ctor === 'FGroup') {
208 if (f.ctor === 'FGroup') {
202 ps.unshift(stepperHelp(f._1));
209 ps.unshift(stepperHelp(f._1));
203− var m = f._0;
210+ var m = A2( Matrix.multiply, f._0, formToMatrix(out));
204− matrices.push(m);
205− var x = out.x, y = out.y, theta = out.theta, scale = out.scale;
206− if (x !== 0 || y !== 0) ctx.translate(x, y);
207− if (theta !== 0) ctx.rotate(theta);
208− if (scale !== 1) ctx.scale(scale, scale);
209 ctx.save();
211 ctx.save();
210 ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);
212 ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]);
213+ matrices.push(m);
211 }
214 }
212 return out;
215 return out;
213 }
216 }