Пиксельные форматы
Когда графический режим установлен с помощью функций
Screen или
ScreenRes
, GfxLib создает кадровый буфер в стандартной системной памяти и
устанавливает соответствующий внутренний пиксельный формат для режима. Есть
в основном три внутренних пиксельных формата, отобранные в зависимости от
глубины экрана, как описано в следующей таблице:
Глубина экрана | Байт на пиксель |
Диапазон битовой маски | Пиксельный формат |
1bpp | 1 | &h1 |
индекс цвета палитры |
2bpp | 1 | &h3 |
индекс цвета палитры |
4bpp | 1 | &hF |
индекс цвета палитры |
8bpp | 1 | &hFF |
индекс цвета палитры |
15/16bpp | 2 | &hFFFF | RRRRRGGGGGGBBBBB |
24/32bpp | 4 | &hFFFFFFFF | AAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB |
Все операции рисования проводятся с памятью кадрового буфера 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
может быть использована для получения полезных свойств о буфере изображения
, например: его размеры, глубина цвета, размер пиксельного ряда, и указатель
на данные пикселей в зависимости от используемого формата.
Также возможно получить доступ к заголовку изображения непосредственно,
чтобы получить доступ к этой информации. Для получения дополнительной
информации, обратитесь к
этому
примеру.
См. также