Рисование изображений CLUT и RGB в одном окне с помощью XPutImage - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь нарисовать два типа графики для моего окна, открытого с использованием XCreateWindow():

  1. RGB-графики, взятой из буфера памяти необработанных 32-битных пикселей (AARRGGBB) , без альфа-смешивания.

  2. Графика CLUT, взятая из буфера памяти 8-битных пикселей, которые описывают записи в отдельной цветовой карте.

Я легко могу нарисовать RGB графика в мое окно, создав XImage из буфера памяти, используя XCreateImage(), а затем я могу нарисовать это изображение, используя XPutImage(). Это работает нормально.

Однако, кажется, что все становится сложнее, когда дело доходит до рисования графики CLUT. Насколько я вижу, Xlib имеет специальный визуальный тип с именем PseudoColor , который, кажется, делает то, что я хочу, потому что do c говорит следующее:

For PseudoColor , значение пикселя индексирует цветовую карту для создания независимых значений RGB, а значения RGB можно динамически изменять

( source )

Однако, насколько я вижу, визуальный тип окна должен быть указан при создании окна, поскольку он передается в качестве параметра XCreateWindow(). Так что для меня это выглядит так, как будто я должен выбрать между визуальным окном TrueColor или PseudoColor , но я не могу иметь оба одновременно.

Так это правильно? Другими словами, нельзя ли нарисовать пиксели RGB и CLUT в одном и том же окне?

Конечно, я мог бы обойти это ограничение, вручную преобразовав пиксели CLUT в RGB и затем нарисовав преобразованные пиксели, используя XPutImage(), как описано выше. Однако прежде чем я это сделаю, я сначала хотел бы узнать, есть ли способ рисовать графику CLUT непосредственно рядом с графикой RGB.

EDIT

Для справки, вот то, что я пробовал до сих пор:

unsigned char *pixels = malloc(640 * 480);  // in reality this is filled with real pens
unsigned int palette[256];   // in reality this is filled with real RGB values
Colormap cm;
XColor rgb;
int i;

cm = XCreateColormap(display, window, visual, AllocAll);

for(i = 0; i < 256; i++) {
    rgb.pixel = i;
    rgb.red = GetRValue(palette[i]) * 257;
    rgb.green = GetGValue(palette[i]) * 257;
    rgb.blue = GetBValue(palette[i]) * 257;
    rgb.flags = DoRed|DoGreen|DoBlue;
    XStoreColor(display, cm, &rgb);
}

XSetWindowColormap(display, window, cm);

image = XCreateImage(display, visual, 8, ZPixmap, 0, pixels, 640, 480, 8, 640);
XPutImage(display, window, gc, image, 0, 0, 0, 0, 640, 480);
XFlush(display);

image->data = NULL;
XDestroyImage(image);

XFreeColormap(display, cm);

Сбой уже в XCreateColormap(), говоря:

X Ошибка неудачного запроса: BadMatch (недопустимые атрибуты параметров)
Основной код операции невыполненного запроса: 78 (X_CreateColormap) Серийный номер ошибочного запроса: 497 Текущий серийный номер в выходном потоке: 500

Если я использую AllocNone вместо AllocAll, XCreateColormap() завершается успешно но XStoreColor() терпит неудачу, говоря:

X Ошибка неудачного запроса: BadAccess (попытка доступа к частному ресурсу отклонена) Главный код операции неудавшегося запроса: 89 (X_StoreColors) Серийный номер неудавшегося запроса: 493 Текущий серийный номер в выходном потоке: 751

...