Внутренние графические форматы
 

Пиксельные форматы

Когда графический режим установлен с помощью функций Screen или ScreenRes , GfxLib создает кадровый буфер в стандартной системной памяти и устанавливает соответствующий внутренний пиксельный формат для режима. Есть в основном три внутренних пиксельных формата, отобранные в зависимости от глубины экрана, как описано в следующей таблице:

Глубина экранаБайт на пиксель Диапазон битовой маскиПиксельный формат
1bpp 1 &h1 индекс цвета палитры
2bpp 1 &h3 индекс цвета палитры
4bpp 1 &hF индекс цвета палитры
8bpp 1 &hFF индекс цвета палитры
15/16bpp 2 &hFFFFRRRRRGGGGGGBBBBB
24/32bpp 4 &hFFFFFFFFAAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB


Все операции рисования проводятся с памятью кадрового буфера RAM буфер кадров; когда обновляется реальное отображение, GfxLib копирует содержимое кадрового буфера в память реального отображения, в процессе автоматически преобразовывая из текущего внутреннего формата пикселя в реальный формат дисплея. Ограничивая кол-во внутренних пиксельных форматов до 3, библиотека упрощает вам работу, поскольку избавляет от необходимости работать с множеством реальных форматов отображения.

Значения цвета

Вызов графических примитивов, принимающих цвет, может быть определен двумя способами. В режиме 8bpp или меньше, насыщенность цвета должна быть 8-битным показателем цвета в текущей палитре, и это соответствует внутреннему пиксельному формату для режима. В более высокой глубине цвета у насыщенности цвета должна всегда быть форма &hAARRGGBB; это - то, что возвращают макросы RGB и RGBA и эквивалентно 24/32bpp внутреннему пиксельному представлению формата. Если текущая глубина цвета 24 или 32bpp, то это означает, что значение цвета проходит в неизменном виде. Если режим 15/16bpp находится в использовании, внутренне каждый примитив автоматически преобразует цвет из вида &hAARRGGBB, во внутренний формат пикселя RRRRRGGGGGGBBBBB (обратите внимание, что в этом процессе альфа-канал теряется, так как режимы 15/16bpp не поддерживают его). После того, как значение цвета оказывается в одном из трех пиксельных форматов, примитивы ограничиваются в должном диапазоне в соответствии с текущей глубиной цвета, при этом используя логические операции And с диапазоном битовой маски. Поэтому, если режим 8bpp, значение цвета подвергаются операциям And в вид &HFF(для примера).

Заметки о прозрачности

Для режима 8bpp или меньше, 0 индекс цвета всегда рассматривается в качестве прозрачного цвета для режима Put , который поддерживает прозрачность. Для более высокой глубины, значение RGB(255, 0, 255) представляет прозрачный цвет. В режимах 15/16bpp, это приводит к внутреннему значению hF81F, в то время как в режимах 24/32bpp становится hFFFF00FF. Обратите внимание, что в режимах 24/32bpp, Put идентифицирует прозрачный цвет, глядя только на красный , зеленый и синий компоненты значений цвета, в то время как альфа-значение может принимать любое значение. Это означает, что в 24/32bpp режимах, значения &h00FF00FF, &h10FF00FF, &hABFF00FF и &hFFFF00FF представляют собой прозрачный цвет, так как нижние 24 бит всегда равны &hFF00FF.

Форматы буфера

В FreeBASIC, изображения могут быть использованы как массивы (как в QB) или в качестве указателей. В любом случае, данные изображения, содержатся в одном непрерывном куске. Кусок состоит из заголовка, за которым следуют данные изображения. Заголовок может быть двух типов (старого стиля и нового стиля) и определяет следующий формат данных изображения.

Старый-стиль заголовок куска состоит из 4 байтов (32 бита, или 4 байтов). Первые 3 бита содержат глубину цвета изображения в байтах на пиксель (8-битная глубина цвета -> 1; 16-битная глубина цвета -> 2; 32-битная глубина цвета -> 4). Следующие 13 бит содержат ширину изображения. Последние 16 бит содержат высоту изображения. Обратите внимание, что внутренняя природа заголовка позволяет только размеры до 8191 * 65535 пикселей. Фактические данные пикселя идут после заголовка, и уплотняются один ряд пикселей за другим; не неся выравнивание данных. Окончательный размер фрагмента может быть вычислен по формуле:

size = 4 + ( width * height * bytes_per_pixel )

Новый-стиль заголовок куска состоит из 32 байтов. Первый DWORD(32 бита) должен быть равным значению 7, позволяя GfxLib определить новый тип куска. Второй DWORD содержит глубину цвета изображения в байтах на пиксель. Третий и четвертый DWORD содержат ширину и высоту изображения соответственно, эффективно стирая предел размера изображения старого стиля. Пятый DWORD содержит пиксельный ряд в байтах; это говорит, сколько байт занимает каждый ряд пикселов в изображении. Ряд в новом стиле всегда дополняется до кратного 16, чтобы позволить данным выравниваться по границе параграфа. Остальные 3 DWORD (всего 12 байт) заголовка в настоящее время не используются и зарезервированы для использования в будущем. Окончательный размер изображения:

size = 32 + ( ( ( ( width * bytes_per_pixel ) + &hF ) and not &hF ) * height )

Формат изображения, созданный при помощи ImageCreate и Get зависит от диалекта. В -lang fb диалекте, изображения создаются с новым стилем заголовка. В -lang fblite и -lang qb диалектах, старый стиль заголовка используется.

Все графические примитивы могут работать как со старым стилем и так и с новым. Для облегчения доступа к информации об изображении, ImageInfo может быть использована для получения полезных свойств о буфере изображения , например: его размеры, глубина цвета, размер пиксельного ряда, и указатель на данные пикселей  в зависимости от используемого формата.
Также возможно получить доступ к заголовку изображения непосредственно, чтобы получить доступ к этой информации. Для получения дополнительной информации, обратитесь к этому примеру.

См. также