mirror of
https://github.com/scratchfoundation/paper.js.git
synced 2025-01-01 02:38:43 -05:00
f84199c83d
When a group had `applyMatrix` set to `false`, when its parent's matrix was applied, its matrix was applied to its children then it was reset. This makes sure that in this case, parent matrix is only added to child matrix but not applied to child's children and that child's matrix is not reset. Closes #1711
201 lines
6.3 KiB
JavaScript
201 lines
6.3 KiB
JavaScript
/*
|
|
* Paper.js - The Swiss Army Knife of Vector Graphics Scripting.
|
|
* http://paperjs.org/
|
|
*
|
|
* Copyright (c) 2011 - 2019, Juerg Lehni & Jonathan Puckey
|
|
* http://scratchdisk.com/ & https://puckey.studio/
|
|
*
|
|
* Distributed under the MIT license. See LICENSE file for details.
|
|
*
|
|
* All rights reserved.
|
|
*/
|
|
|
|
QUnit.module('Group');
|
|
|
|
test('new Group()', function() {
|
|
var group = new Group();
|
|
equals(function() {
|
|
return paper.project.activeLayer.children[0] == group;
|
|
}, true);
|
|
});
|
|
|
|
test('new Group([])', function() {
|
|
var group = new Group([]);
|
|
equals(function() {
|
|
return paper.project.activeLayer.children[0] == group;
|
|
}, true);
|
|
equals(function() {
|
|
return group.children.length;
|
|
}, 0);
|
|
});
|
|
|
|
test('new Group([item])', function() {
|
|
var path = new Path();
|
|
var group = new Group([path]);
|
|
equals(function() {
|
|
return paper.project.activeLayer.children.length;
|
|
}, 1);
|
|
equals(function() {
|
|
return group.children[0] == path;
|
|
}, true);
|
|
});
|
|
|
|
test('new Group({children:[item]})', function() {
|
|
var path = new Path();
|
|
var group = new Group({
|
|
children: [path]
|
|
});
|
|
equals(function() {
|
|
return paper.project.activeLayer.children.length;
|
|
}, 1);
|
|
equals(function() {
|
|
return path.parent == group;
|
|
}, true);
|
|
equals(function() {
|
|
return group.children[0] == path;
|
|
}, true);
|
|
});
|
|
|
|
test('Group bounds', function() {
|
|
paper.project.currentStyle = {
|
|
strokeWidth: 5,
|
|
strokeColor: 'black'
|
|
};
|
|
|
|
var path = new Path.Circle([150, 150], 60);
|
|
var secondPath = new Path.Circle([175, 175], 85);
|
|
var group = new Group([path, secondPath]);
|
|
equals(group.bounds, new Rectangle(90, 90, 170, 170), 'group.bounds');
|
|
equals(group.strokeBounds, new Rectangle(87.5, 87.5, 175, 175), 'group.strokeBounds');
|
|
|
|
group.rotate(20);
|
|
equals(group.bounds, new Rectangle(89.97687, 82.94085, 170.04627, 177.08228), 'rotated group.bounds');
|
|
equals(group.strokeBounds, new Rectangle(87.47687, 80.44085, 175.04627, 182.08228), 'rotated group.strokeBounds');
|
|
group.rotate(20, new Point(50, 50));
|
|
equals(group.bounds, new Rectangle(39.70708, 114.9919, 170.00396, 180.22418), 'rotated group.bounds');
|
|
equals(group.strokeBounds, new Rectangle(37.20708, 112.4919, 175.00396, 185.22418), 'rotated group.strokeBounds');
|
|
});
|
|
|
|
test('group.addChildren(otherGroup.children)', function() {
|
|
var group = new Group();
|
|
group.addChild(new Path());
|
|
group.addChild(new Path());
|
|
equals(function() {
|
|
return group.children.length;
|
|
}, 2);
|
|
|
|
var secondGroup = new Group();
|
|
secondGroup.addChildren(group.children);
|
|
equals(function() {
|
|
return secondGroup.children.length;
|
|
}, 2);
|
|
equals(function() {
|
|
return group.children.length;
|
|
}, 0);
|
|
});
|
|
|
|
test('group.insertChildren(0, otherGroup.children)', function() {
|
|
var group = new Group();
|
|
group.addChild(new Path());
|
|
group.addChild(new Path());
|
|
equals(function() {
|
|
return group.children.length;
|
|
}, 2);
|
|
|
|
var secondGroup = new Group();
|
|
secondGroup.insertChildren(0, group.children);
|
|
equals(function() {
|
|
return secondGroup.children.length;
|
|
}, 2);
|
|
equals(function() {
|
|
return group.children.length;
|
|
}, 0);
|
|
});
|
|
|
|
test('group.addChildren()', function() {
|
|
var group = new Group();
|
|
var path1 = new Path();
|
|
var path2 = new Path();
|
|
var children = [path1, path2];
|
|
group.addChildren(children);
|
|
equals(group.children.length, 2,
|
|
'group.children.length after adding 2 children');
|
|
group.removeChildren();
|
|
equals(group.children.length, 0,
|
|
'group.children.length after removing all children');
|
|
children.splice(1, 0, null);
|
|
equals(children.length, 3,
|
|
'children array length after inserting null at index 1');
|
|
group.addChildren(children);
|
|
equals(group.children.length, 2,
|
|
'calling group.addChildren() with an array with 3 entries, ' +
|
|
'of which 2 are valid, group.children.length should be 2');
|
|
children = [path1, path1, path2];
|
|
group.addChildren(children);
|
|
equals(group.children.length, 2,
|
|
'adding the same item twice should only add it once.');
|
|
});
|
|
|
|
test('group.setSelectedColor() with selected bound and position', function() {
|
|
// Working: Set selected color first then add child.
|
|
var group1 = new Group();
|
|
group1.bounds.selected = true;
|
|
group1.position.selected = true;
|
|
group1.selectedColor = 'black';
|
|
group1.addChild(new Path.Circle([50, 50], 40));
|
|
// Failing: Add child first then set selected color.
|
|
var group2 = new Group();
|
|
group2.bounds.selected = true;
|
|
group2.position.selected = true;
|
|
group2.addChild(new Path.Circle([50, 50], 40));
|
|
group2.selectedColor = 'black';
|
|
comparePixels(group1, group2);
|
|
});
|
|
|
|
test('Group#isEmpty(recursively)', function() {
|
|
var group = new Group();
|
|
equals(true, group.isEmpty());
|
|
equals(true, group.isEmpty(true));
|
|
var group = new Group(new Group());
|
|
equals(false, group.isEmpty());
|
|
equals(true, group.isEmpty(true));
|
|
var group = new Group(new Path());
|
|
equals(false, group.isEmpty());
|
|
equals(true, group.isEmpty(true));
|
|
var group = new Group(new PointText());
|
|
equals(false, group.isEmpty());
|
|
equals(true, group.isEmpty(true));
|
|
});
|
|
|
|
test(
|
|
'group.internalBounds with clip item without clip.applyMatrix = false',
|
|
function() {
|
|
var point = new Point(100, 100);
|
|
var translation = new Point(100, 100);
|
|
var item = new Path.Circle({
|
|
center: point,
|
|
radius: 50,
|
|
fillColor: 'orange'
|
|
});
|
|
var clip = new Path.Rectangle({
|
|
from: point.subtract(translation),
|
|
to: point.add(translation)
|
|
});
|
|
clip.applyMatrix = false;
|
|
clip.translate(translation);
|
|
var group = new Group(clip, item);
|
|
group.clipped = true;
|
|
var expected = new Rectangle(point, point.add(translation.multiply(2)));
|
|
equals(group.internalBounds, expected);
|
|
}
|
|
);
|
|
|
|
test('group.matrix with parent matrix applied (#1711)', function() {
|
|
var child = new Group({ applyMatrix: false });
|
|
var parent = new Group([child]);
|
|
var scale = 1.1;
|
|
var initial = child.scaling.x;
|
|
parent.scale(scale);
|
|
var final = child.scaling.x;
|
|
equals(final, initial * scale);
|
|
});
|