Internal
Public Access
Add VNC Hextile decoding
Implements RFC 6143 SS7.7.4: rectangles announced as Hextile (type 5) tile the update into 16x16 blocks, each either raw pixels or a background fill plus an optional list of foreground/individually- colored subrects, with background/foreground persisting across tiles within one rectangle when not re-specified. The pure byte-decode logic (tile metadata, subrect list) lives in new src/vnc_pixel_codecs.h/.cpp, kept separate from VncSessionBackend's wire-sequencing state machine so it's unit-testable without a socket -- the pattern the plan calls for continuing into the ZRLE/Tight work still ahead. Adds 5 fake-server tests covering a raw tile, a background-only solid fill, uncoloured and individually-colored subrects, and a 4-tile rectangle proving background persistence and correct tile-cursor wraparound. Verified against the live TightVNC test server (connect, frame, cursor, clipboard all still work); that particular server always chose Raw for the actual framebuffer content during this session, so Hextile's real-world path isn't independently confirmed live -- the unit tests are the primary correctness evidence for this phase. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,8 @@
|
||||
#include <QAbstractSocket>
|
||||
#include <QByteArray>
|
||||
#include <QImage>
|
||||
#include <QRect>
|
||||
#include <QRgb>
|
||||
|
||||
class QTcpSocket;
|
||||
|
||||
@@ -20,10 +22,11 @@ class QTcpSocket;
|
||||
//
|
||||
// Scope (see plan / issue #3 for the full rationale): standard VNC
|
||||
// Authentication (security type 2) and no-auth (type 1) only -- not
|
||||
// Apple's Screen Sharing scheme (type 30). Raw + CopyRect encodings only.
|
||||
// No dynamic resize. Clipboard sync (Latin-1 only, per RFB's
|
||||
// ServerCutText/ClientCutText) and remote cursor shape sync (the Cursor
|
||||
// pseudo-encoding) are supported.
|
||||
// Apple's Screen Sharing scheme (type 30). Raw + CopyRect + Hextile
|
||||
// encodings (ZRLE/Tight compression not yet implemented). No dynamic
|
||||
// resize. Clipboard sync (Latin-1 only, per RFB's ServerCutText/
|
||||
// ClientCutText) and remote cursor shape sync (the Cursor pseudo-encoding)
|
||||
// are supported.
|
||||
class VncSessionBackend : public SessionBackend
|
||||
{
|
||||
Q_OBJECT
|
||||
@@ -83,6 +86,10 @@ private:
|
||||
WaitingRawPixelData,
|
||||
WaitingCopyRectSource,
|
||||
WaitingCursorPixelData,
|
||||
WaitingHextileTileSubencoding,
|
||||
WaitingHextileTileMeta,
|
||||
WaitingHextileSubrectData,
|
||||
WaitingHextileRawTileData,
|
||||
WaitingSetColourMapHeader,
|
||||
WaitingSetColourMapData,
|
||||
WaitingServerCutTextHeader,
|
||||
@@ -120,6 +127,18 @@ private:
|
||||
int m_lastPointerX;
|
||||
int m_lastPointerY;
|
||||
|
||||
// Hextile decode state (RFC 6143 SS7.7.4): tile-cursor position relative
|
||||
// to the current rectangle's origin, plus the background/foreground
|
||||
// colors, which persist across tiles within one rectangle whenever a
|
||||
// tile doesn't re-specify them.
|
||||
int m_hextileTileX;
|
||||
int m_hextileTileY;
|
||||
QRgb m_hextileBackground;
|
||||
QRgb m_hextileForeground;
|
||||
quint8 m_hextileSubencoding;
|
||||
int m_hextileSubrectsRemaining;
|
||||
bool m_hextileSubrectsColoured;
|
||||
|
||||
void setState(SessionState state, const QString& message);
|
||||
void resetProtocolState();
|
||||
void processReceiveBuffer();
|
||||
@@ -134,6 +153,8 @@ private:
|
||||
void sendPointerEvent();
|
||||
void sendWheelClick(quint8 wheelBit);
|
||||
void sendClientCutText(const QString& text);
|
||||
QRect currentHextileTileRect() const;
|
||||
void advanceHextileTile();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user