Я работаю над простой реализацией сервера RFB с использованием кодирования «RAW». Я использую TightVNC в качестве моего настольного клиента. У меня есть код, работающий до такой степени, что клиент может запросить весь «рабочий стол» размером 640x480 пикселей. Моя тестовая модель правильно рисует относительно формы, но цвета неправильны.Неправильная цветовая кодировка в удаленном сервере Framebuffer
Я пытаюсь использовать 8 бит на пиксель: три красных, три зеленых и два синих закодированы как RRRGGGBB
в каждом байте.
Моего ServerInit пакет содержит это кодирование пикселя спецификацию ...
//all of these 13 fields are unsigned chars...
si.pf.bits_per_pixel = 8;
si.pf.depth = 8;
si.pf.big_endian_flag = 0;
si.pf.true_colour_flag = 1;
si.pf.red_max_hi = 0;
si.pf.red_max_lo = 7; // 3 bits
si.pf.green_max_hi = 0;
si.pf.green_max_lo = 7; // 3 bits
si.pf.blue_max_hi = 0;
si.pf.blue_max_lo = 3; // 2 bits
si.pf.red_shift = 5; // >>>>>RRR
si.pf.green_shift = 2; // >>RRRGGG
si.pf.blue_shift = 0; // RRRGGGBB
//remaining fields are omitted
Всей структура определяются следующим образом:
typedef struct
{
uchar bits_per_pixel;
uchar depth;
uchar big_endian_flag;
uchar true_colour_flag;
uchar red_max_hi;
uchar red_max_lo;
uchar green_max_hi;
uchar green_max_lo;
uchar blue_max_hi;
uchar blue_max_lo;
uchar red_shift;
uchar green_shift;
uchar blue_shift;
uchar padding0;
uchar padding1;
uchar padding2;
}tPixelFormat;
Теперь, если я заполняю мое изображение рабочего стола с 0xe0
(бинарным 111 000 00
), затем Я ожидаю, что это будет интерпретироваться как чистый ярко-красный. Но он выглядит как голубой цвет (как будто 8 отдельных бит были интерпретированы назад!). Форма моего тестового шаблона верна, так как я рисую несколько белых пикселей в верхнем углу (белый - двоичный 111 111 11
).
Я этого не понимаю. Я считаю, что я следовал алгоритму и кодированию, как это описано в спецификации RFB ... http://vncdotool.readthedocs.org/en/latest/rfbproto.html#serverinit
Что я делаю неправильно?
Endianness не применяется к формату RAW, когда используется 8 бит на пиксель, так как имеется только один байт на пиксель. 16-битные значения (_hi/_lo) в предоставленном коде должны быть в формате большого конца. – Wossname
В спецификациях 'red-max'' green-max' 'blue-max'' 'U16'. Вы написали, что ваша структура имеет длину 13 байтов. Другое дело: структура упакована? Вы уверены в выравнивании? Отправьте определение структуры. – LPs
Я добавил определение структуры в вопрос. Декодер Wireshark – Wossname