| // Copyright 2014 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. | |
| import 'box.dart'; | |
| import 'layer.dart'; | |
| import 'object.dart'; | |
| /// A rectangle upon which a backend texture is mapped. | |
| /// | |
| /// Backend textures are images that can be applied (mapped) to an area of the | |
| /// Flutter view. They are created, managed, and updated using a | |
| /// platform-specific texture registry. This is typically done by a plugin | |
| /// that integrates with host platform video player, camera, or OpenGL APIs, | |
| /// or similar image sources. | |
| /// | |
| /// A texture box refers to its backend texture using an integer ID. Texture | |
| /// IDs are obtained from the texture registry and are scoped to the Flutter | |
| /// view. Texture IDs may be reused after deregistration, at the discretion | |
| /// of the registry. The use of texture IDs currently unknown to the registry | |
| /// will silently result in a blank rectangle. | |
| /// | |
| /// Texture boxes are repainted autonomously as dictated by the backend (e.g. on | |
| /// arrival of a video frame). Such repainting generally does not involve | |
| /// executing Dart code. | |
| /// | |
| /// The size of the rectangle is determined by the parent, and the texture is | |
| /// automatically scaled to fit. | |
| /// | |
| /// See also: | |
| /// | |
| /// * <https://api.flutter.dev/javadoc/io/flutter/view/TextureRegistry.html> | |
| /// for how to create and manage backend textures on Android. | |
| /// * <https://api.flutter.dev/objcdoc/Protocols/FlutterTextureRegistry.html> | |
| /// for how to create and manage backend textures on iOS. | |
| class TextureBox extends RenderBox { | |
| /// Creates a box backed by the texture identified by [textureId], and use | |
| /// [filterQuality] to set texture's [FilterQuality]. | |
| TextureBox({ | |
| required int textureId, | |
| bool freeze = false, | |
| FilterQuality filterQuality = FilterQuality.low, | |
| }) : _textureId = textureId, | |
| _freeze = freeze, | |
| _filterQuality = filterQuality; | |
| /// The identity of the backend texture. | |
| int get textureId => _textureId; | |
| int _textureId; | |
| set textureId(int value) { | |
| if (value != _textureId) { | |
| _textureId = value; | |
| markNeedsPaint(); | |
| } | |
| } | |
| /// When true the texture will not be updated with new frames. | |
| bool get freeze => _freeze; | |
| bool _freeze; | |
| set freeze(bool value) { | |
| if (value != _freeze) { | |
| _freeze = value; | |
| markNeedsPaint(); | |
| } | |
| } | |
| /// {@macro flutter.widgets.Texture.filterQuality} | |
| FilterQuality get filterQuality => _filterQuality; | |
| FilterQuality _filterQuality; | |
| set filterQuality(FilterQuality value) { | |
| if (value != _filterQuality) { | |
| _filterQuality = value; | |
| markNeedsPaint(); | |
| } | |
| } | |
| @override | |
| bool get sizedByParent => true; | |
| @override | |
| bool get alwaysNeedsCompositing => true; | |
| @override | |
| bool get isRepaintBoundary => true; | |
| @override | |
| Size computeDryLayout(BoxConstraints constraints) { | |
| return constraints.biggest; | |
| } | |
| @override | |
| bool hitTestSelf(Offset position) => true; | |
| @override | |
| void paint(PaintingContext context, Offset offset) { | |
| context.addLayer(TextureLayer( | |
| rect: Rect.fromLTWH(offset.dx, offset.dy, size.width, size.height), | |
| textureId: _textureId, | |
| freeze: freeze, | |
| filterQuality: _filterQuality, | |
| )); | |
| } | |
| } |