my_colormap:= XCreateColormap(display,
win,
default_visual,
AllocNone);
Имейте в виду, что дескриптор окна используется только для того, чтобы позволить серверу X создать палитру для данного экрана. Мы можем затем использовать эту палитру для любого окна, нарисованного на том же экране.
Как только мы получили доступ к некоторой палитре, мы можем начать распределять цвета. Это делается с помощью функций XAllocNamedColor() и XAllocColor(). Первая из них - XAllocNamedColor() - принимает имя цвета (например, "red", "blue", "brown" и т.д.) и распределяет ближайший цвет, который может в действительности рисоваться на экране. XAllocColor() принимает цвет RGB, и распределяет ближайший цвет, который может отображаться на экране. Обе функции используют структуру TXColor, содержащую следующие поля:
• pixel: cardinal - индекс палитры, используемый для рисования данным цветом.
• red: word - красная составляющая RGB-значения цвета.
• green: word - зеленая составляющая RGB-значения цвета.
• blue: word - синяя составляющая RGB-значения цвета.
Пример использования этих функций:
var
system_color_1, system_color_2: TXColor;
exact_color: TXColor;
rc: TStatus;
rc:= XAllocNamedColor(display, screen_colormap, 'red', @system_color_1, @exact_color);
if (rc = 0) then begin
writeln('XAllocNamedColor - выделить "красный" цвет не удалось.');
end
else begin
writeln('Элемент палитры "красный" выделен как (', system_color_1.red, ', ', system_color_1.green, ', ', system_color_1.blue, ') в RGB-значениях.');
end;
system_color_2.red:= 30000;
system_color_2.green:= 10000;
system_color_2.blue:= 0;
rc:= XAllocColor(display, screen_colormap, @system_color_2);
if (rc = 0) then begin
writeln('XAllocColor - цвет (30000,10000,0) выделить не удалось.');
end
else begin
.
.
end;
После того, как мы распределили желаемые цвета, мы можем использовать их, рисуя текст или графику. Для этого нам нужно установить эти цвета как передний план и цвет фона для некоторого GC (графического контекста), и затем используйте этот GC для рисования. Это делается с помощью функций XSetForeground() и XSetBackground():
XSetForeground(display, my_gc, screen_color_1.pixel);
XSetForeground(display, my_gc, screen_color_2.pixel);
Само же рисование осуществляется с помощью тех же функций, что и ранее. Для использования нескольких цветов, можно сделать одно из двух: мы можем либо изменить передний план и/или цвет фона GC перед любой функцией рисования, либо использовать несколько различных GC. Решение, какой из способов лучше, принимать вам: распределение многих GC будет использовать больше ресурсов X сервера, но где-то это приведет к более компактному коду, и может быть легче, чем замена цветов рисования.
1.2.5 Битовые и пиксельные карты
Xlib не имеет никаких средств для работы с популярными графическими форматами, такими как gif, jpeg или tiff. На программиста (или высокоуровневые графические библиотеки) оставлен перевод эти форматы изображений в форматы, с которыми знаком X сервер - битовыми и пиксельными картами.