Pixilang - пиксельно-ориентированный язык программирования для небольших графических/звуковых приложений (демки, игры, синтезаторы, эксперименты и т.п.).
Pixilang-программы хранятся в текстовых файлах (кодировка UTF-8) с расширением .txt или .pixi. Поэтому вы можете использовать любой текстовый редактор для создания таких программ. Pixilang не имеет встроенного редактора. После старта появляется файловый диалог, в котором нужно указать, где лежит запускаемая pixi-программа.
Программа может быть простым списком инструкций с условными переходами, без объявления точек входа. Сразу после старта программе выделяется чистая область (экран) внутри окна, к которой можно обращаться как к массиву пикселей и использовать готовые графические примитивы.
При запуске из командной строки Pixilang принимает дополнительные опции в приведенном ниже формате.pixilang [options] [filename] [arg]
Options:
-? показать описание опций (данный текст)
clearall сбросить все настройки
-cfg <config> дополнительная конфигурация в формате:
"OPTION1=VALUE|OPTION2=VALUE|..."
-c генерация байт-кода; будет создан файл filename.pixicode
Filename: исходный код (текстовый файл) или байткод (*.pixicode).
Дополнительные аргументы (arg): какие-то опции для Pixilang-программы.
Примечание: файлы в формате *.pixicode привязаны к архитектуре и могут неправильно работать на других устройствах.
В основе Pixilang - контейнеры (или pixi-контейнеры, как их иногда называют) и переменные.
Контейнер - это двумерный массив, таблица из X колонок и Y строк. Каждая ячейка этой таблицы - число определенного типа. Тип задан один на весь контейнер. Например, ячейки могут хранить цвета пикселей, тогда контейнер превращается в картинку. Контейнер может быть строкой текста, куском звука и т.д. Если вы знакомы с другими языками программирования, то считайте контейнер массивом, состоящим из (X*Y) ячеек. Каждый контейнер после создания имеет свой ID (порядковый номер): 0,1,2,3 и т.д. Нулевой ID по умолчанию указывает на контейнер с экраном.
Структура контейнера:
Максимальное количество контейнеров в программе - 8192. Но это число можно увеличить через параметр pixi_containers_num в файле конфигурации pixilang_config.ini.Кроме того, если вы собираете Pixilang из исходников, кол-во контейнеров можно указать в файле app_info.cpp, используя такой код:app_option g_app_options[] = { { "pixi_containers_num", 16384 }, { NULL } };
Переменная - имя ячейки памяти, в которой хранится одно знаковое целое 32-битное число (например, 25) или 32-битное число с плавающей запятой (например, 33.44). Локальные переменные (с символом $ перед именем) доступны только в рамках одной функции, в которой эти переменные определены. Глобальные переменные (без символа $) доступны в любом месте программы.
Числа можно описывать в различных форматах. Примеры:
Простейшие примеры применения контейнеров и переменных:x = new( 4 ) //Создаем контейнер из 4-х пикселей. Сохраняем ID контейнера в переменную x.
/*
Элементы контейнера адресуются с нуля:
первый элемент - x[ 0 ];
второй элемент - x[ 1 ];
...
последний элемент - x[ размер - 1 ];
*/
x[ 0 ] = #0000FF //Записываем значение синего цвета в первый пиксель контейнера.
x[ 2 ] = WHITE //Записываем значение белого цвета в пиксель 2.
x[ 3 ] = RED //Записываем значение белого цвета в пиксель 3.
x[ 4 ] = BLUE //Здесь ничего не произойдет, т.к. элемента под номером 4 не существует.
b = x[ 2 ] //Читаем элемент 2
//Теперь переменная b содержит число, соответствующее белому цвету.
v = x[ 8 ] //Пытаемся прочитать элемент 8
//Переменная v содержит ноль, т.к. элемент 8 прочитать не удалось
remove( x ) //Удаляем контейнер
c = new( 4, 4 ) //Создаем 2D контейнер 4 на 4 пикселя. Сохраняем ID контейнера в переменную c.
c[ 2, 2 ] = WHITE //Присваиваем пикселю с координатами 2,2 (относительно левого верхнего угла) белый цвет.
remove( c ) //Удаляем контейнер
str = "Hello" //"Hello" - это строковый контейнер, состоящий из пяти 8-битных символов (кодировка UTF-8).
/*
Подобные контейнеры-строки создаются автоматически на этапе компиляции программы.
Удалять их вручную так, как это сделано в предыдущем примере, не надо.
Контейнеру со строкой "Hello" автоматически присвоится ID (порядковый номер).
Например, ID будет равен 4.
Тогда код str = "Hello" будет равноценен коду str = 4.
*/
str[ 0 ] = 'h' //Меняем самую первую букву в строке. Было - 'H'. Станет - 'h'.
str[ 2 ] = 0 //Меняем букву 'l' на нулевой символ, означающий конец строки
//...теперь строка превратилась в "he".
//Конец строки - это либо нулевой символ, либо конец контейнера.
a = 4 //Глобальная переменная
fn function()
{
$k = 2 //Локальная переменная
function2 = {
//Определяем еще одну функцию
$x = 899.334 //Локальная переменная
//В этом месте $k недоступна, т.к. находится в другой функции
}
//В этом месте $x недоступна
}
//В этом месте $k и $x недоступны
Система координат Pixilang представлена на следующей картинке:
Ниже приведены примеры, показывающие основные правила оформления имен файлов и директорий.//Файл спрятан в нескольких директориях относительно текущего местоположения пикси-программы:
"folder1/folder2/folder3/filename"
//Файл лежит в текущей рабочей папке Pixilang:
// iOS: documents;
// WinCE: корень файловой системы (/);
// для остальных систем: в той же самой папке, в которой лежит Pixilang;
"1:/filename"
//Файл лежит в директории для настроек и скрытых данных приложения:
// Linux: /home/username/.config/Pixilang;
// iOS: папка для файлов приложения (NSApplicationSupportDirectory);
// Android: папка с настройками на внутренней карте памяти устройства;
"2:/filename"
//Файл лежит во временной директории:
"3:/filename"
Рассмотрим операторы на конкретных примерах.
//Условные операторы if, else
if a == b
{ /*Код в этом месте выполняется, если a равно b*/ }
else
{ /*Код в этом месте выполняется в противном случае (a не равно b)*/ }
if x == 4 && y == 2
{ /*Код в этом месте выполняется, если x равно 4 и y равно 2*/ }
//Оператор цикла: while
a = 0
while( a < 3 )
{
//Код в этом месте выполняется, если a меньше 3
a + 3
}
//Операторы цикла: while, break
a = 0
while( a < 100 )
{
//Код в этом месте выполняется, если a меньше 100
if a == 10 { break } //Если a = 10, то разрываем цикл оператором break
//Для остановки нескольких вложенных циклов сразу можно использовать оператор breakX,
//где X - глубина. Например break2 остановит два цикла.
//А при помощи оператора breakall можно остановить все циклы,
//которые активны в данный момент для текущего потока выполнения.
a + 1
}
//Операторы цикла: while, continue
a = 0
b = 0
while( a < 100 )
{
//Код в этом месте выполняется, если a меньше 100
if a == 10 { a + 1 continue } //Если a = 10, то переходим к следующей итерации цикла
// (игнорируем следующие две строчки кода)
a + 1
b + 1
}
//Цикл for( инициализация ; условие выполнения цикла ; модификация ) { тело цикла }
for( i = 0; i < 4; i + 1 )
{
printf( "i=%d\n", i )
}
//Операторы перехода: go, goto
m1:
a + 1
goto m1 //Переход на метку m1
//Операторы остановки: halt, stop
halt //В этом месте программа останавливается
//Оператор подключения: include
include "prog2.txt" //В этом месте подключаем код из файла prog2.txt
//Оператор определения функции: fn
fn fff( $x, $y ) //Определяем функцию fff с параметрами $x и $y
{
//Код функции fff
ret //Простой выход из функции
ret( 4 ) //Выход из функции с возвращением значения 4
}
Ниже приведена таблица математических операторов. Приоритет 0 - наивысший, такие операции будут выполняться в первую очередь.
Приоритет | Оператор | Описание | Результат | Пример |
---|---|---|---|---|
0 | % | Деление по модулю | Целое число | a = b % 4 |
0 | / | Деление | Число с плавающей запятой | a = b / 4 |
0 | div | Целочисленное деление | Целое число | a = b div 4 |
0 | * | Умножение | Зависит от операндов | a = b * 4 |
0 | ! | Логическое отрицание (НЕ) | Целое число 1 или 0 | if !условие { ... } |
0 | ~ | Побитовая инверсия | Целое число | a = ~b |
1 | + | Сложение | Зависит от операндов | a = b + 4 |
1 | - | Вычитание | Зависит от операндов | a = b - 4 |
2 | >> | Битовый сдвиг вправо | Целое число | a = b >> 4 |
2 | << | Битовый сдвиг влево | Целое число | a = b << 4 |
3 | == | Равно | Целое число 1 или 0 | if a == b {} |
3 | != | Не равно | Целое число 1 или 0 | if a != b {} |
3 | < | Меньше | Целое число 1 или 0 | if a < b {} |
3 | > | Больше | Целое число 1 или 0 | if a > b {} |
3 | <= | Меньше или равно | Целое число 1 или 0 | if a <= b {} |
3 | >= | Больше или равно | Целое число 1 или 0 | if a >= b {} |
4 | | | Побитовая операция ИЛИ (OR) | Целое число | a = b | 4 |
4 | ^ | Побитовая операция исключающего ИЛИ (XOR) | Целое число | a = b ^ 4 |
4 | & | Побитовая операция И (AND) | Целое число | a = b & 4 |
5 | || | Логическая операция ИЛИ (OR) | Целое число 1 или 0 | if a || b {} |
5 | && | Логическая операция И (AND) | Целое число 1 или 0 | if a && b {} |
Контейнер может содержать элементы одного из нижеперечисленных типов.
64-битные типы в текущей версии не поддерживается, но поддержка может быть включена при самостоятельной сборке Pixilang из исходников. Для включения необходимо внести небольшие правки в файле pixilang.h в разделе Configuration.
Уровни компрессии:
R - чтение; W - запись.
Эти константы используются, например, при выводе текста. Их можно комбинировать при помощи побитовой операции ИЛИ (|). Отсутствие TOP и BOTTOM обозначает вертикальное выравнивание по центру. Отсутствие LEFT и RIGHT обозначает горизонтальное выравнивание по центру.
Типы эффектов для функции effector():
Режимы для gl_draw_arrays() (аналог функции glDrawArrays()):
Флаги для функции set_audio_callback():
Флаги для функций midi_get_device(), midi_open_port():
Флаги (опции) для thread_create():
Для функции op_cn():
Эти свойства могут использоваться при проигрывании, сохранении и загрузке контейнеров:
Создать новый контейнер с данными.
Сразу после создания контейнер может быть заполнен неопределенными значениями. Прежде чем читать из этого контейнера, его следует очистить функцией clean или заполнить полезными данными.
Параметры ( xsize, ysize, type )
Примерыp = new() //Создать контейнер 1x1. Тип = пиксели.
p = new( 4 ) //Создать контейнер 4x1. Тип = пиксели.
p = new( 4, 4 ) //Создать контейнер 4x4. Тип = пиксели.
p = new( 4, 4, FLOAT32 ) //Создать контейнер 4x4. Тип = 32-битные числа с плавающей запятой.
Удалить контейнер.
Параметры ( pixi )
p = new() //Создаем новый контейнер
remove( p ) //Удаляем его
Удалить контейнер и связанный с ним контейнер альфа-канала (прозрачность).
Параметры ( pixi )
Изменить параметры контейнера.
Параметры ( pixi, xsize, ysize, type, flags )
Возвращаемое значение: 0 - успешно; 1 - ошибка.
Примерыp = new() //Создаем новый контейнер 1x1
resize( p, 32 ) //Изменяем его размер на 32x1
remove( p ) //Удаляем контейнер
Перевернуть контейнер на угол angle*90 градусов, по часовой стрелке.
Параметры ( pixi, angle )
Преобразовать значения контейнера к другому типу.
Параметры ( pixi, new_type )
Очистить контейнер (заполнить нулями или указанным значением).
Параметры ( dest_cont, v, offset, count )
p = new() //Создаем новый контейнер
clean( p ) //Очищаем его
remove( p ) //И удаляем
Создать точную копию контейнера.
Параметры ( pixi )
Скопировать данные из контейнера src в контейнер dest.
Параметры ( dest, src, dest_offset, src_offset, count, dest_step, src_step, flags )
//Скопировать все элементы из контейнера img1 в img2:
copy( img2, img1 )
//Скопировать элементы 8...200 из контейнера img1 в img2:
copy( img2, img1, 8, 8, 200 )
//Скопировать 200 элементов начиная с 8 из контейнера img1 в img2 с шагом 2:
copy( img2, img1, 8, 8, 200, 2, 2 )
Возвращаемое значение: количество элементов, которые удалось успешно скопировать.
Получить размер контейнера (кол-во элементов).
Параметры ( pixi )
Размер контейнера (кол-во элементов).
Примерыp = new( 8, 8 ) //Создаем новый контейнер 8x8
size = get_size( p ) //Записываем его размер в переменную size
remove( p ) //Удаляем контейнер
Получить ширину контейнера.
Параметры ( pixi )
Примерыp = new( 8, 8 ) //Создаем новый контейнер 8x8
xsize = get_xsize( p ) //Записываем его ширину в переменную xsize
remove( p ) //Удаляем контейнер
Получить высоту контейнера.
Параметры ( pixi )
Примерыp = new( 8, 8 ) //Создаем новый контейнер 8x8
ysize = get_xsize( p ) //Записываем его высоту в переменную ysize
remove( p ) //Удаляем контейнер
Получить размер элемента контейнера (в байтах).
Параметры ( pixi )
Примерыp = new( 8, 8, INT16 ) //Создаем новый контейнер 8x8; тип элемента = INT16
esize = get_esize( p ) //Записываем размер его элемента в переменную esize
//Теперь в переменной esize находится число 2 (т.к. 16 бит - это два байта).
remove( p ) //Удаляем контейнер
Получить тип элемента контейнера.
Параметры ( pixi )
Примерыp = new( 8, 8, INT32 ) //Создаем новый контейнер 8x8; тип элемента = INT32
type = get_type( p ) //Записываем тип его элемента в переменную type
//Теперь в переменной type находится константа INT32.
remove( p ) //Удаляем контейнер
Получить флаги контейнера - 32-битное число, каждый бит в котором отвечает за включение/выключение какой-то опции контейнера.
Параметры ( pixi )
Установить флаги контейнера - 32-битное число, каждый бит в котором отвечает за включение/выключение какой-то опции контейнера.
Параметры ( pixi, flags )
set_flags( img, GL_MIN_LINEAR | GL_MAG_LINEAR )
Сбросить флаги контейнера.
Параметры ( pixi, flags )
Получить значение свойства контейнера. У каждого контейнера может быть неограниченное количество свойств.
Другой путь получения свойства контейнера - использовать оператор . (точка). Например: value = image.fps
Параметры ( pixi, prop_name, def_prop )
Установить значение свойства контейнера.
Другой путь установки свойства контейнера - использовать оператор . (точка). Например: image.fps = 20
Параметры ( pixi, prop_name, value )
p = new( 8, 8, INT32 ) //Создаем новый контейнер 8x8; тип элемента = INT32
set_prop( p, "speed", 777 ) //Добавляем свойство "speed" у созданного контейнера
v = get_prop( p, "speed" ) //Читаем значение этого свойства
//Теперь в переменной v лежит число 777
//Рассмотрим так же более простой способ работы со свойствами контейнера
//(при помощи оператора . (точка)):
p.speed = 777
v = p.speed
Удалить указанное свойство контейнера.
Parameters ( pixi, prop_name )
Удалить все свойства контейнера.
Параметры ( pixi )
Получить список свойств контейнера в виде массива строк.
Параметры ( pixi )
Удалить контейнер со списком свойств.
Параметры ( list )
Включить/выключить отладочные сообщения менеджера управления памятью.
Параметры ( enable )
Запаковать контейнер библиотекой Zlib.
Параметры ( source, level )
Распаковать контейнер библиотекой Zlib.
Параметры ( source )
Альтернативные имена: num2str.
Конвертировать число из переменной в текстовую строку (в контейнер).
Параметры ( str, num, radix, str_offset, no_null_term )
v = 45.64
s = ""
num_to_str( s, v )
fputs( s ) fputs( "\n" )
Альтернативные имена: str2num.
Конвертировать текста (из контейнера) в число.
Параметры ( str, str_offset, len )
Примерыa = str_to_num( "-55.44" )
b = a + 4
Добавляет строку source к строке destination. Обе строки должны заканчиваться символом с кодом 0, если кол-во остальных символов в строке меньше размера контейнера, в котором строка находится. После выполнения этой функции размер контейнера destination может увеличиться, если в нем не хватит места для строки source.
Параметры ( destination, source )
Параметры ( dest, dest_offset, source, source_offset )
Сравнивает две строки str1 и str2. Обе строки должны заканчиваться символом с кодом 0, если кол-во остальных символов в строке меньше размера контейнера, в котором строка находится.
Параметры ( str1, str2 )
Параметры ( str1, str1_offset, str2, str2_offset )
Возвращаемое значение:
Возвращает длину строки. Завершающий символ с кодом 0 не учитывается. Строки должна заканчиваться символом с кодом 0, если кол-во остальных символов в строке меньше размера контейнера, в котором строка находится.
Параметры ( str )
Параметры ( str, str_offset )
Возвращаемое значение: длина строки.
Ищет первое вхождение подстроки str2 в строке str1. Обе строки должны заканчиваться символом с кодом 0, если кол-во остальных символов в строке меньше размера контейнера, в котором строка находится.
Параметры ( str1, str2 )
Параметры ( str1, str1_offset, str2, str2_offset )
Возвращаемое значение: смещение подстроки str2 в строке str1 или -1, если подстрока не найдена.
Форматирует и запоминает наборы символов и значений в str. Каждый аргумент (если он есть), преобразуется и выводится согласно соответствующей спецификации формата в format. Подробное описание формата можно почитать здесь или в любой документации на функцию sprintf() языка Си/Си++. Контейнер str расширяется при необходимости.
Параметры ( str, format, ... )
Возвращаемое значение: количество символов, записанных в str или отрицательное значение в случае ошибки.
Примерыsprintf( str, "Some text" ) //Записать текст в контейнер str
//В результате контейнер str будет содержать следующую строку: "Some text"
sprintf( str, "Number: %d", 12 ) //Записать знаковое десятичное число
//В результате контейнер str будет содержать следующую строку: "Number: 12"
То же самое, что и sprintf(), но с дополнительными параметрами.
Параметры ( str, str_offset, no_null_term, format, ... )
Примерыstr = "######"
val = 24
sprintf2( str, 2, 1, "%d", val )
//теперь в контейнере str находится следующая строка:
//"##24##"
То же самое, что sprintf, только результат (набор символов и значений) записывается в поток STDOUT.
Параметры ( format, ... )
Форматный вывод текста в указанный поток (открытый функцией fopen() или fopen_mem()).
Параметры ( stream, format, ... )
Форматный вывод текста в буфер для логов (журнал событий). Формат такой же, как в printf.
Параметры ( format, ... )
Получить буфер с логом (журнал событий).
Возвращаемое значение: ID нового контейнера, в котором лежит свежий лог; (контейнер нужно удалять вручную при помощи remove()).
Получить буфер с системным логом (журнал событий). Системный лог содержит сообщения от всех виртуальных машин Pixilang и различных системных функций (глобальная инициализация Pixilang).
Возвращаемое значение: ID нового контейнера, в котором лежит свежий лог; (контейнер нужно удалять вручную при помощи remove()).
Загрузить контейнер из файла.
Параметры ( filename, options )
Примеры//Грузим файл:
c = load( "smile.jpg" )
if c >= 0
{
//Получаем формат загруженного файла:
file_format = c.file_format
//Возможные значения переменной file_format:
// FORMAT_RAW;
// FORMAT_JPEG;
// FORMAT_PNG;
// FORMAT_GIF;
// FORMAT_WAVE;
// FORMAT_AIFF;
// FORMAT_PIXICONTAINER;
// или еще какое-то из раздела "Типы файлов".
}
Загрузить контейнер из потока данных, открытого функцией fopen() или fopen_mem().
Параметры ( stream, options )
Сохранить контейнер в указанном формате.
Параметры ( pixi, filename, format, options )
Примерыc = load( "smile.jpg" )
save( c, "smile.png", FORMAT_PNG )
save( c, "smile2.jpg", FORMAT_JPEG ) //Quality = 85 (default)
save( c, "smile3.jpg", FORMAT_JPEG, 100 ) //Quality = 100
Сохранить контейнер в поток данных, открытый функцией fopen() или fopen_mem().
Параметры ( pixi, stream, format, options )
Возвращаемое значение: 0 в случае успешного сохранения.
Преобразовать путь в стиле Pixilang (например, 1:/img.png) в стиль реальной файловой системы (например, C:/Documents and Settings/username/Application Data/img.png).
Параметры ( path )
Возвращаемое значение: ID контейнера с новым именем файла; (контейнер нужно удалять вручную при помощи remove()).
Examplesfilename = "1:/some_file"
realpath = get_real_path( filename )
printf( "File name: %s; Real path: %s\n", filename, realpath )
remove( realpath )
Функции для получения списка файлов.
Примерыpath = CURRENT_PATH //Директория, в которой мы будем сканировать файлы.
mask = -1 //Примеры маски: "txt/doc", "avi"; или -1 для получения всех файлов.
fl = new_flist( path, mask )
if fl >= 0
{
printf( "Some files found in %s\n", path )
while( 1 )
{
file_name = get_flist_name( fl )
file_type = get_flist_type( fl ) //0 - файл; 1 - директория;
if file_type == 0
{
printf( "FILE %s%s\n", path, file_name )
}
else
{
printf( "DIR %s%s\n", path, file_name )
}
if flist_next( fl ) == 0 //Переходим к следующему файлу
{
//Файлов больше нет
break
}
}
remove_flist( fl )
}
Получить размер файла.
Параметры ( filename )
Получить формат (одна из констант FORMAT_*) файла или потока (если задан stream и filename == -1).
Параметры ( filename, stream )
Получить строку с MIME-типом для указанного формата файла.
Параметры ( fileformat )
Получить строку с расширением для указанного формата файла.
Параметры ( fileformat )
Параметры ( filename )
Параметры ( old_filename, new_filename )
Скопировать файл из source_filename в destination_filename.
Параметры ( source_filename, destination_filename )
Создать директорию.
Параметры ( directory_name, mode )
Использовать поток данных _stream_ (открытый функцией fopen() или fopen_mem()) как виртуальный диск 0:/ . При этом _stream_ должен указывать на открытый незапакованный TAR архив. Файлы внутри TAR архива будут доступны для всех файловых функций через обращение к диску 0:/.
Параметры ( stream )
Параметры ( filename, mode )
Возвращаемое значение: ID потока данных, связанного с указанным файлом; или 0 в случае ошибки.
Примерыf = fopen( "/tmp/data.txt", "rb" ) //Открываем файл data.txt для чтения
fclose( f ) //...и закрываем его.
Открыть контейнер _data_ как файл.
Параметры ( data )
Возвращаемое значение: ID потока данных, связанного с указанным контейнером; или 0 в случае ошибки.
Параметры ( stream )
Примерыf = fopen( "/tmp/data.txt", "rb" ) //Открываем файл data.txt для чтения.
c = fgetc( f ) //Получаем байт из этого файла.
fclose( f ) //Закрываем файл.
Параметры ( c, stream )
Примерыf = fopen( "/tmp/data.txt", "wb" ) //Открываем файл data.txt для записи.
fputc( 0x12, f ) //Записываем байт 0x12 в этот файл.
fclose( f ) //Закрываем файл.
Параметры ( s, stream )
Примерыf = fopen( "/tmp/data.txt", "wb" ) //Открываем файл data.txt для записи.
str = "Hello!"
fputc( str, f ) //Записываем строку "Hello!" в этот файл.
fclose( f ) //Закрываем файл.
Параметры ( data, size, stream, data_offset_optional )
Примерыf = fopen( "/tmp/data.txt", "wb" ) //Открываем файл data.txt для записи.
str = "Hello!"
fwrite( str, 2, f ) //Записываем первые два байта из контейнера str в этот файл.
fclose( f ) //Закрываем файл.
Параметры ( stream )
Прочитать строку текста из потока stream. Чтение происходит до выполнения одного из следующих условий:
string = new( 256, 1, INT8 )
f = fopen( "/tmp/data.txt", "rb" ) //Открываем файл data.txt для чтения.
fgets( string, 256, f ) //Получаем строку текста из этого файла.
//Полученная строка помещается в указанный выше контейнер string.
//Если в контейнере недостаточно места, то строка обрезается.
fclose( f ) //Закрываем файл.
Загрузить блок данных из потока stream.
Параметры ( data, size, stream, data_offset_optional )
Параметры ( stream )
Параметры ( stream )
Параметры ( stream, offset, origin )
Параметры ( stream )
Примеры//Один из способов получения размера файла:
f = fopen( "/tmp/data.txt", "rb" )
fseek( f, 0, SEEK_END )
size_of_file = ftell( f )
fclose( f )
Установить значение одного из дополнительных атрибутов файла.
Параметры ( path, attr_name, data, data_size_in_bytes, flags )
Возвращаемое значение: 0 в случае успешного завершения или -1 в случае ошибки.
Примеры//iOS: запрещаем резервное копирование файла системой:
if strstr( OS_NAME, "ios" ) >= 0
{
$val = new( 1, 1, INT8 )
$val[ 0 ] = 1
setxattr( "myfile.txt", "com.apple.MobileBackup", $val, 1, 0 )
remove( $val )
}
Вывести содержимое рабочего экрана на дисплей и подождать указанное количество миллисекунд.
Параметры ( delay, x, y, xsize, ysize )
Включить/выключить вертикальную синхронизацию (синхронизация кадровой частоты с частотой вертикальной развёртки монитора). vsync(1) - включить. vsync(0) - выключить.
Параметры ( enable )
Изменить размер пикселей на экране. Размер по умолчанию (минимальный) = 1. Увеличение размера ведет к уменьшению разрешения экрана.
Параметры ( size )
Получить размер экранного пикселя.
Сделать указанный контейнер текущим рабочим экраном. ID контейнера с экраном по умолчанию - 0.
Параметры ( pixi )
Получить ID контейнера, который в данный момент является рабочим экраном.
Возвращаемое значение: ID контейнера, который является рабочим экраном.
Параметры ( zbuf_container )
Указать контейнер, который будет буфером глубины (Z-Buffer) при рисовании трехмерных объектов. Подробнее про Z-буферизацию можно почитать здесь.
Контейнер должен иметь тип INT32 и по размерам совпадать с размером текущего экрана.
Получить значение цвета с заданными характеристиками r,g,b (красный,зеленый,синий).
Параметры ( red, green, blue )
Получить интенсивность красной составляющей в указанном цвете.
Параметры ( color )
Получить интенсивность зеленой составляющей в указанном цвете.
Параметры ( color )
Получить интенсивность синей составляющей в указанном цвете.
Параметры ( color )
Получить промежуточное значение цвета между двумя известными.
Параметры ( c1, c2, v )
Установить прозрачность для всех последующих функций.
Параметры ( t )
Получить текущее значение прозрачности.
Очистить текущий рабочий экран заданным цветом (или черным, если цвет не задан).
Параметры ( color )
Нарисовать точку.
Параметры ( x, y, color )
Нарисовать точку в 3D.
Параметры ( x, y, z, color )
Получить цвет в указанной точке.
Параметры ( x, y )
Получить цвет в указанной точке.
Параметры ( x, y, z )
Возвращаемое значение: значение цвета в указанной точке.
Нарисовать линию.
Параметры ( x1, y1, x2, y2, color )
Нарисовать линию в 3D.
Параметры ( x1, y1, z1, x2, y2, z2, color )
Нарисовать прямоугольник.
Параметры ( x, y, xsize, ysize, color )
Нарисовать закрашенный прямоугольник.
Параметры ( x, y, xsize, ysize, color )
Вывести на экран контейнер с картинкой.
Параметры ( pixi_cont, x, y, color, xscale, yscale, src_x, src_y, src_xsize, src_ysize )
pixi( image )
pixi( image, 10, 20 )
pixi( image, 30, 40, GREEN )
pixi( image, 90, 20, GREEN, 0.5, 0.5 )
Нарисовать массив треугольников.
Параметры ( vertices, triangles, tnum )
Отсортировать массив треугольников по глубине так, чтобы при вызове triangles3d() сначала рисовались дальние треугольники, а потом ближние.
Параметры ( vertices, triangles, tnum )
Установить/сбросить цвет прозрачности у контейнера.
Параметры ( pixi, color )
Привязать к контейнеру другой контейнер с альфа-каналом. Альфа-канал должен иметь тип INT8.
Параметры ( pixi, alpha )
Получить ID контейнера с альфа-каналом, привязанного к указанному контейнеру.
Параметры ( pixi )
Возвращаемое значение: ID контейнера или -1 (если альфа-канал отсутствует).
Вывести текст на экран.
Параметры ( text, x, y, color, align, max_xsize, str_offset, str_size )
print( "Hello Pixi!", 0, 0 ) //цвет - белый; выравнивание - по центру;
print( "line1\nline2", 50, 50, RED ) //выравнивание - по центру;
print( "line1\nline2", -50, 50, RED, TOP | LEFT ) //выравнивание - по верхнему левому краю;
Параметр ( text, align, max_xsize, str_offset, str_size )
Параметры ( first_char_utf32, font_image, xchars, ychars, last_char, char_xsize, char_ysize, char_xsize2, char_ysize2, grid_xoffset, grid_yoffset, grid_cell_xsize, grid_cell_ysize )
Параметры ( char_utf32 )
Возвращаемое значение: ID контейнера, в котором находится картинка шрифта для указанного символа.
Наложить эффект на выделенный участок экрана. На координаты этой функции не действует трансформация.
Параметры ( type, power, color, x, y, xsize, ysize, x_step, y_step )
Нарисовать плавный переход между цветами 4-х ключевых точек в указанном прямоугольнике. Используется алгоритм билинейной интерполяции.
На координаты этой функции не действует трансформация.
Параметры ( color1, opacity1, color2, opacity2, color3, opacity3, color4, opacity4, x, y, xsize, ysize, x_step, y_step )
Разбить картинку по каналам (красный, зеленый, синий) или наоборот собрать. Канал в данном случае - это контейнер любого типа, в который будут записываться (или считываться) значения яркости красной, зеленой или синей составляющей изображения.
Параметры ( direction, image, red_channel, green_channel, blue_channel, image_offset, channel_offset, size )
img = load( "some_image.jpg" )
xsize = get_xsize( img )
ysize = get_ysize( img )
r = new( xsize, ysize, INT16 )
g = new( xsize, ysize, INT16 )
b = new( xsize, ysize, INT16 )
split_rgb( 0, img, r, g, b ) //Разбиваем картинку img на составляющие r, g, b
//Получаем яркость красного (от 0 до 255) для первого пикселя изображения:
value = r[ 0 ]
Аналогична split_rgb(), только для преобразования в/из формата YCbCr.
Версия Pixilang с поддержкой OpenGL основана на стандартах OpenGL ES 2.0 и OpenGL ES Shading Language 1.0 (GLSL ES).
Краткое изложение стандарта на нескольких страницах: OpenGL ES 2.0 Quick Reference Card.
Установить gl_callback - функцию, которая будет отвечать за OpenGL-отрисовку кадра.
Параметры ( gl_callback, user_data )
fn gl_callback( $user_data )
{
set_screen( GL_SCREEN ) //Включить режим рисования в буфер OpenGL
clear( YELLOW )
set_screen( 0 ) //Возвращаемся в обычный режим рисования
}
set_gl_callback(
gl_callback,
0 )
while( 1 )
{
while( get_event() ) { if EVT[ EVT_TYPE ] == EVT_QUIT { break2 } }
frame()
}
set_gl_callback( -1 ) //Удалить gl_callback
Удалить из контейнера все OpenGL данные, которые были созданы автоматически во время перерисовки OpenGL кадра внутри gl_callback().
Параметры ( container )
Отправить запрос на обновление текстуры OpenGL, связанной с контейнером. Используйте эту функцию, если поменялось содержимое контейнера, но размер остался прежний.
Параметры ( container )
Гибрид OpenGL функций glColor4ub(), glBindTexture(), glVertexPointer(), glColorPointer(), glTexCoordPointer(), glDrawArrays().
Можно вызывать только внутри кода, заданного set_gl_callback().
Параметры ( mode, first, count, color_r, color_g, color_b, color_a, texture, vertex_array, color_array, texcoord_array )
Полный аналог OpenGL функции glBlendFunc() или glBlendFuncSeparate() (если заданы sfactor_alpha и dfactor_alpha).
Можно вызывать только внутри кода, заданного set_gl_callback().
Вызывайте эту функцию без параметров, если нужно сбросить все значения в исходное состояние.
Параметры ( sfactor, dfactor, sfactor_alpha, dfactor_alpha )
Превратить указанный контейнер cnum в OpenGL framebuffer (с прикрепленной текстурой) и сделать его текущим - то есть, все последующие операции рисования отправлять не на экран, а в этот буфер. Для отключения и перехода обратно на основной экран - вызовите эту функцию без параметров.
Разрешение основного экрана никак не влияет на выбранный framebuffer.
Если показывать framebuffer при помощи pixi(), то картинка будет перевернута по оси Y.
Можно вызывать только внутри кода, заданного set_gl_callback().
Параметры ( cnum, flags, x, y, width, height )
Привязать указанный контейнер cnum к текстурному блоку texture_unit.
Можно вызывать только внутри кода, заданного set_gl_callback().
Параметры ( cnum, texture_unit )
fn gl_callback( $userdata )
{
set_screen( GL_SCREEN )
gl_bind_texture( some_image2, 1 ) //привязать контейнер some_image2 к текстурному блоку 1
gl_bind_texture( some_image3, 2 ) //привязать контейнер some_image3 к текстурному блоку 2
gl_use_prog( gl_prog ) //Use user-defined GLSL program
gl_uniform( gl_prog.g_texture2, 1 ) //установка переменной шейдера: g_texture2 = текстурный блок 1
gl_uniform( gl_prog.g_texture3, 2 ) //установка переменной шейдера: g_texture3 = текстурный блок 2
pixi( some_image )
gl_use_prog() //Back to default GLSL program
set_screen( 0 ) //Back to the default screen
}
gl_vshader = GL_SHADER_TEX_RGB_SOLID //Vertex shader = default shader for solid primitives drawing
gl_fshader = //Fragment shader
"uniform sampler2D g_texture; //главный текстурный блок 0 (задается из pixi())
uniform sampler2D g_texture2; //текстурный блок 1
uniform sampler2D g_texture3; //текстурный блок 2
uniform vec4 g_color;
IN vec2 tex_coord_var;
void main()
{
vec4 c1 = texture2D( g_texture, tex_coord_var );
vec4 c2 = texture2D( g_texture2, tex_coord_var );
vec4 c3 = texture2D( g_texture3, tex_coord_var );
gl_FragColor = ( c1 + c2 + c3 ) * g_color;
}
"
gl_prog = gl_new_prog( gl_vshader, gl_fshader )
Получить значение параметра состояния в целочисленном формате. Полный аналог OpenGL функции glGetIntegerv().
Можно вызывать только внутри кода, заданного set_gl_callback().
Параметры ( pname )
Получить значение параметра состояния в формате числа с плавающей точкой. Полный аналог OpenGL функции glGetFloatv().
Можно вызывать только внутри кода, заданного set_gl_callback().
Параметры ( pname )
Версия Pixilang с поддержкой OpenGL может использовать вершинные (vertex) и фрагментные (fragment) шейдеры, которые описываются специальным языком (основанном на ANSI C) OpenGL ES Shading Language 1.0 (GLSL ES).
Вершинный шейдер обрабатывает параметры вершин многогранников (из которых построены все объекты в OpenGL): координаты, текстурные координаты, цвет и т.д.
Фрагментный шейдер обрабатывает цвет каждого пикселя во время рисования многогранника.
В вершинных шейдерах используйте следующие правила (для получения максимальной кросс-платформенности в Pixilang):
Создать новую GLSL программу - контейнер, совмещающий вершинный и фрагментный шейдеры. Эту функцию можно вызывать в любом месте Pixilang-кода. Непосредственная сборка программы (компиляция шейдеров и их объединение) будет происходить позже, когда вы передадите этот контейнер в функцию gl_use_prog().
Параметры ( vertex_shader, fragment_shader )
Использовать GLSL программу, созданную ранее при помощи gl_new_prog().Если программа используется впервые, то будет произведена компиляция и объединение шейдеров, находящихся внутри этой программы.
Можно вызывать только внутри кода, заданного set_gl_callback().
Параметры ( prog )
Pixilang может передавать данные в GLSL переменные с квалификатором uniform. Uniform-переменные являются глобальными и могут использоваться как в вершинных, так и во фрагментных шейдерах. Функции типа gl_uniform() используются для передачи значений в эти переменные.
Можно вызывать только внутри кода, заданного set_gl_callback().
Через gl_uniform() можно также менять содержимое массивов в шейдерах, если использовать эту функцию следующим образом:
gl_uniform( var_location, src_container, vector_size, first_vector, count ), где count - это количество векторов, которые будут записаны в массив из контейнера src_container.
Параметры ( var_location, v0, v1, v2, v3 )
gl_use_prog( gl_prog ) //Используем GLSL программу gl_prog
gl_uniform( gl_prog.g_time, get_timer( 0 ) ) //Задаем значение uniform-переменной g_time
Функция аналогичная gl_uniform(), но для работы с матрицами.
Можно вызывать только внутри кода, заданного set_gl_callback().
Параметры ( size, matrix_location, transpose, matrix )
gl_use_prog( gl_prog ) //Использовать GLSL программу gl_prog
gl_uniform( 4, gl_prog.g_mat, 0, source_matrix ) //Сохранить данные из контейнера source_matrix в матрицу g_mat
Запаковать текущее содержимое контейнера в кадр. Номер кадра должен быть в свойстве "frame" этого контейнера.
Параметры ( pixi )
Распаковать кадр в текущее содержимое контейнера. Номер кадра должен быть в свойстве "frame" этого контейнера.
Параметры ( pixi )
Создать анимацию - скрытую область контейнера, в которой будут располагаться запакованные кадры.
Параметры ( pixi )
Удалить анимацию в указанном контейнере.
Параметры ( pixi )
Продублировать текущий кадр в указанном контейнере. Номер кадра должен быть в свойстве "frame" этого контейнера.
Параметры ( pixi )
Удалить текущий кадр в указанном контейнере. Номер кадра должен быть в свойстве "frame" этого контейнера.
Параметры ( pixi )
Включить режим авто-проигрывания для указанного контейнера. В этом режиме нужные кадры будут распаковываться автоматически во время вызова функции pixi().
Параметры ( pixi )
Выключить режим авто-проигрывания для указанного контейнера.
Параметры ( pixi )
Трансформация координат в Pixilang работает почти так же, как в любом другом графическом API. В основе - общая матрица преобразований, которая влияет на координаты рисуемых объектов. Матрица - это массив 4x4 внутри виртуальной машины Pixilang. Изменяется она командами t_*. Сбрасывается в исходное положение через t_reset(). Каждый раз, когда Pixilang что-то рисует (включая pixi()), он умножает координаты вершин объекта на матрицу преобразований. Результирующие координаты используются для финального рисования фигуры.
Команды t_* влияют не на какой-то конкретный объект, а на всю систему координат, относительно предыдущих преобразований. Результат (включающий в себя и новые и старые изменения) сохраняется в общую матрицу. Это удобно, т.к. один маленький массив хранит в себе бесконечное количество операций t_*. Обычно прямой доступ к этому массиву не требуется.
Расположение значений внутри матрицы следующее (отличается от обычного порядка в 2D контейнерах):
0 | 4 | 8 | 12 |
1 | 5 | 9 | 13 |
2 | 6 | 10 | 14 |
3 | 7 | 11 | 15 |
Пример:
(нужно нарисовать картинку, смещенную относительно центра экрана, увеличенную в 2 раза и повернутую на 45 градусов)t_reset() //сброс трансформации
t_translate( 32, 0, 0 ) //#1: перемещение на 32 пикселя по горизонтали
t_scale( 2, 2, 2 ) //#2: увеличение в 2 раза
t_rotate( 45, 0, 0, 1 ) //#3: поворот на 45 градусов вокруг вектора 0,0,1 (x,y,z)
pixi( img ) //рисуем картинку img со смещением, увеличением и поворотом
frame() //показываем на экране
В упрощенном виде этот пример приведет к следующему преобразованию (для каждой вершины рисуемого объекта):
v2 = wm * #1 * #2 * #3 * v;
wm - дополнительное преобразование для корректного отображения в окне; в режиме программного рисования (не OpenGL) отсутствует;
#1 - матрица перемещения;
#2 - матрица увеличения;
#3 - матрица поворота;
v - исходные координаты вершины;
v2 - измененные координаты вершины;
Матрицы и финальная вершина v2 - четырехмерные. Не вдаваясь в математические подробности, это требуется для перемещения и перспективной проекции (см. Clip coordinates и Homogeneous coordinates). Перед тем, как перейти непосредственно к рисованию, выполняется операция перспективного деления: v2 преобразуется из 4D в 3D.
В режиме OpenGL преобразование координат выполняется следующим вершинным шейдером:// Матрица преобразований оконного менеджера:
// (преобразует координаты Pixilang
// (X:-WINDOW_XSIZE/2...WINDOW_XSIZE/2; Y:-WINDOW_YSIZE/2...WINDOW_YSIZE/2; Z:-WINDOW_ZSIZE/2...WINDOW_ZSIZE/2)
// в нормализованную систему координат устройства
// (Normalized Device Coordinates - NDC; X:-1...1; Y:-1...1; Z:1...-1))
uniform mat4 g_wm_transform;
// Матрица преобразований Pixilang (все операции t_* хранятся в ней):
uniform mat4 g_pixi_transform;
// Исходные координаты вершины:
IN vec4 position;
void main()
{
gl_Position = g_wm_transform * g_pixi_transform * position;
gl_PointSize = 1.0;
}
// При выходе из шейдера выполняется перспективное деление, в результате которого получаем 3D координаты в NDC
Сброс трансформации (в состояние единичной матрицы).
Поворот.
Параметры ( angle, x, y, z )
Перемещение.
Параметры ( x, y, z )
Масштабирование.
Параметры ( x, y, z )
Сохранить текущую матрицу трансформации в стек.
Загрузить последнюю сохраненную матрицу трансформации из стека.
Получить текущую матрицу трансформации (4x4 FLOAT).
Параметры ( matrix_container )
Установить текущую матрицу трансформации (4x4 FLOAT).
Параметры ( matrix_container )
Умножить текущую матрицу трансформации на matrix_container.
Параметры ( matrix_container )
Пересчитать координаты точки с учетом текущей матрицы трансформации.
Параметры ( point_coordinates )
Задать функцию, которая будет генерировать звуковой поток.
Параметры ( callback, userdata, sample_rate, format, channels, flags )
fn audio_callback( $stream, $userdata, $channels, $frames, $time )
{
generator( OP_SIN, $channels[ 0 ], 0, 32767 / 2, 0.1, 0 ) //Левый канал
generator( OP_SIN, $channels[ 1 ], 0, 32767 / 2, 0.1, 0 ) //Правый канал
ret(1)
//возвращаемые значения:
// 0 - тишина, выходные каналы $channels не заполнены;
// 1 - выходные каналы $channels заполнены (как в примере выше);
// 2 - тишина, выходные каналы $channels заполнены нулями (или знач. близкими к нулю).
}
//Запустить звук:
set_audio_callback( audio_callback, 0, 22050, INT16, 2, AUDIO_FLAG_INTERP2 )
//Остановить звук:
set_audio_callback( -1 )
Получить локальную или глобальную частоту дискретизации.
Параметры ( source )
Параметры ( disable_enable )
Получить частоту указанной ноты (используется быстрый, не очень точный алгоритм).
Чатота ноты по стандарту MIDI = get_note_freq( midi_note, 0 ) / 64; (ниже на 5 октав)
Параметры ( note, finetune )
Параметры ( client_name )
Возвращаемое значение: ID клиента или отрицательное значение в случае ошибки.
Параметры ( client_id )
Параметры ( client_id, device_num, flags )
Возвращаемое значение: имя устройства под номером device_num или -1, если нет такого устройства.
Параметры ( client_id, port_name, device_name, flags )
Возвращаемое значение: номер открытого порта (port ID) или отрицательное значение в случае ошибки.
Параметры ( client_id, port_id )
Параметры ( client_id, port_id )
Параметры ( client_id, port_id, data_cont )
Возвращаемое значение: размер (в байтах) текущего MIDI события.
Параметры ( client_id, port_id )
Возвращаемое значение: время (в системных тиках) текущего MIDI события
Перейти на следующее сообщения в очереди.
Параметры ( client_id, port_id )
Параметры ( client_id, port_id, data_cont, data_size, t )
Движок модульного синтезатора SunVox встроен в Pixilang начиная с версии 3.8.
Подробное описание всех функций находится здесь.
Запустить таймер.
Параметры ( timer_num )
Получить значение таймера в миллисекундах.
Параметры ( timer_num )
Получить значение системного 32-битного таймера высокого разрешения. Единица измерения - 1 тик.
Получить количество системных тиков в секунду.
Заснуть на указанный промежуток времени.
Параметры ( delay )
Получить очередное событие от системы.
Возвращаемое значение: 0 - нет новых событий; 1 - очередное событие получено, и оно находится в контейнере EVT.
Установить поведение программы при получении события EVT_QUIT.
Параметры ( action )
Создать новый поток выполнения, в котором сразу после создания будет запущена функция thread_function( $thread_id, $user_data )
Параметры ( thread_function, user_data, flags_optional )
Возвращаемое значение: ID потока или -1 в случае ошибки.
Примерыfn thread_body( $thread_id, $user_data )
{
printf( "Thread code\n" )
}
thread_id = thread_create( thread_body, 0 ) //Создаем новый поток
err = thread_destroy( thread_id, 1000 ) //Ждем до 1000 миллисекунд, пока поток завершится
if err == 0 { printf( "Поток успешно завершен и закрыт\n" ) }
if err == 1 { printf( "Тайм-аут. Стоит попробовать еще раз\n" ) }
if err == 2 { printf( "Возникла ошибка в функции thread_destroy()\n" ) }
Закрыть поток выполнения.
Параметры ( thread_id, timeout_ms )
Примерыnew_mutex = mutex_create()
mutex_lock( new_mutex )
mutex_unlock( new_mutex )
mutex_destroy( new_mutex )
Функции для смены типа данных без изменения содержимого. Подробнее
Параметры ( value, mode, intermediate_value_bits )
Примечание: функции обработки данных не работают с контейнерами динамического типа.
Выполнить операцию обработки данных. Операнды: - контейнер C1; - числовое значение N.
Для каждого элемента контейнера C1 будет выполняться следующее:C1[ i ] = C1[ i ] OP N,
где i - номер элемента; OP - выбранная операция.
Параметры ( opcode, C1, N ) - для всего контейнера С1
Параметры ( opcode, C1, N, x, xsize ) - область задана в 1D координатах
Параметры ( opcode, C1, N, x, y, xsize, ysize ) - область задана в 2D координатах
* opcode - код операции; * C1 - контейнер, над которым будет производиться выбранная операция; результат будет помещен в него же; * N - числовое значение; * x,y,xsize,ysize - регион, в котором будет выполняться операция.
Примеры//Прибавить число 32 к каждому элементу контейнера img:
op_cn( OP_ADD, img, 32 )
//Прибавить число 32 к элементам 128...256:
op_cn( OP_ADD, img, 32, 128, 128 )
//Прибавить число 32 к элементам в регионе (8,8,32,32):
op_cn( OP_ADD, img, 32, 8, 8, 32, 32 )
Выполнить операцию обработки данных. Операнды: - контейнер C1; - контейнер C2.
Для каждого элемента контейнера C1 будет выполняться следующее:C1[ i ] = C1[ i ] OP C2[ i ],
где i - номер элемента; OP - выбранная операция.
Параметры ( opcode, C1, C2 ) - для всей области контейнера С1
Параметры ( opcode, C1, C2, dest_x, src_x, xsize ) - область задана в 1D координатах
Параметры ( opcode, C1, C2, dest_x, dest_y, src_x, src_y, xsize, ysize ) - область задана в 2D координатах
Выполнить операцию обработки данных. Операнды: - контейнер C1; - контейнер C2; - числовое значение N.
Для каждого элемента контейнера C1 будет выполняться следующее:C1[ i ] = C1[ i ] OP C2[ i ] OP2 N,
где i - номер элемента; OP - выбранная операция; OP2 - дополнительная операция.
Параметры ( opcode, C1, C2, N ) - для всей области контейнера C1
Параметры ( opcode, C1, C2, N, dest_x, src_x, xsize ) - область задана в 1D координатах
Параметры ( opcode, C1, C2, N, dest_x, dest_y, src_x, src_y, xsize, ysize ) - область задана в 2D координатах
Генератор сигнала.
Параметры ( opcode, pixi, phase, amplitude, delta_x, delta_y, x, y, xsize, ysize )
//Сгенерировать синусоиду в контейнер img:
generator( OP_SIN, img, 0, 1, 0.1, 0.1 )
//Сгенерировать синусоиду по более быстрому, но менее точному алгоритму:
generator( OP_SIN8, img, 0, 1, 0.1, 0.1 )
//Сгенерировать синусоиду в элементы 8...128 контейнера img:
generator( OP_SIN, img, 0, 1, 0.1, 0.1, 8, 120 )
//Сгенерировать синусоиду в регион (8,8,32,32) контейнера img:
generator( OP_SIN, img, 0, 1, 0.1, 0.1, 8, 8, 32, 32 )
Очень быстрый многоканальный сэмплер (набор из неограниченного количества примитивных генераторов), где сэмпл имеет фиксированный размер (32768 отсчетов) и всегда зациклен (loop).
Параметры ( dest, dest_offset, dest_length, table, amp, amp_delta, pos, pos_delta, gen_offset, gen_step, gen_count )
Параметры ( sample_info )
Примерыsample_data = new( 256, 1, INT16 ) //создаем 16-битный сэмпл
sample_info = new( SMP_INFO_SIZE, 1, INT32 ) //создаем контейнер для сэмплера
clean( sample_info )
sample_info[ SMP_DEST ] = buffer //Контейнер, в который будем записывать
sample_info[ SMP_DEST_OFF ] = 0 //Смещение в контейнере
sample_info[ SMP_DEST_LEN ] = 256 //Размер области, которую будем заполнять
sample_info[ SMP_SRC ] = sample_data
sample_info[ SMP_SRC_OFF_H ] = 0 //Смещение сэмпла (левая часть числа с фиксированной точкой)
sample_info[ SMP_SRC_OFF_L ] = 0 //Смещение сэмпла (правая часть числа с фиксированной точкой, от 0 до 65535)
sample_info[ SMP_SRC_SIZE ] = 0 //Размер сэмпла (0 - весь сэмпл целиком)
sample_info[ SMP_LOOP ] = 0 //Начало лупа (повторяемого участка сэмпла)
sample_info[ SMP_LOOP_LEN ] = 128 //Длина лупа (или 0, если луп отключен)
sample_info[ SMP_VOL1 ] = 0 //Начальная громкость
sample_info[ SMP_VOL2 ] = 32768 //Конечная громкость (32768 = 1.0)
sample_info[ SMP_DELTA ] = ( 1 << 16 ) //Дельта (скорость проигрывания); fixed point (real_value * 65536)
sample_info[ SMP_FLAGS ] = SMP_FLAG_INTERP4 | SMP_FLAG_PINGPONG //Кубическая сплайновая интерполяция и луп в режиме ping-pong
sampler( sample_info ) //Записываем сэмпл с выбранными параметрами в контейнер buffer
Линейная интерполяция (по двум точкам) усиления и DC-смещения в выделенной области контейнера. Без ограничения (защиты от переполнения).
Параметры ( data_cont, v1, v2, offset, size, dc_offset1, dc_offset2 )
Заполнить промежуточные значения между ключевыми точками прямоугольника в указанном контейнере. Используется алгоритм билинейной интерполяции.
Параметры ( container, val1, val2, val3, val4, x, y, xsize, ysize, x_step, y_step )
Выполнить быстрое преобразование Фурье.
Параметры ( inverse, im, re, size )
Создать новый фильтр, в основе которого следующая функция:output[ n ] = ( a[ 0 ] * input[ n ] + a[ 1 ] * input[ n - 1 ] + ... + a[ a_count - 1 ] * input[ n - a_count - 1 ]
+ b[ 0 ] * output[ n - 1 ] + ... + b[ b_count - 1 ] * output[ n - b_count - 1 ] ) >> rshift;
Параметры ( flags_for_future_use )
Возвращаемое значение: ID нового контейнера, в котором находятся данные фильтра.
Параметры ( filter )
Параметры ( filter )
Параметры ( filter, a, b, rshift, flags )
Применить фильтр.
Параметры ( filter, output, input, flags, offset, size )
Подстановка значений контейнера. Типы контейнеров dest и values должны быть одинаковыми. Для каждого элемента контейнера dest будет выполняться следующее действие: dest[ i ] = values[ (unsigned)src[ i ] ]
Параметры ( dest, src, values, dest_offset, src_offset, size )
//Преобразовать 8-битную картинку в формат пикселей текущего экрана:
//src - это, например, контейнер основного экрана;
//img8 - контейнер с 8-битной картинкой (256 цветов);
//palette - контейнер с палитрой из 256 цветов;
replace_values( scr, img8, palette )
Скопировать (и растянуть/сжать, если нужно) указанную область контейнера src в указанную область контейнера dest.
Параметры ( dest, src, flags, dest_x, dest_y, dest_rect_xsize, dest_rect_ysize, src_x, src_y, src_rect_xsize, src_rect_ysize )
Применить фильтр свертки (матрица свертки).
Параметры ( dest, src, kernel, div, offset, flags, kernel_xcenter, kernel_ycenter, dest_x, dest_y, src_x, src_y, xsize, ysize, xstep, ystep )
Открыть диалоговое окно выбора файла.
Параметры ( dialog_name, mask, id, default_name, flags )
Открыть диалоговое окно с глобальными настройками Pixilang.
Открывает диалог ввода текста (пока только латиница) и возвращает введенную строку.
Параметры ( default_text, dialog_name )
Открыть указанный URL в браузере.
Параметры ( url_string )
Открыть динамически подключаемую библиотеку (например, .DLL для Windows или .SO для Linux).
Параметры ( lib_file_name )
Возвращаемое значение: ID открытой библиотеки или -1 в случае ошибки.
Примеры//Например, мы имеем какую-то C функцию int show_info( int x, int y, void* data )
//в библиотеке mylib.dll.
//Вызовем ее из Pixilang:
dl = dlopen( "mylib.dll" ) //Открываем библиотеку
if dl >= 0
{
f = dlsym( dl, "show_info", "iip" ) //Получаем ID функции show_info()
// "iip" - int int pointer
if f >= 0
{
retval = dlcall( dl, f, 1, 2, "blahblah" ) //вызываем функцию show_info() с параметрами 1, 2, "blahblah"
}
dlclose( dl ) //Закрываем библиотеку
}
Закрыть динамически подключаемую библиотеку.
Параметры ( lib_id )
Получить ID символа (функции или переменной) из динамической библиотеки.
Параметры ( lib_id, symbol_name, format, calling_convention )
Вызвать функцию из динамической библиотеки.
Параметры ( lib_id, symbol_id, optional_function_parameters )
Выполнить системную команду.
Параметры ( command )
Примеры//Удаляем файл в Unix-совместимой ОС:
system( "rm /tmp/data.txt" )
Функция возвращает количество аргументов, переданных программе.
Функция возвращает ID контейнера со строкой, в которой записан аргумент под номером n.
Параметры ( n )
Примерыif argc() >= 4
{
a = argv( 3 )
remove( a )
}
Выйти из Pixilang.
Параметры ( exit_code )
Примерыexit( 4 ) //Выйти с кодом 4