XImage
XImage — это механизм манипуляции с изображением и сохранения изображения клиентской части оконной системы X Window. X Image может быть описана как битовый массив, хранящий изображение следующим образом на языке C:
<source lang='c'>
typedef struct XImage XImage; struct XImage { int width, height; /* size of image */ int xoffset; /* number of pixels offset in X direction */ int format; /* XYBitmap, XYPixmap, ZPixmap */ char *data; /* pointer to image data */ int byte_order; /* data byte order, LSBFirst, MSBFirst */ int bitmap_unit; /* quant. of scanline 8, 16, 32 */ int bitmap_bit_order; /* LSBFirst, MSBFirst */ int bitmap_pad; /* 8, 16, 32 either XY or ZPixmap */ int depth; /* depth of image */ int bytes_per_line; /* accelerator to next scanline */ int bits_per_pixel; /* bits per pixel (ZPixmap) */ unsigned long red_mask; /* bits in z arrangement */ unsigned long green_mask; unsigned long blue_mask; XPointer obdata; /* hook for the object routines to hang on */ struct funcs { /* image manipulation routines */ XImage *(*create_image)(); int (*destroy_image)(); unsigned long (*get_pixel)(); int (*put_pixel)(); XImage *(*sub_image)(); int (*add_pixel)(); } f; };
</source>
Описание структуры XImage[править]
- Поля
width
иheight
хранят размер изображения. - Поле
xoffset
хранит количество точек от начала строки изображения, которые будут игнорироваться при выводе. - Поле
format
указывает на формат данных изображения.XYBitmap
подразумевает монохромное изображение,XYPixmap
хранит индексы из цветовой палитры, аZPixmap
позволяет работать с полноцветным изображением. - Поле
data
хранит указатель на массив данных изображения. - Поле
byte_order
указывает порядок расположения байтов в массиве данных при формировании многобайтовых значений. Может принимать значения (LSBFirst
- младший байт первый илиMSBFirst
- старший байт первый). Это поле должно соответствовать порядку байт рабочей машины. - Поле
bitmap_unit
указывает количество разрядов, используемых для хранения одного пиксела изображения. (8, 16 или 32 бита) - Поле
bitmap_bit_order
указывает на порядок расположения разрядов в байтах массива данных изображения относительно увеличения координаты x. ДляZPixmap
всегдаMSBFirst
. - Поле
bitmap_pad
является параметром выравнивания адреса начала строки изображения (8, 16 или 32 бита). К примеру, если установлено значение 8, то строка изображения может начинаться с произвольного адреса, а если установлено значение 16, то строки будут начинаться только с чётных адресов. Это сделано с возможностью предоставления оптимизации скорости для систем с повышенной разрядностью, поскольку выборка многобайтовых значений с адресов, кратных разрядности шины данных системы производится быстрее. - Поле
depth
указывает глубину цветности изображения 8, 15, 16, 24 или 32. - Поле
bytes_per_line
указывает на количество байт, отводимых на одну строку изображения. Используется для вычисления адреса следующей строки. - Поле
bits_per_pixel
указывает на количество разрядов, отводимых для одного пиксела изображения. Используется только для формата изображенияZPixmap
. - Поля
red_mask
,green_mask
иblue_mask
указывают, какие разряды, используемые при кодировании пикселя хранят значения яркости красной, зелёной и синей составляющих цвета. Используются только для формата изображенияZPixmap
- Остальные поля связаны с указателями на функции, которые рассчитаны на работу с описываемым изображением.
Пример программы[править]
Ниже приведен пример программы на языке C, выводящий изображение XImage в окно X Window.
<source lang='cpp'> /* Компилируется строкой: cc -o test test.c -I/usr/X11R6/include -I/usr/X11R6/include/X11 -L/usr/X11R6/lib -lX11 -lm */
- include <X11/Xlib.h>
- include <X11/Xutil.h>
- include <X11/Xatom.h>
- include <X11/keysym.h>
- include <stdlib.h>
- include <stdio.h>
- include <errno.h>
main(int argc, char *argv[]) {
Display *dis; Window win; /* окно */ XEvent event;/* События */ GC gc;/* Графический контекст */ int depth, screen; Visual *vis; XImage *image; int n, width = 320, height = 240, size; char *buf; Bool terminate = False;
if ((dis = XOpenDisplay(getenv("DISPLAY"))) == NULL) {
printf("Can't connect X server: %s\n", strerror(errno)); exit(1);
}
screen = DefaultScreen(dis); depth = DefaultDepth(dis, screen); vis = DefaultVisual(dis, screen);
win = XCreateSimpleWindow(dis, RootWindow(dis, DefaultScreen(dis)),
0, 0, width, height, 5, BlackPixel(dis, DefaultScreen(dis)), WhitePixel(dis, DefaultScreen(dis)));
XSetStandardProperties(dis, win, "Test XImage", argv[0], None, argv, argc, NULL); gc = DefaultGC(dis, DefaultScreen(dis));
/* Выделяем память для рисунка */ size = width * height * 4; buf = malloc(size); if (buf == NULL) {
perror("malloc"); exit(-2);
} /* Заполним случайными данными */ for (n = 0; n < size; n++) buf[n] = rand();
/* Создаем XImage размером width * height */ image = XCreateImage(dis, CopyFromParent, depth, ZPixmap, 0, buf, width, height, 32, 0);
XMapWindow(dis, win); XSelectInput(dis, win, ExposureMask | KeyPressMask); while (!terminate) {
XNextEvent(dis, &event); if (event.xany.window == win) { switch (event.type) { case Expose: XPutImage(dis, win, gc, image, 0, 0, 0, 0, image->width, image->height); break;
case KeyPress: if (XLookupKeysym(&event.xkey, 0) == XK_q) terminate = True; break;
default: break; } }
} XDestroyImage(image); XCloseDisplay(dis); exit(EXIT_SUCCESS);
} </source>
Примечания[править]
Ссылки[править]
- [1],[X Consortium]
- Графические системы Linux-а с точки зрения игр и мультимедиа, Сергей Кононенко, 2000
↑ [+] | |
---|---|
Архитектура |
Основной протокол • Xlib • Выделение • Менеджер сессий • XDM • Инструментарий • Авторизация • Встроенные средства • Список цветов |
Менеджеры окон | |
Расширения |
Графическое • Клавиатурное • Общей памяти • X video • Контурное • GLX • XRender |
Реализации |
X11.app • X.Org Server • X-Win32 • XFree86 • XDarwin • Xming • Xsun |
Стандарты | |
Приложения |