[ Содержание ] | [ Перечень функций ] |
int XReadBitmapFileData(filename, width_return, height_return, data_return, x_hot_return, y_hot_return) char *filename; unsigned int *width_return, *height_return; unsigned char *data_return; int *x_hot_return, *y_hot_return;
АРГУМЕНТЫ
Функция XReadBitmapFileData читает в память данные графического файла в формате XBM. Двоичные данные изображения возвращаются через аргумент data_return, размеры возвращаются через аргументы width_return и height_return. Также возвращаются точки привязки изображения. Этот параметр является особенностью формата XBM. Поскольку файлы в таком формате удобно использовать для создания собственных графических курсоров, то сразу в файле можно указать, какая точка изображения будет соответствовать позиции курсора (см. XCreatePixmapCursor).
Если функции указанный файл окажется недоступен, функция вернёт значение BitmapOpenFailed. Если файл окажется с ошибками или будет другого формата, то функция вернёт значение BitmapFileInvalid. Если для загрузки данных будет недостаточно памяти, то будет получено значение BitmapNoMemory. Если чтение файла пройдёт успешно, то на выходе будет значение BitmapSuccess.
Если есть необходимость сразу из файла XBM сделать графический образ Pixmap, то можно воспользоваться функцией XReadBitmapFile.
Формат файла XBM текстовый. Он представляет собой фрагмент исходного текста на языке C, описывающий массив с данными изображения в двоичном виде. Вот пример файла anchor.xbm:
#define anchor_width 16 #define anchor_height 16 #define anchor_x_hot -1 #define anchor_y_hot -1 static char anchor_bits[] = { 0x00, 0x00, 0x80, 0x01, 0xc0, 0x03, 0x60, 0x07, 0x60, 0x06, 0xc0, 0x03, 0xc0, 0x03, 0x80, 0x01, 0x80, 0x01, 0x81, 0x81, 0x82, 0x41, 0x86, 0x61, 0x9c, 0x39, 0xf8, 0x1f, 0xe0, 0x07, 0x00, 0x00};
Как видно, в этом файле сначала стоят определения размеров, затем определения координат точки привязки (значение -1 говорит об отсутствии такой точки). Затем описывается статический массив с данными изображения.
Такой файл также можно просто подключить к исходному тексту программу через директиву #include или непосредственной подстановкой и затем обращаться к нему через массив данных, описанный в файле XBM.
Поскольку исходное изображение монохромное, то это означает, что один байт исходных данных описывает восемь точек. Точки, описываемые одним байтом располагаются по-горизонтали, причем точка из нулевого разряда находится слева, а точка из седьмого разряда находится справа. Отображение данных идет построчно, слева-направо. В качестве примера, порядок описания изображения размером 24x8 точек можно представить следующим образом:
Порядок разрядов | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Порядок байтов | data[0] | data[1] | data[2] | |||||||||||||||||||||
data[3] | data[4] | data[5] | ||||||||||||||||||||||
data[6] | data[7] | data[8] | ||||||||||||||||||||||
data[9] | data[10] | data[11] | ||||||||||||||||||||||
data[12] | data[13] | data[14] | ||||||||||||||||||||||
data[15] | data[16] | data[17] | ||||||||||||||||||||||
data[18] | data[19] | data[20] | ||||||||||||||||||||||
data[21] | data[22] | data[23] |
Если размер изображения по горизонтали не кратен восьми, то у байтов, которые попадают на конец строки изображения, выходящие за границу изображения разряды игнорируются и новая строка всегда начинается с нулевого разряда.
Таким образом, количество байт, описывающих изображение с горизонтальным размером, кратным восьми, равно
width / 8 * height
А если горизонтальный размер не кратен восьми, то значение будет равно
( int ( width / 8) + 1 ) * height
где int - операция взятия целой части.
После того, как данные изображения станут ненужными, память от них можно освободить используя функцию XFree.
Cм. также: XCreatePixmapFromBitmapData, XCreateBitmapFromData, XReadBitmapFile, XWriteBitmapFile, XFreePixmap, XCopyArea.
[ Содержание ] | [ Перечень функций ] |