- install SDL2 development files (fedora:
sudo dnf install SDL2-devel
) - run
make
. Use the makefile to change build directory (default is./build
)
This server implements a binary protocol. Integers are sent in little-endian format (details below).
It is allowed to specify coordinates outside screen bounds. In case of reading, pixels outside the screen are interpreted as black (r = g = b = 0). In case of writing, pixels outside the screen are ignored.
Rectangles may be defined with width = 0
or height = 0
. The resulting command is simply ignored.
Some commands are smaller than 8 bytes, and the remaining memory is undefined. Nevertheless, all 8 bytes must be sent to the server before the command is processed.
The server may stop processing further commands from a client if its send buffer is full. The send buffer size can be discovered with the INFO command. For example, for a send buffer size of 1024 the server holds a maximum of 1024 / 4 = 256 color values. This means at most 256 GET commands may be sent to the server before the client must read from the server. Of course, this is a conservative guarantee, as more bytes are likely in-flight or stored in the TCP kernel buffer. However, a client not adhering to this is considered erroneous.
It is possible for the client to request more than SEND_BUFFER_SIZE / 4
colors in a single command, for example with RECTANGLE GET.
Byte | Content |
---|---|
0 | 'I' (0x49) |
1 | undefined |
2 | undefined |
3 | undefined |
4 | undefined |
5 | undefined |
6 | undefined |
7 | undefined |
Byte | Content |
---|---|
0 | screen_width[0..=7] |
1 | screen_width[8..=15] |
2 | screen_width[16..=23] |
3 | screen_width[24..=31] |
4 | screen_height[0..=7] |
5 | screen_height[8..=15] |
6 | screen_height[16..=23] |
7 | screen_height[24..=31] |
8 | recv_buffer_size[0..=7] |
9 | recv_buffer_size[8..=15] |
10 | recv_buffer_size[16..=23] |
11 | recv_buffer_size[24..=31] |
12 | send_buffer_size[0..=7] |
13 | send_buffer_size[8..=15] |
14 | send_buffer_size[16..=23] |
15 | send_buffer_size[24..=31] |
Byte | Content |
---|---|
0 | 'P' (0x50) |
1 | x[0..=7] |
2 | x[8..=15] |
3 | y[0..=7] |
4 | y[8..=15] |
5 | r |
6 | g |
7 | b |
Byte | Content |
---|---|
0 | 'G' (0x47) |
1 | x[0..=7] |
2 | x[8..=15] |
3 | y[0..=7] |
4 | y[8..=15] |
5 | undefined |
6 | undefined |
7 | undefined |
Byte | Content |
---|---|
0 | r |
1 | g |
2 | b |
3 | if pixel was inside canvas 1 , otherwise 0 |
This command first specifies a rectangle (x, y, w, h)
. Due to space constraints, w and h have possible ranges 0..=4095
.
The server now expects the client to send w*h
color values with 4 bytes each. These values are used to fill the rectangle left-to-right and top-to-bottom.
Byte | Content |
---|---|
0 | 'p' (0x70) |
1 | x[0..=7] |
2 | x[8..=15] |
3 | y[0..=7] |
4 | y[8..=15] |
5 | w[0..=7] |
5 | h[0..=7] |
7 | from high to low bits: h[11] h[10] h[9] h[8] w[11] w[10] w[9] w[8] |
Byte | Content |
---|---|
0 | r |
1 | g |
2 | b |
3 | undefined |
This command first specifies a rectangle (x, y, w, h)
. Due to space constraints, w and h have possible ranges 0..=4095
.
The server now expects the client to send a single color value with 4 bytes. The rectangle is filled with this color left-to-right and top-to-bottom.
Byte | Content |
---|---|
0 | 'f' (0x66) |
1 | x[0..=7] |
2 | x[8..=15] |
3 | y[0..=7] |
4 | y[8..=15] |
5 | w[0..=7] |
5 | h[0..=7] |
7 | from high to low bits: h[11] h[10] h[9] h[8] w[11] w[10] w[9] w[8] |
Byte | Content |
---|---|
0 | r |
1 | g |
2 | b |
3 | undefined |
This command specifies a rectangle (x, y, w, h)
. Due to space constraints, w and h have possible ranges 0..=4095
.
The server sends back w*h
color values with 4 bytes each. The order is left-to-right and top-to-bottom.
Byte | Content |
---|---|
0 | 'g' (0x67) |
1 | x[0..=7] |
2 | x[8..=15] |
3 | y[0..=7] |
4 | y[8..=15] |
5 | w[0..=7] |
5 | h[0..=7] |
7 | from high to low bits: h[11] h[10] h[9] h[8] w[11] w[10] w[9] w[8] |
Byte | Content |
---|---|
0 | r |
1 | g |
2 | b |
3 | if pixel was inside canvas 1 , otherwise 0 |