2016-03-07 4 views
0

Я работаю над простой реализацией сервера 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

Что я делаю неправильно?

+0

Endianness не применяется к формату RAW, когда используется 8 бит на пиксель, так как имеется только один байт на пиксель. 16-битные значения (_hi/_lo) в предоставленном коде должны быть в формате большого конца. – Wossname

+0

В спецификациях 'red-max'' green-max' 'blue-max'' 'U16'. Вы написали, что ваша структура имеет длину 13 байтов. Другое дело: структура упакована? Вы уверены в выравнивании? Отправьте определение структуры. – LPs

+0

Я добавил определение структуры в вопрос. Декодер Wireshark – Wossname

ответ

1

Wireshark на помощь! Решил.

Оказалось, что клиент отправил запрос SetPixelFormat, который я не видел, код игнорировал его, и, судя по всему, серверу поручено выполнить запрос, изменив его выходной формат.

Исправление состоит в том, чтобы просто предоставить клиенту то, что он хотел с самого начала, путем жесткого кодирования значений, которые запрашивал клиент. В этот момент клиент никогда не отправляет этот запрос еще раз, потому что он доволен тем, что сервер теперь выкладывает с самого начала.

+0

Молодцы. +1 для умения отладки. – LPs

Смежные вопросы