Я пытаюсь нарисовать два типа графики для моего окна, открытого с использованием XCreateWindow()
:
RGB-графики, взятой из буфера памяти необработанных 32-битных пикселей (AARRGGBB) , без альфа-смешивания.
Графика 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