mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
104 lines
3.2 KiB
Dart
104 lines
3.2 KiB
Dart
// 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,
|
|
));
|
|
}
|
|
}
|