@@ -12,7 +12,7 @@ use ironrdp_pdu::surface_commands::{ExtendedBitmapDataPdu, SurfaceBitsPdu, Surfa
12
12
use self :: bitmap:: BitmapEncoder ;
13
13
use self :: rfx:: RfxEncoder ;
14
14
use super :: BitmapUpdate ;
15
- use crate :: { ColorPointer , Framebuffer , RGBAPointer } ;
15
+ use crate :: { time_warn , ColorPointer , DisplayUpdate , Framebuffer , RGBAPointer } ;
16
16
17
17
mod bitmap;
18
18
mod fast_path;
@@ -59,12 +59,18 @@ impl UpdateEncoder {
59
59
}
60
60
}
61
61
62
+ pub ( crate ) fn update ( & mut self , update : DisplayUpdate ) -> EncoderIter < ' _ > {
63
+ EncoderIter {
64
+ encoder : self ,
65
+ update : Some ( update) ,
66
+ }
67
+ }
68
+
62
69
pub ( crate ) fn set_desktop_size ( & mut self , size : DesktopSize ) {
63
70
self . desktop_size = size;
64
71
}
65
72
66
- #[ allow( clippy:: unused_self) ]
67
- pub ( crate ) fn rgba_pointer ( & mut self , ptr : RGBAPointer ) -> Result < UpdateFragmenter > {
73
+ fn rgba_pointer ( ptr : RGBAPointer ) -> Result < UpdateFragmenter > {
68
74
let xor_mask = ptr. data ;
69
75
70
76
let hot_spot = Point16 {
@@ -86,8 +92,7 @@ impl UpdateEncoder {
86
92
Ok ( UpdateFragmenter :: new ( UpdateCode :: NewPointer , encode_vec ( & ptr) ?) )
87
93
}
88
94
89
- #[ allow( clippy:: unused_self) ]
90
- pub ( crate ) fn color_pointer ( & mut self , ptr : ColorPointer ) -> Result < UpdateFragmenter > {
95
+ fn color_pointer ( ptr : ColorPointer ) -> Result < UpdateFragmenter > {
91
96
let hot_spot = Point16 {
92
97
x : ptr. hot_x ,
93
98
y : ptr. hot_y ,
@@ -103,23 +108,26 @@ impl UpdateEncoder {
103
108
Ok ( UpdateFragmenter :: new ( UpdateCode :: ColorPointer , encode_vec ( & ptr) ?) )
104
109
}
105
110
106
- #[ allow( clippy:: unused_self) ]
107
- pub ( crate ) fn default_pointer ( & mut self ) -> Result < UpdateFragmenter > {
111
+ fn default_pointer ( ) -> Result < UpdateFragmenter > {
108
112
Ok ( UpdateFragmenter :: new ( UpdateCode :: DefaultPointer , vec ! [ ] ) )
109
113
}
110
114
111
- #[ allow( clippy:: unused_self) ]
112
- pub ( crate ) fn hide_pointer ( & mut self ) -> Result < UpdateFragmenter > {
115
+ fn hide_pointer ( ) -> Result < UpdateFragmenter > {
113
116
Ok ( UpdateFragmenter :: new ( UpdateCode :: HiddenPointer , vec ! [ ] ) )
114
117
}
115
118
116
- #[ allow( clippy:: unused_self) ]
117
- pub ( crate ) fn pointer_position ( & mut self , pos : PointerPositionAttribute ) -> Result < UpdateFragmenter > {
119
+ fn pointer_position ( pos : PointerPositionAttribute ) -> Result < UpdateFragmenter > {
118
120
Ok ( UpdateFragmenter :: new ( UpdateCode :: PositionPointer , encode_vec ( & pos) ?) )
119
121
}
120
122
121
- pub ( crate ) fn bitmap ( & mut self , bitmap : BitmapUpdate ) -> Result < UpdateFragmenter > {
122
- let res = self . bitmap_updater . handle ( & bitmap) ;
123
+ async fn bitmap ( & mut self , bitmap : BitmapUpdate ) -> Result < UpdateFragmenter > {
124
+ // Clone to satisfy spawn_blocking 'static requirement
125
+ // this should be cheap, even if using bitmap, since vec![] will be empty
126
+ let mut updater = self . bitmap_updater . clone ( ) ;
127
+ let ( res, bitmap) =
128
+ tokio:: task:: spawn_blocking ( move || time_warn ! ( "Encoding bitmap" , 10 , ( updater. handle( & bitmap) , bitmap) ) )
129
+ . await
130
+ . unwrap ( ) ;
123
131
if bitmap. x == 0
124
132
&& bitmap. y == 0
125
133
&& bitmap. width . get ( ) == self . desktop_size . width
@@ -134,7 +142,31 @@ impl UpdateEncoder {
134
142
}
135
143
}
136
144
137
- #[ derive( Debug ) ]
145
+ pub ( crate ) struct EncoderIter < ' a > {
146
+ encoder : & ' a mut UpdateEncoder ,
147
+ update : Option < DisplayUpdate > ,
148
+ }
149
+
150
+ impl EncoderIter < ' _ > {
151
+ pub ( crate ) async fn next ( & mut self ) -> Option < Result < UpdateFragmenter > > {
152
+ let update = self . update . take ( ) ?;
153
+ let encoder = & mut self . encoder ;
154
+
155
+ let res = match update {
156
+ DisplayUpdate :: Bitmap ( bitmap) => encoder. bitmap ( bitmap) . await ,
157
+ DisplayUpdate :: PointerPosition ( pos) => UpdateEncoder :: pointer_position ( pos) ,
158
+ DisplayUpdate :: RGBAPointer ( ptr) => UpdateEncoder :: rgba_pointer ( ptr) ,
159
+ DisplayUpdate :: ColorPointer ( ptr) => UpdateEncoder :: color_pointer ( ptr) ,
160
+ DisplayUpdate :: HidePointer => UpdateEncoder :: hide_pointer ( ) ,
161
+ DisplayUpdate :: DefaultPointer => UpdateEncoder :: default_pointer ( ) ,
162
+ DisplayUpdate :: Resize ( _) => return None ,
163
+ } ;
164
+
165
+ Some ( res)
166
+ }
167
+ }
168
+
169
+ #[ derive( Debug , Clone ) ]
138
170
enum BitmapUpdater {
139
171
None ( NoneHandler ) ,
140
172
Bitmap ( BitmapHandler ) ,
@@ -155,7 +187,7 @@ trait BitmapUpdateHandler {
155
187
fn handle ( & mut self , bitmap : & BitmapUpdate ) -> Result < UpdateFragmenter > ;
156
188
}
157
189
158
- #[ derive( Debug ) ]
190
+ #[ derive( Clone , Debug ) ]
159
191
struct NoneHandler ;
160
192
161
193
impl BitmapUpdateHandler for NoneHandler {
@@ -169,6 +201,7 @@ impl BitmapUpdateHandler for NoneHandler {
169
201
}
170
202
}
171
203
204
+ #[ derive( Clone ) ]
172
205
struct BitmapHandler {
173
206
bitmap : BitmapEncoder ,
174
207
}
@@ -209,7 +242,7 @@ impl BitmapUpdateHandler for BitmapHandler {
209
242
}
210
243
}
211
244
212
- #[ derive( Debug ) ]
245
+ #[ derive( Debug , Clone ) ]
213
246
struct RemoteFxHandler {
214
247
remotefx : RfxEncoder ,
215
248
codec_id : u8 ,
0 commit comments