Операторы
Операторы GET и PUT
Участок изображения иногда нужно сохранить, чтобы восстановить его позже, перенести в другую точку или наложить на уже нарисованное. Для этого служит пара операторов: GET считывает прямоугольный блок пикселей в двумерный числовой массив, а PUT рисует сохранённый блок на поверхности.
Массивный аргумент-имя записывается с обязательными квадратными скобками [], например GET (5, 5)-(5, 5), pixel[]. Круглые скобки координат не меняются.
Что даёт буфер пикселей
Оператор GET считывает прямоугольник активной графической поверхности в подготовленный массив. Оператор PUT выводит массив на активную поверхность с выбранным действием наложения. Буфер позволяет сохранить участок изображения, восстановить его позже, перенести в другую точку или выполнить побитовое наложение.
Массивы GET и PUT хранят индексные цвета в обоих графических режимах. Для полноцветных ресурсов предназначены IMAGE и SPRITE.
Где работают операторы
Перед обменом откройте графический SCREEN 1..10 или холст CANVAS. В режиме SCREEN координаты преобразуются текущими операторами VIEW и WINDOW. На холсте CANVAS передаются мировые координаты: камера преобразует их, а область VIEWPORT ограничивает доступные пиксели.
Синтаксис
GET (<начальный X>, <начальный Y>)-(<конечный X>, <конечный Y>), <буфер>
GET STEP (<начальный X>, <начальный Y>)-STEP (<конечный X>, <конечный Y>), <буфер>
PUT (<координата X>, <координата Y>), <буфер>
PUT STEP (<координата X>, <координата Y>), <буфер>
PUT (<координата X>, <координата Y>), <буфер>, PSET
PUT (<координата X>, <координата Y>), <буфер>, PRESET
PUT (<координата X>, <координата Y>), <буфер>, AND
PUT (<координата X>, <координата Y>), <буфер>, OR
PUT (<координата X>, <координата Y>), <буфер>, XOR
Аргументы
| Часть | Описание |
|---|---|
<начальный X>, <начальный Y>, <конечный X>, <конечный Y> | Передайте координаты двух углов прямоугольника для GET. В SCREEN это экранные координаты с учётом VIEW и WINDOW. В CANVAS это мировые координаты. Каждый перечисленный аргумент имеет тип LONG. |
<координата X>, <координата Y> | Передайте координаты левой верхней точки, куда оператор PUT начнёт выводить буфер. В CANVAS это тоже мировая точка. Каждый перечисленный аргумент имеет тип LONG. |
STEP | Слово STEP задаёт относительные координаты от текущей графической позиции. У GET вторая точка со словом STEP считается относительно уже вычисленной первой точки. У PUT STEP точка считается относительно текущей графической позиции. |
<буфер> | Передайте двумерный числовой массив ранга 2. Первая размерность задаёт ширину блока по оси X, вторая размерность задаёт высоту блока по оси Y. |
PSET, PRESET, AND, OR, XOR | Действие оператора PUT. Если действие не указано, по умолчанию используется XOR. |
Как устроен буфер
Оператор GET вычисляет прямоугольник и заполняет видимую форму массива buffer[] считанными пикселями. Оператор PUT читает всю видимую форму массива и располагает её начиная с указанной точки. В каждом элементе буфера хранится индекс 0..255; полноцветные значения не сохраняются в этом формате даже при обмене с CANVAS.
Массив должен быть выделен заранее и иметь два измерения. Поддерживаются элементы INTEGER, LONG, DOUBLE и DECIMAL. Видимые ширина и высота массива должны точно соответствовать прямоугольнику GET; несовпадение размеров вызывает ошибку выполнения. При выводе каждый элемент нормализуется по формуле ABS(TRUNC(value)) MOD 256.
Действия PUT
Действие определяет, как цвет буфера сочетается с уже нарисованным пикселем. Если действие не указано, применяется XOR.
| Действие | Результат |
|---|---|
PSET | Целевой пиксель получает цвет из буфера. |
PRESET | Целевой пиксель получает значение 255 - source. |
AND | Новый цвет равен destination AND source. |
OR | Новый цвет равен destination OR source. |
XOR | Новый цвет равен destination XOR source. |
Координаты, обрезка и момент показа
Все координаты GET и PUT приводятся к LONG, и обе границы захватываемого прямоугольника включаются. GET не выделяет память под массив и не меняет его размеры. За пределами поверхности или области вывода GET записывает в буфер 0, а PUT пропускает рисование; доступная часть прямоугольника при этом обрабатывается.
На холсте действуют камера и VIEWPORT; настройки VIEW и WINDOW относятся к экрану SCREEN. Проверка результата на холсте идёт по физической точке в POINT(x, y): при VIEWPORT (10, 6)-(15, 11) и CAMERA 100, 50 вызов PUT (100, 50), buffer[], PSET записывает первый элемент в (10, 6), и POINT(10, 6) читает этот пиксель без повторного смещения камеры.
Момент показа различается у операторов: GET только читает поверхность и не показывает новый кадр, а PUT изменяет активную страницу SCREEN или рабочий кадр CANVAS. В открытом кадре холста для показа результата требуется PRESENT; вне открытого кадра действует автоматическое обновление.
Предельные индексы и целостность записи
Операторы GET и PUT поддерживают произвольные допустимые нижние границы массива, в том числе одноэлементное измерение 2147483647 TO 2147483647. Недостаток памяти для временного графического буфера вызывает MB3005, которую можно перехватить через TRY...CATCH. Графический буфер может содержать не более 16 777 216 элементов; превышение вызывает MB3007.
Оператор PUT проверяет все исходные элементы до первой записи. Если числовое значение нельзя использовать как цвет, возникает MB3007, а изображение остаётся прежним. На DirectX готовый прямоугольник передаётся пакетно; действия PSET и PRESET не требуют чтения прежних пикселей. Область отсечения и начало массива не изменяют смысл действий AND, OR и XOR.
SCREEN 1
DIM pixel[2147483647 TO 2147483647, 0 TO 0] AS INTEGER
PSET (5, 5), 12
GET (5, 5)-(5, 5), pixel[]
PUT (10, 10), pixel[], PSET
PRINT pixel[2147483647, 0]Программа печатает 12 и копирует красный пиксель. Другие исправленные границы показывает запускаемый пример графического аудита. В открытом кадре CANVAS результат становится виден после PRESENT; вне открытого кадра действует автоматическое обновление.
Диагностика
MB3010: операторGETили операторPUTвызван без активногоSCREENи без активногоCANVAS.MB3007: массивbuffer[]не является выделенным двумерным числовым массивом, размеры буфера не совпали с прямоугольникомGET, координаты недопустимы или значение буфера уPUTне приводится к корректному числу.
Пример
CANVAS 24, 18
CLS RGB(0, 0, 0)
VIEWPORT (10, 6)-(15, 11)
CAMERA 100, 50
DIM buffer[1 TO 2, 5 TO 6] AS INTEGER
PSET (100, 50), 6
PSET (101, 50), 9
PSET (100, 51), 12
PSET (101, 51), 15
GET (100, 50)-(101, 51), buffer[]
PUT (102, 50), buffer[], PSET
PRESENT
SLEEP
Четыре вызова PSET заполняют блок два на два мировыми координатами, затем GET считывает его в массив, размеры которого совпадают с прямоугольником. Вызов PUT со словом PSET копирует блок правее без наложения на прежние пиксели, а PRESENT показывает рабочий кадр холста.
Запускаемые примеры
Перечисленные программы можно запустить в Electron IDE для проверки чтения буфера, наложения и обрезки.