Fix: nested group matrix should not be reset

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
This commit is contained in:
sasensi 2019-10-06 14:00:09 +02:00 committed by Jürg Lehni
parent aa9dc86e7b
commit f84199c83d
2 changed files with 27 additions and 16 deletions

View file

@ -3549,11 +3549,15 @@ new function() { // Injection scope for hit-test functions shared with project
if (strokeColor)
strokeColor.transform(matrix);
}
if (applyMatrix) {
// Set the internal _applyMatrix flag to true if we're told to do so.
if (_setApplyMatrix && this._canApplyMatrix)
this._applyMatrix = true;
// Call #_transformContent() now, if we need to directly apply the
// internal _matrix transformations to the item's content.
// Application is not possible on Raster, PointText, SymbolItem, since
// the matrix is where the actual transformation state is stored.
if (applyMatrix && (applyMatrix = this._transformContent(_matrix,
if (this._applyMatrix && (applyMatrix = this._transformContent(_matrix,
_applyRecursively, _setApplyMatrix))) {
// Pivot is provided in the parent's coordinate system, so transform
// it along too.
@ -3563,10 +3567,7 @@ new function() { // Injection scope for hit-test functions shared with project
// Reset the internal matrix to the identity transformation if
// it was possible to apply it, but do not notify owner of change.
_matrix.reset(true);
// Set the internal _applyMatrix flag to true if we're told to
// do so
if (_setApplyMatrix && this._canApplyMatrix)
this._applyMatrix = true;
}
}
// Calling _changed will clear _bounds and _position, but depending
// on matrix we can calculate and set them again, so preserve them.

View file

@ -189,3 +189,13 @@ test(
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);
});