Skip to content

Commit a481916

Browse files
committed
feat(server): keep last full-frame/desktop update
It should reflect client drawing state. In following changes, we will fix it to draw bitmap updates on it, to keep it up to date. Signed-off-by: Marc-André Lureau <[email protected]>
1 parent 17a19c7 commit a481916

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

crates/ironrdp-server/src/encoder/mod.rs

+24-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ pub(crate) mod rfx;
44
use core::{cmp, fmt};
55

66
use anyhow::{Context, Result};
7+
use ironrdp_acceptor::DesktopSize;
78
use ironrdp_core::{Encode, WriteCursor};
89
use ironrdp_pdu::fast_path::{EncryptionFlags, FastPathHeader, FastPathUpdatePdu, Fragmentation, UpdateCode};
910
use ironrdp_pdu::geometry::ExclusiveRectangle;
@@ -14,7 +15,7 @@ use ironrdp_pdu::surface_commands::{ExtendedBitmapDataPdu, SurfaceBitsPdu, Surfa
1415
use self::bitmap::BitmapEncoder;
1516
use self::rfx::RfxEncoder;
1617
use super::BitmapUpdate;
17-
use crate::{ColorPointer, RGBAPointer};
18+
use crate::{ColorPointer, Framebuffer, RGBAPointer};
1819

1920
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
2021
#[repr(u8)]
@@ -28,6 +29,9 @@ const MAX_FASTPATH_UPDATE_SIZE: usize = 16_374;
2829
const FASTPATH_HEADER_SIZE: usize = 6;
2930

3031
pub(crate) struct UpdateEncoder {
32+
desktop_size: DesktopSize,
33+
// FIXME: draw updates on the framebuffer
34+
framebuffer: Option<Framebuffer>,
3135
pdu_encoder: PduEncoder,
3236
bitmap_updater: BitmapUpdater,
3337
}
@@ -41,7 +45,7 @@ impl fmt::Debug for UpdateEncoder {
4145
}
4246

4347
impl UpdateEncoder {
44-
pub(crate) fn new(surface_flags: CmdFlags, remotefx: Option<(EntropyBits, u8)>) -> Self {
48+
pub(crate) fn new(desktop_size: DesktopSize, surface_flags: CmdFlags, remotefx: Option<(EntropyBits, u8)>) -> Self {
4549
let pdu_encoder = PduEncoder::new();
4650
let bitmap_updater = if !surface_flags.contains(CmdFlags::SET_SURFACE_BITS) {
4751
BitmapUpdater::Bitmap(BitmapHandler::new())
@@ -53,11 +57,17 @@ impl UpdateEncoder {
5357
};
5458

5559
Self {
60+
desktop_size,
61+
framebuffer: None,
5662
pdu_encoder,
5763
bitmap_updater,
5864
}
5965
}
6066

67+
pub(crate) fn set_desktop_size(&mut self, size: DesktopSize) {
68+
self.desktop_size = size;
69+
}
70+
6171
pub(crate) fn rgba_pointer(&mut self, ptr: RGBAPointer) -> Result<UpdateFragmenter<'_>> {
6272
let xor_mask = ptr.data;
6373

@@ -114,7 +124,18 @@ impl UpdateEncoder {
114124
}
115125

116126
pub(crate) fn bitmap(&mut self, bitmap: BitmapUpdate) -> Result<UpdateFragmenter<'_>> {
117-
self.bitmap_updater.handle(&bitmap, &mut self.pdu_encoder)
127+
let res = self.bitmap_updater.handle(&bitmap, &mut self.pdu_encoder);
128+
if bitmap.x == 0
129+
&& bitmap.y == 0
130+
&& bitmap.width.get() == self.desktop_size.width
131+
&& bitmap.height.get() == self.desktop_size.height
132+
{
133+
match bitmap.try_into() {
134+
Ok(framebuffer) => self.framebuffer = Some(framebuffer),
135+
Err(err) => warn!("Failed to convert bitmap to framebuffer: {}", err),
136+
}
137+
}
138+
res
118139
}
119140

120141
pub(crate) fn fragmenter_from_owned(&self, res: UpdateFragmenterOwned) -> UpdateFragmenter<'_> {

crates/ironrdp-server/src/server.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,7 @@ impl RdpServer {
436436
DisplayUpdate::PointerPosition(pos) => encoder.pointer_position(pos),
437437
DisplayUpdate::Resize(desktop_size) => {
438438
debug!(?desktop_size, "Display resize");
439+
encoder.set_desktop_size(desktop_size);
439440
deactivate_all(io_channel_id, user_channel_id, writer).await?;
440441
return Ok((RunState::DeactivationReactivation { desktop_size }, encoder));
441442
}
@@ -741,7 +742,8 @@ impl RdpServer {
741742
}
742743
}
743744

744-
let encoder = UpdateEncoder::new(surface_flags, rfxcodec);
745+
let desktop_size = self.display.lock().await.size().await;
746+
let encoder = UpdateEncoder::new(desktop_size, surface_flags, rfxcodec);
745747

746748
let state = self
747749
.client_loop(reader, writer, result.io_channel_id, result.user_channel_id, encoder)

0 commit comments

Comments
 (0)