blob: 75e8722cd64c9b7f6ada1973c05de606b18d0e85 [file] [log] [blame]
// 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.10
part of engine;
/// A surface that makes its children transparent.
class PersistedOpacity extends PersistedContainerSurface
implements ui.OpacityEngineLayer {
PersistedOpacity(PersistedOpacity? oldLayer, this.alpha, this.offset)
: super(oldLayer);
final int alpha;
final ui.Offset offset;
@override
void recomputeTransformAndClip() {
_transform = parent!._transform;
final double dx = offset.dx;
final double dy = offset.dy;
if (dx != 0.0 || dy != 0.0) {
_transform = _transform!.clone();
_transform!.translate(dx, dy);
}
_localTransformInverse = null;
_projectedClip = null;
}
@override
Matrix4 get localTransformInverse => _localTransformInverse ??=
Matrix4.translationValues(-offset.dx, -offset.dy, 0);
@override
html.Element createElement() {
return defaultCreateElement('flt-opacity')..style.transformOrigin = '0 0 0';
}
@override
void apply() {
// TODO(yjbanov): evaluate using `filter: opacity(X)`. It is a longer string
// but it reportedly has better hardware acceleration, so may
// be worth the trade-off.
rootElement!.style.opacity = '${alpha / 255}';
rootElement!.style.transform = 'translate(${offset.dx}px, ${offset.dy}px)';
}
@override
void update(PersistedOpacity oldSurface) {
super.update(oldSurface);
if (alpha != oldSurface.alpha || offset != oldSurface.offset) {
apply();
}
}
}