ImageModel

This commit is contained in:
open-trade 2020-11-18 23:15:59 +08:00
parent 63930918f6
commit 0d4c85b3df
3 changed files with 42 additions and 22 deletions

View File

@ -7,6 +7,7 @@ import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'dart:typed_data'; import 'dart:typed_data';
import 'dart:ui' as ui;
class RgbaFrame extends Struct { class RgbaFrame extends Struct {
@Uint32() @Uint32()
@ -50,6 +51,17 @@ class FfiModel with ChangeNotifier {
} }
} }
class ImageModel with ChangeNotifier {
ui.Image _image;
ui.Image get image => _image;
void update(ui.Image image) {
_image = image;
notifyListeners();
}
}
class FFI { class FFI {
static F1 _freeCString; static F1 _freeCString;
static F2 _getByName; static F2 _getByName;
@ -57,6 +69,8 @@ class FFI {
static F4 _freeRgba; static F4 _freeRgba;
static F5 _getRgba; static F5 _getRgba;
static Pointer<RgbaFrame> _lastRgbaFrame; static Pointer<RgbaFrame> _lastRgbaFrame;
static final imageModel = ImageModel();
static final ffiModel = FfiModel();
static String getId() { static String getId() {
return getByName('remote_id'); return getByName('remote_id');
@ -115,6 +129,7 @@ class FFI {
static void close() { static void close() {
setByName('close', ''); setByName('close', '');
FFI.imageModel.update(null);
} }
static void setByName(String name, String value) { static void setByName(String name, String value) {

View File

@ -10,16 +10,17 @@ void main() {
class App extends StatelessWidget { class App extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var ffi = FfiModel();
return ChangeNotifierProvider.value( return ChangeNotifierProvider.value(
value: ffi, value: FFI.ffiModel,
child: MaterialApp( child: ChangeNotifierProvider.value(
title: 'RustDesk', value: FFI.imageModel,
theme: ThemeData( child: MaterialApp(
primarySwatch: Colors.blue, title: 'RustDesk',
visualDensity: VisualDensity.adaptivePlatformDensity, theme: ThemeData(
), primarySwatch: Colors.blue,
home: HomePage(title: 'RustDesk'), visualDensity: VisualDensity.adaptivePlatformDensity,
)); ),
home: HomePage(title: 'RustDesk'),
)));
} }
} }

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'common.dart'; import 'common.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'dart:ui' as ui; import 'dart:ui' as ui;
@ -18,7 +19,6 @@ class RemotePage extends StatefulWidget {
// https://github.com/hanxu317317/flutter_plan_demo/blob/master/lib/src/enter.dart // https://github.com/hanxu317317/flutter_plan_demo/blob/master/lib/src/enter.dart
class _RemotePageState extends State<RemotePage> { class _RemotePageState extends State<RemotePage> {
Timer _interval; Timer _interval;
ui.Image _image;
PeerInfo _pi = PeerInfo(); PeerInfo _pi = PeerInfo();
Display _display = Display(); Display _display = Display();
bool _decoding = false; bool _decoding = false;
@ -64,13 +64,11 @@ class _RemotePageState extends State<RemotePage> {
_decoding = true; _decoding = true;
ui.decodeImageFromPixels( ui.decodeImageFromPixels(
rgba, _display.width, _display.height, ui.PixelFormat.bgra8888, rgba, _display.width, _display.height, ui.PixelFormat.bgra8888,
(__image) { (image) {
FFI.clearRgbaFrame(); FFI.clearRgbaFrame();
if (_decoding == null) return; if (_decoding == null) return;
_decoding = false; _decoding = false;
setState(() { FFI.imageModel.update(image);
_image = __image;
});
}); });
} }
} }
@ -133,17 +131,23 @@ class _RemotePageState extends State<RemotePage> {
onInteractionUpdate: (details) { onInteractionUpdate: (details) {
print("$details"); print("$details");
}, },
child: Container( child: Container(child: ImagePaint(), color: MyTheme.grayBg),
child: CustomPaint(
painter: new ImageEditor(image: _image),
),
color: MyTheme.grayBg),
)); ));
} }
} }
class ImageEditor extends CustomPainter { class ImagePaint extends StatelessWidget {
ImageEditor({ @override
Widget build(BuildContext context) {
final m = Provider.of<ImageModel>(context);
return CustomPaint(
painter: new ImagePainter(image: m.image),
);
}
}
class ImagePainter extends CustomPainter {
ImagePainter({
this.image, this.image,
}); });