Текстуры и анимация

Библиотека Helianthus позволяет вам загружать и использовать в ваших программах различные изображения (текстуры) из файлов PNG. Также вы можете использовать анимированные текстуры — для создания анимации нужно все кадры в формате PNG разместить в одной папке и указать эту папку в качестве имени файла для загрузки. Для вашего удобства и сокращения количества используемых функций и одиночная текстура и анимация представлены в Helianthus в качестве одного и того же типа объектов — это всё анимации. Просто для одиночной текстуры количество кадров анимации равно одному. Количество кадров для загруженной анимации можно узнать при помощи функции animationGetFramesCount.

Чтобы загрузить текстуру используйте функцию createAnimation, которая возвращает значение типа Animation, которое по сути является адресом в памяти — указателем на описание текстуры внутри библиотеки Helianthus. Библиотека запоминает пути к загружаемым файлам, и, в случае многократной загрузки одного и того же файла не расходует лишнюю память, а работает лишь с одной копией изображения. Это изображение будет выгружено из памяти в тот момент когда будет удалена (animationDestroy) последняя использующая его анимация.

Помимо загрузки анимации из папки вы можете скомпоновать анимацию из отдельных кадров при помощи функций createAnimationEmpty, animationInsert, animationRemove, animationClear.

Анимация загружается установленной на паузу — то есть по-умолчанию она не воспроизводится. Запустить воспроизведение можно функцией animationPlay, снова поставить на паузу — animationPause. Кроме того анимация по-умолчанию зациклена, то есть когда она проиграет до конца — она сразу же начинается сначала. Вы можете это изменить используя функцию animationSetLoop.

Ещё один важный параметр анимации это скорость её воспроизведения. По-умолчанию она равна общей частоте перерисовки кадров (см. windowSetFrameRate), но если задан диапазон частоты — переменная частота кадров (windowSetFrameRateEx), то берётся значение из этого диапазона ближайшее к 24 кадрам в секунду. Если вас это не устраивает, задайте свою частоту смены кадров функцией animationSetFps.

Вы можете и вручную управлять воспроизведением анимации — используйте функции animationNextFrame, animationSetFrame, animationAddTime и animationSetPos.

Текстуры и анимации описанные выше — это уже загруженные на видеокарту данные и читать или менять пиксели в них нельзя. Для того чтобы работать с пикселями напрямую вам нужно загрузить их в оперативную память из файла — imageLoad, из текстуры — imageFromGLTexture и animationGetGLTexId или из пикселей на экране — imageFromViewport.

В отличие от анимации данные изображения не сгруппированы в структуру, а представлены в виде трёх отдельных переменных: ширина изображения, высота изображения и указатель на данные — массив пикселей. Данные это простая последовательность байтов — пикселив них записаны по строкам сверху вниз слева направо. Каждый пиксель — это четыре байта в формате RGBA — красный, зелёный, синий и непрозрачность (alpha). Для хранения этих данных выделяется оперативная память и прежде чем закончить с ними работу и забыть нужно эту память освободить функцией free из стандартного модуля <stdlib.h>. Сложновато? Да. Но ведь это низкоуровневые функции и прибегать к ним вам придётся только в редких случаях — если вам не хватило базового функционала.

Читать и записывать отдельные пиксели можно либо вручную высчитав номера отдельных байтов или при помощи функций imageGetPixel, imageSetPixel — которые сделают эти вычисления за вас.

Полученное изображение можно сохранить в файл — imageSave, отправить на видеокарту в виде текстуры OpenGL — imageToGLTexture или создать из изображения однокадровую анимацию — createAnimationFromImage.

Вот пример работы с изображениями:


// Все три переменные представленные ниже
// необходимы для работы с одним единственным изображением.
// Если вы захотите работать одновременно с двумя изображениями,
// то вам придётся завести дополнительную
// тройку аналогичных переменных.
int width = 0, height = 0; // Сюда будут записаны
                           // ширина и высота изображения.
void *data = NULL;         // Это указатель на данные изображения,
                           // пока он указывает в никуда.

// Попытаемся загрузить изображения
// будьте готовы к тому, что это не всегда удастся -
// вдруг кто-то удалит файл, например.
if (imageLoad("image.png", &width, &height, &data)) {
    // Ура! Файл существует и нам даже удалось его загрузить.
    // Поставим синий пиксель в координатах 10, 2.
    // Если, конечно, в загруженном изображении
    // есть эти координаты.
    if (width > 10 && height > 2)
        imageSetPixel(data, 10, 2, colorByName("blue"));
    
    // Сохраним изображение в другой файлы
    // будьте осторожны если такой файл уже существует,
    // то он будет перезапиан!
    imageSave("image2.png", width, heigh, data);
    
    // Мы закончили работу с изображением -
    // нужно освободить выделенную для его данных память.
    free(data);
    
    // Обнулим указатель на данные. Это необязательно,
    // просто на всякий случай. Это немножко защитит нас
    // от наших ошибок. Если мы вдруг попытаемся использовать
    // нулевой указатель, то в большинстве случаев увидим
    // явную ошибку и её источник. И сможем её исправить.
    // Использование же ненулевого указателя на уже
    // освобождённую память приведёт к совершенно
    // не предсказуемым ошибкам в совсем других
    // частях программы.
    data = NULL;
} else {
    // Не удалось загрузить изображение,
    // возможно файла нет или он есть, но повреждён,
    // или ещё что-то случилось.
    // Сообщим-ка пользователю об этой проблеме.
    printf("Ничего не получилось, увы :(");
}

Есть ещё несколько функций, которые могут вас заинтересовать — создание однокадровой анимации прямо из пикселей экрана или буфера кадра: createAnimationFromViewport, createAnimationFromFramebuffer. Сохранить снимок экрана (окна программы) в файл — viewportSave.

Функции:

Animation createAnimation(const char *path);

Загрузить текстуру из файла PNG или цепочку кадров в формате PNG из папки. Эквивалентно вызову createAnimationEx. со включенным сглаживанием (smooth) и отключенными повторами (horWrap, vertWrap).

Параметры:

path — путь к файлу или папке.

Animation createAnimationEx(const char *path, int smooth, int horWrap, int vertWrap);

Загрузить текстуру из файла PNG или цепочку кадров анимации в формате PNG из папки.

Если в качестве пути указана папка, из неё будут загружены все изображения и отсортированы в алфавитном порядке. Частота кадров для вновь созданной анимации будет равна частоте перерисовки экрана (windowSetFrameRate). Если задан диапазон частоты (windowSetFrameRateEx), то из этого диапазона будет выбрана частота ближайшая к 24-м кадрам в секунду.

Если файл не удалось загрузить файл(ы), то функция вернёт анимацию с нулевым количеством кадров.

Helianthus запоминает пути к загружаемым файлам, и, в случае многократной загрузки одного и того же файла не расходует лишнюю память, а работает лишь с одной копией изображения. Это изображение будет выгружено из памяти в тот момент когда будет удалена (animationDestroy) последняя использующая его анимация.

Если параметр smooth равен TRUE, то загруженная текстура будет отображаться сглаженной — вы не увидите резких переходов между пикселями (трилинейная фильтрация).

Параметры horWrap и vertWrap включают (TRUE) или выключают (FALSE) бесконечное повторение узора текстуры по горизонтали и вертикали соответственно.

См. также createAnimation, createAnimationFromImage, createAnimationFromViewport, createAnimationFromGLTexId, createAnimationEmpty, animationClone.

Параметры:

path — путь к файлу или папке;
smooth — включить сглаживание (TRUE или FALSE);
horWrap — включить бесконечное повторение узора текстуры по горизонтали (TRUE или FALSE);
vertWrap — включить бесконечное повторение узора текстуры по горизонтали (TRUE или FALSE).

Animation createAnimationFromGLTexId(unsigned int texid);

Создать однокадровую анимацию из текстуры OpenGL. Будьте внимательны, не удаляйте текстуру из OpenGL (glDeteteTextures) до тех пор пока существует хотя бы одна анимация её использующая. И более того анимация при своём удалении сама удалит эту текстуру из OpenGL. Если вы создали несколько анимаций с одной и той же текстурой, то текстура будет удалена при удалении последней использующей её анимации. Вы можете отключить автоматическое удаление текстуры обратившись к функции animationGLTexIdSetOwnership.

Настройки повторения узора текстуры и сглаживания уже содержатся в текстуре OpenGL.

См.также animationGetGLTexId.

Параметры:

texid — идентификатор текстуры из OpenGL.

Animation createAnimationFromImage(int width, int height, const void *pixels, int wrap);

Создать однокадровую анимацию из изображения в памяти. Пиксели должны идти один за другим по строкам сверху вниз, слева на право. По 4 байта на пиксель, по одному байту на каждый из каналов: красный, зелёный, синий, альфа каналы, именно в таком порядке. При загрузке создаётся копия текстуры в видеопамяти, и исходные данные больше не требуются, их можно выгрузить из памяти.

Текстура загружается со включенным сглаживанием (smooth). См. также createAnimationFromImageEx, createAnimationEx, imageLoad.

Параметры:

width — ширина изображения;
height — высота изображения;
pixels — указатель на первый байт первого пикселя в формате RGBA32;
wrap — включить бесконечное повторение узора текстуры во всех направлениях (TRUE или FALSE).

Animation createAnimationFromImageEx(int width, int height, const void *pixels, int horWrap, int vertWrap, int smooth, int mipMap);

Создать однокадровую анимацию из изображения в памяти. Пиксели должны идти один за другим по строкам сверху вниз, слева на право. По 4 байта на пиксель, по одному байту на каждый из каналов: красный, зелёный, синий, альфа каналы, именно в таком порядке. При загрузке создаётся копия текстуры в видеопамяти, и исходные данные больше не требуются, их можно выгрузить из памяти.

Вы можете включить или выключить бесконечное повторение узора текстуры по горизонтали и/или вертикали (параметры horWrap и vertWrap соответственно).

Также вы можете включить сглаживание пикселей изображения (smooth) и включить построение mip-уровней (mipMap). Если вы пока не знаете, что такое mip-уровни, то просто включайте их всегда, когда нужно сглаживание и выключайте, когда сглаживание не нужно. Если же вы не знаете требуется или нет вам сглаживание текстуры, то ответ один — требуется — включайте и сглаживание и mip-уровни.

См. также createAnimationFromImage, createAnimationFromImageEx, createAnimationEx, imageLoad.

Параметры:

width — ширина изображения;
height — высота изображения;
pixels — указатель на первый байт первого пикселя в формате RGBA32;
horWrap — включить бесконечное повторение узора текстуры по горизонтали (TRUE или FALSE);
vertWrap — включить бесконечное повторение узора текстуры по вертикали (TRUE или FALSE);
smooth — включить сглаживание (TRUE или FALSE);
mipMap — включить построение mip-уровней (TRUE или FALSE).

Animation createAnimationFromFramebuffer(Framebuffer framebuffer);

Создать новую динамическую текстуру связанную с заданным буфером кадра. Содержимое этой текстуры будет изменяться всякий раз когда вы рисуете в этом буфере кадра. Мгновенно, без каких либо дополнительных затрат на копирование. Дополнительную информацию смотрите в разделе «Буфер кадра».

Не удаляйте буфер кадра пока не удалите все связанные с ним анимации.

Если вам нужно зафиксировать именно копию текущего состояния буфера кадра, то используйте функцию createAnimationFromViewport в сочетании с функцией target.

Параметры:

framebuffer — буфер кадра.

Animation createAnimationFromViewport();

Создать новую текстуру (однокадровую анимацию) скопировав изображение с экрана.

Если точнее — из текущей области вывода OpenGL (glViewport) — обычно это и есть вся площадь окна. Но если вы переключили буфер кадра функцией target, то текстура будет взята из этого буфера кадра.

Текстура создаётся с выключенным повтором узора, но со включенным сглаживанием и mip-уровнями.

См. также createAnimationFromViewportEx, createAnimationFromFramebuffer, viewportByWindow, viewportByFramebuffer и раздел «Буфер кадра».

Animation createAnimationFromViewportEx(int horWrap, int vertWrap, int smooth, int mipMap);

Функция работает аналогично функции createAnimationFromViewport, но позволяет вам задать повторения узора текстуры по горизонтали и/или вертикали (параметры horWrap, vertWrap) и включить или выключить сглаживание (smooth) и mip-уровни. Подробнее обо всех этих параметрах смотрите в описании функции createAnimationFromImageEx.

Параметры:

horWrap — включить бесконечное повторение узора текстуры по горизонтали (TRUE или FALSE);
vertWrap — включить бесконечное повторение узора текстуры по вертикали (TRUE или FALSE);
smooth — включить сглаживание (TRUE или FALSE);
mipMap — включить построение mip-уровней (TRUE или FALSE).

Animation createAnimationEmpty();

Создать пустую анимацию — анимацию с нулевым количеством кадров. См. также animationInsert.

void animationDestroy(Animation animation);

Удалить анимацию.

Важно: Скорее всего у вас в программе останется переменная в которой хранился указатель на анимацию. Этот указатель станет недействителен — будет указывать на неопределённую область памяти — не на анимацию, анимацию уже удалена. Вы можете занести в эту переменную другую анимацию, но использовать старое значение переменной больше нельзя это приведёт к ошибкам и непредсказуемому поведению программы.

Animation animationClone(Animation animation);

Создать копию анимации, которая будет иметь собственные параметрами позиции воспроизведения и частоты кадров. Функция не размножает копии изображений в оперативной памяти — все клоны ссылаются на одни те же изображения. Библиотека Helianthus контролирует сколько анимаций используют конкретный кадр в данный момент времени и выгружают этот кадр из памяти только тогда, когда удалена последняя анимация его использовавшая.

См.также animationCloneEx, animationInsert.

Animation animationCloneEx(Animation animation, int start, int count);

Создать копию анимации, которая будет иметь собственные параметрами позиции воспроизведения и частоты кадров. При помощи параметров start и count вы выбираете какие именно кадры из заданной анимации будут скопированы в новую анимацию. См. также animationClone, animationInsert.

Параметры:

start — порядковый номер кадра с которого нужно начать копирование (нумерация от нуля);
count — количество кадров, которое нужно скопировать.

unsigned int animationGetGLTexId(Animation animation);

Функция возвращает внутренний идентификатор текстуры OpenGL для текущего кадра анимации. См.также animationGetFrameGLTexId, animationGetFrame, createAnimationFromGLTexId.

unsigned int animationGetFrameGLTexId(Animation animation, int frame);

Функция возвращает внутренний идентификатор текстуры OpenGL для заданного кадра анимации. См.также animationGetGLTexId, createAnimationFromGLTexId.

Параметры:

frame — порядковый номер кадра с для которого нужно получить идентификатор (нумерация от нуля);

void animationGLTexIdSetOwnership(unsigned int texid, int own);

Функция задаёт правила удаления текстуры с заданным идентификатором из OpenGL. Определяет кто является владельцем текстуры — библиотека Helianthus или ваша собственная программа. Если текстурой владеет Helianthus (own — TRUE), то текстуру из OpenGL удалит Helianthus сам в том момент когда ни одна анимация больше не будет на неё ссылаться. В противном случае вы сами должны позаботиться об удалении текстуры, проконтролировав при этом, что ни одна анимация больше эту текстуру не использует.

Используйте эту функцию если, например, вы не хотите чтобы Helianthus удалил из памяти вашу собственную текстуру, которую вы ему передали через функцию createAnimationFromGLTexId.

Параметры:

texid — внутренный идентификатор текстуры OpenGL;
own — если TRUE, то об удалении текстуры из видео-памяти позаботится Helianthus, если FALSE, то удалить текстуру должена будет ваша программа.

int animationGetFramesCount(Animation animation);

Возвращает количество кадров в данной анимации.

void animationInsert(Animation animation, int index, Animation other);

Вставить все кадры из анимации other в заданную анимацию, таким образом, что бы вновь вставленные кадры начинались с номера index.

Функция не затирает старые кадры, а вставляет новые прямо в середину анимации, сдвигая при этом последние кадры.

См. также animationInsertEx, animationCloneEx.

Параметры:

index — определяет место (номер кадра, нумерация от нуля) в текущей анимации куда нужно вставить новые кадры;
other — другая анимация кадры из которой нужно вставить в текущую.

void animationInsertEx(Animation animation, int index, Animation other, int start, int count);

Вставить некоторое количество подряд идущих кадров из анимации other в заданную анимацию, таким образом, что бы вновь вставленные кадры начинались с номера index.

Функция не затирает старые кадры, а вставляет новые прямо в середину анимации, сдвигая при этом последние кадры.

См. также animationInsert, animationCloneEx.

Параметры:

index — определяет место (номер кадра, нумерация от нуля) в текущей анимации куда нужно вставить новые кадры;
other — другая анимация кадры из которой нужно вставить в текущую;
start — номер вставляемого первого кадра из другой анимации;
count — количество кадров для вставки.

void animationRemove(Animation animation, int start, int count);

Удалить некоторое количество (count) кадров из анимации начиная с кадра номер start.
См. также animationInsert, animationClear.

Параметры:

start — номер первого удаляемого кадра (нумерация с нуля);
count — количество кадров для вставки.

void animationClear(Animation animation);

Удалить все кадры из анимации. См. также animationRemove, animationInsert, createAnimationEmpty.

double animationGetFps(Animation animation);

Возвращает скорость воспроизведения анимации в кадрах в секунду. См. также animationSetFps, animationPlay.

void animationSetFps(Animation animation, double fps);

Устанавливает скорость воспроизведения анимации в кадрах в секунду. См. также animationGetFps, animationPlay.

int animationIsPlaying(Animation animation);

Возвращает TRUE если воспроизведение в данный момент включено и FALSE если выключено. См. также animationPlay, animationPause.

void animationPlay(Animation animation);

Включает воспроизведение анимации. Внутренний счётчик времени будет автоматически обновляться библиотекой Helianthus между вызовами функции перерисовки кадра (windowSetDraw).

Если вы хотите управлять анимацией вручную, то не вызывайте эту функцию, а воспользуйтесь функциями animationAddTime, animationSetPos, animationNextFrame, animationSetFrame.

См. также animationPause, animationIsPlaying, animationSetFps, animationSetLoop.

void animationPause(Animation animation);

Остановить воспроизведение анимации. См. также animationPlay, animationIsPlaying.

void animationAddTime(Animation animation, double time);

Увеличить позицию анимации на время time (в секундах). См. также animationPlay, animationSetLoop, animationSetPos, animationNextFrame, animationSetFrame.

int animationGetLoop(Animation animation);

Возвращает TRUE если анимация зациклена и FALSE если нет. См. также animationSetLoop.

void animationSetLoop(Animation animation, int loop);

Функция включает (loop - TRUE) и отключает (loop - FALSE) циклическое воспроизведение анимации, когда анимация повторяется снова и снова, вместо того чтобы остановиться на последнем кадре. См. также animationGetLoop, animationPlay.

double animationGetPos(Animation animation);

Возвращает текущую позицию анимации в секундах. См. также animationSetPos.

void animationSetPos(Animation animation, double pos);

Функция задаёт текущую позицию анимации в секундах. См. также animationGetPos, animationAddTime, animationSetFrame, animationPlay.

int animationGetFrame(Animation animation);

Возвращает номер текущего кадра анимации, нумерация от нуля. См. также animationSetFrame.

void animationSetFrame(Animation animation, int frame);

Функция перематывает анимацию к кадру с заданным номером (нумерация от нуля). См. также animationGetFrame, animationGetFramesCount, animationNextFrame, animationSetPos, animationSetLoop, animationPlay.

void animationNextFrame(Animation animation);

Переключает анимацию на следующий кадр. См. также animationPlay, animationSetLoop, animationSetFrame, animationAddTime, animationSetPos.

int imageLoad(const char *path, int *outWidth, int *outHeight, unsigned char **outPixels);

Функция загружает изображение из файла PNG. Возвращает TRUE если загрузка прошла успешно и FALSE если загрузить файл не удалось.

В результате загрузки в переменные по адресам outWidth и outHeight будут помещены соответственно ширина и высота картинки. В переменную по адресу outPixels будет помещён указатель на пиксели картинки. Пиксели записываются в формате RGBA32 — для каждого пикселя последовательно идут 4 байта отвечающие за интенсивность каждой цветовой составляющей — красный, зелёный, синий, непрозрачность (alpha) — именно в таком порядке. Пиксели записаны по строкам сверху вниз, слева на право.

В работе с пикселями вам помогут функции imageGetPixel, imageSetPixel.

Функция, в случае успешной загрузки изображения, динамически выделяет память под пиксели, и, вам после использования нужно эту память освободить обратившись к стандартной функции free.

В случае если загрузка не удалась в качестве ширины и высоты будет записан ноль, в качестве указателя на пиксели будет записан нулевой указатель — NULL.

См. также imageSave, imageLoadFromMemory, imageFromViewport, imageToGLTexture.

Параметры:

path — путь к файлу изображения;
outWidth — указатель на переменную куда будет записана ширина загруженного изображения в пикселях;
outHeight — указатель на переменную куда будет записана высота загруженного изображения в пикселях;
outPixels — указатель на переменную куда будет записан указатель на массив пикселей изображения.

int imageLoadFromMemory(const void *data, int size, int *outWidth, int *outHeight, unsigned char **outPixels);

Загрузить изображение из данных файла PNG ранее загруженных в оперативную память.

Эта функция может быть вам полезна если вы хотите хранить все ваши изображения прямо внутри исполняемого файла. Например, при помощи утилиты xxd (в Linux) или подобной ей для вашей операционной системы, вы можете сгенерировать файл на языке Си с массивом содержащим все байты файла изображения. Данная функция позволит вам распаковать изображения из этого массива и получить доступ к его пикселям.

Возвращает TRUE если загрузка прошла успешно и FALSE если распаковать изображение не удалось.

См. также imageLoad.

Параметры:

data — указатель на первый байт данных PNG;
size — количество байт данных PNG;
outWidth — указатель на переменную куда будет записана ширина загруженного изображения в пикселях;
outHeight — указатель на переменную куда будет записана высота загруженного изображения в пикселях;
outPixels — указатель на переменную куда будет записан указатель на массив пикселей изображения.

int imageSave(const char *path, int width, int height, const void *pixels);

Функция сохраняет изображение в файл PNG по заданному пути. Возвращает TRUE при успешном сохранении и FALSE если сохранить изображение не удалось.

См. также imageLoad, viewportSave.

Важно: Если файл по указанному пути уже существует, то он будет перезаписан. Вы может проверить существование файла функцией fileExists.

Параметры:

path — путь к файлу в который нужно записать изображение;
width — ширина изображения в пикселях;
height — высота изображения в пикселях;
pixels — указатель на массив пикселей изображения, формат смотрите в описании к функции imageLoad.

unsigned int imageToGLTexture(int width, int height, const void *pixels, int wrap);

Загрузить изображение в текстуру OpenGL. В случае успешной функция возвращает идентификатор текстуры OpenGL, и возвращает ноль если загрузка не удалась.

Во время загрузки создаётся копия данных изображения в видео-памяти и оригинальное изображение можно выгрузить из памяти.

См. также imageToGLTextureEx, imageToExistingGLTexture, imageLoad.

Параметры:

width — ширина изображения в пикселях;
height — высота изображения в пикселях;
pixels — указатель на массив пикселей изображения, формат смотрите в описании к функции imageLoad;
wrap — если TRUE то узор текстуры будет повторяющимся по горизонтали и вертикали.

unsigned int imageToGLTextureEx(int width, int height, const void *pixels, int horWrap, int vertWrap, int smooth, int mipMap);

Загрузить изображение в текстуру OpenGL. В случае успешной функция возвращает идентификатор текстуры OpenGL, и возвращает ноль если загрузка не удалась.

Во время загрузки создаётся копия данных изображения в видео-памяти и оригинальное изображение можно выгрузить из памяти.

Вы можете включить или выключить бесконечное повторение узора текстуры по горизонтали и/или вертикали (параметры horWrap и vertWrap соответственно). Также вы можете включить сглаживание пикселей изображения (smooth, билинейная или трилинейная фильтрация) и включить построение mip-уровней (mipMap).

См. также imageToGLTexture, imageToExistingGLTexture, imageLoad.

Параметры:

width — ширина изображения в пикселях;
height — высота изображения в пикселях;
pixels — указатель на массив пикселей изображения, формат смотрите в описании к функции imageLoad;
horWrap — включить бесконечное повторение узора текстуры по горизонтали (TRUE или FALSE);
vertWrap — включить бесконечное повторение узора текстуры по вертикали (TRUE или FALSE);
smooth — включить сглаживание (TRUE или FALSE);
mipMap — включить построение mip-уровней (TRUE или FALSE).

int imageToExistingGLTexture(unsigned int texid, int width, int height, const void *pixels);

Заменить пиксели существующей текстуры. Возвращает TRUE в случае успеха, иначе FALSE.

См. также imageToGLTexture, imageToGLTextureEx.

Параметры:

texid — идентификатор существующей текстуры OpenGL;
width — ширина изображения в пикселях;
height — высота изображения в пикселях;
pixels — указатель на массив пикселей изображения, формат смотрите в описании к функции imageLoad.

int imageFromGLTexture(unsigned int texid, int *outWidth, int *outHeight, unsigned char **outPixels);

Получить пиксели из текстуры OpenGL. Пиксели копируются в новый массив, память для которого выделяется динамически. Поэтому вам, также как при работе с imageLoad, нужно после использования освободить выделенную под пиксели память при помощи стандартной функции free.

Функция возвращает TRUE в случае успеха, иначе FALSE.

См. также imageLoad.

Параметры:

texid — идентификатор текстуры OpenGL;
outWidth — указатель на переменную куда будет записана ширина загруженного изображения в пикселях;
outHeight — указатель на переменную куда будет записана высота загруженного изображения в пикселях;
outPixels — указатель на переменную куда будет записан указатель на массив пикселей изображения.

int imageFromViewport(int *outWidth, int *outHeight, unsigned char **outPixels);

Получить пиксели изображения из текущей области вывода OpenGL. Пиксели копируются в новый массив, память для которого выделяется динамически. Поэтому вам, также как при работе с imageLoad, нужно после использования освободить выделенную под пиксели память при помощи стандартной функции free.

Функция возвращает TRUE в случае успеха, иначе FALSE.

См. также imageLoad.

Параметры:

outWidth — указатель на переменную куда будет записана ширина загруженного изображения в пикселях;
outHeight — указатель на переменную куда будет записана высота загруженного изображения в пикселях;
outPixels — указатель на переменную куда будет записан указатель на массив пикселей изображения.

int viewportSave(const char *path);

Сохранить изображение из текущей области рисования OpenGL в файл. Обычно используется чтобы сделать снимок экрана (сохраняется только внутренняя область окна программы).

Функция возвращает TRUE в случае успеха, иначе FALSE.

См. также imageSave, imageFromViewport.

Важно: Если файл по указанному пути уже существует, то он будет перезаписан. Вы может проверить существование файла функцией fileExists.

unsigned int pixelGet(const void *pixel);

Сконвертировать пиксель в формате RGBA32, который используется в функции imageLoad в код цвета Helianthus. См. также pixelSet, imageGetPixel.

void pixelSet(void *pixel, unsigned int colorCode);

Записать цвет в пиксель в формате RGBA32, который используется в функции imageLoad. См. также pixelGet, imageSetPixel.

unsigned int imageGetPixel(int width, int height, const void *pixels, int x, int y);

Получить цвет пикселя изображения. См. также imageSetPixel, pixelGet, imageLoad.

Параметры:

width — ширина изображения в пикселях;
height — высота изображения в пикселях;
pixels — указатель на массив пикселей изображения, формат смотрите в описании к функции imageLoad;
x, y — координаты пикселя.

void imageSetPixel(int width, int height, void *pixels, int x, int y, unsigned int colorCode);

Установить цвет пикселя изображения. См. также imageGetPixel, pixelSet, imageLoad.

Параметры:

width — ширина изображения в пикселях;
height — высота изображения в пикселях;
pixels — указатель на массив пикселей изображения, формат смотрите в описании к функции imageLoad;
x, y — координаты пикселя,
colorCode — код цвета.