From 63fe6b19c38aa8145eb97bb1cd3f1b81e92a0bc8 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Wed, 23 Sep 2026 16:13:09 +0200 Subject: [PATCH] qdraw: fix some variables reading and implement painting rectangles --- nihav-qt/src/codecs/qdraw.rs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/nihav-qt/src/codecs/qdraw.rs b/nihav-qt/src/codecs/qdraw.rs index 97a1831..3448fe8 100644 --- a/nihav-qt/src/codecs/qdraw.rs +++ b/nihav-qt/src/codecs/qdraw.rs @@ -334,12 +334,12 @@ impl NADecoder for QDrawDecoder { 0x0020 => { // line let sx = br.read_u16be()?; let sy = br.read_u16be()?; - let dx = br.read_u16le()?; - let dy = br.read_u16le()?; + let dx = br.read_u16be()?; + let dy = br.read_u16be()?; }, 0x0021 => { // line from - let dx = br.read_u16le()?; - let dy = br.read_u16le()?; + let dx = br.read_u16be()?; + let dy = br.read_u16be()?; }, 0x0022 => { // short line let xpos = br.read_u16be()?; @@ -358,7 +358,17 @@ impl NADecoder for QDrawDecoder { br.read_skip(count)?; }, 0x0031 => { // paint rect - br.read_skip(8)?; + let sy = usize::from(br.read_u16be()?); + let sx = usize::from(br.read_u16be()?); + let dy = usize::from(br.read_u16be()?); + let dx = usize::from(br.read_u16be()?); + validate!(sy < dy && sx < dx); + for dline in frm.data[frm.offset[0]..].chunks_exact_mut(frm.stride[0]) + .take(dy.min(self.height)).skip(sy) { + for pix in dline.chunks_exact_mut(3).take(dx.min(self.width)).skip(sx) { + pix.copy_from_slice(&fg_clr); + } + } }, 0x0098 => { // PackBits rect decode_bits(&mut br, &mut frm, self.width, self.height, false, false)?; -- 2.39.5