| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // @dart = 2.6 |
| part of engine; |
| |
| /// A surface that transforms its children using CSS transform. |
| class PersistedTransform extends PersistedContainerSurface |
| implements ui.TransformEngineLayer { |
| PersistedTransform(PersistedTransform oldLayer, this.matrix4) |
| : super(oldLayer); |
| |
| final Float32List matrix4; |
| |
| @override |
| void recomputeTransformAndClip() { |
| _transform = parent._transform.multiplied(Matrix4.fromFloat32List(matrix4)); |
| _localTransformInverse = null; |
| _projectedClip = null; |
| } |
| |
| @override |
| Matrix4 get localTransformInverse { |
| _localTransformInverse ??= |
| Matrix4.tryInvert(Matrix4.fromFloat32List(matrix4)); |
| return _localTransformInverse; |
| } |
| |
| @override |
| html.Element createElement() { |
| return defaultCreateElement('flt-transform') |
| ..style.transformOrigin = '0 0 0'; |
| } |
| |
| @override |
| void apply() { |
| rootElement.style.transform = float64ListToCssTransform(matrix4); |
| } |
| |
| @override |
| void update(PersistedTransform oldSurface) { |
| super.update(oldSurface); |
| |
| if (identical(oldSurface.matrix4, matrix4)) { |
| return; |
| } |
| |
| bool matrixChanged = false; |
| for (int i = 0; i < matrix4.length; i++) { |
| if (matrix4[i] != oldSurface.matrix4[i]) { |
| matrixChanged = true; |
| break; |
| } |
| } |
| |
| if (matrixChanged) { |
| apply(); |
| } |
| } |
| } |