01 · Оголошення #declaration

Колір оголошується через тег /color. Значення задається як HEX (#RRGGBB або #RRGGBBAA) або як RGB/RGBA кортеж.

HEX формат ✓ компілюється
color_basic_test.terra
! Оголошення /color змінної через HEX
app (/color, /var) ColA = #FF6400
app (/color, /var) ColB = #1E90FFCC  ! з альфа каналом

::start::
/display(ColA.hex.)
/display(ColB.hex.a.)
output #FF6400
#1E90FFCC
RGB/RGBA кортеж ✓ компілюється
приклад
app (/color, /var) Sky  = (93, 138, 168)       ! RGB, alpha=255
app (/color, /var) Fire = (255, 80, 0, 200)   ! RGBA
При RGB без альфи — alpha автоматично встановлюється в 0 (прозорий). При RGBA — явне значення.
Внутрішнє представлення: /color зберігається як <4 x i8> вектор в LLVM IR. Порядок байт: R, G, B, A. Compile-time константа — жодних runtime перетворень.
02 · Вбудовані константи #constants

Terra надає вбудовані кольорові константи. Вони доступні як вирази і можуть присвоюватись /color змінним.

Константа Значення Колір
Color.Red #FF0000 Червоний
Color.Green #00FF00 Зелений
Color.Blue #0000FF Синій
Color.Black #000000 Чорний
Color.White #FFFFFF Білий
Присвоєння константи ✓ компілюється
color_basic_test.terra
app (/color, /var) ColM = #E32636

::start::
ColM = Color.Red
/display(ColM.hex.)
output #FF0000
03 · Channel access #channels

Доступ до окремих каналів кольору через крапкову нотацію. Повертає /intbyte значення (0–255).

Синтаксис Канал Індекс Тип результату
Col.Red Червоний 0 /intbyte (i8)
Col.Green Зелений 1 /intbyte (i8)
Col.Blue Синій 2 /intbyte (i8)
Col.Alpha Альфа (прозорість) 3 /intbyte (i8)
Читання каналів ✓ компілюється
color_channel_access_test.terra
app (/color, /var) ColM = #FF6400
app (/intbyte, /var) r = 0

::start::
r = ColM.Red
/display(r)         ! 255
/display(ColM.Green) ! 100
/display(ColM.Blue)  ! 0
output 255
100
0
#FF6400 → R=255, G=100, B=0. Channel access повертає /intbyte — може використовуватись в будь-якому /intbyte контексті.
Тільки /intbyte: Канал кольору — завжди i8 (0–255). Не можна присвоїти в /int2, /int4 або інший тип.
04 · Арифметика #arithmetic

Арифметичні операції над /color змінними виконуються поканально — кожен канал (R, G, B, A) оброблюється незалежно. Поведінка при переповненні: wrap-around (255+1=0).

Color + Color ✓ компілюється
color_arithmetic_test.terra
app (/color, /var) ColA = #800000  ! R=128 G=0 B=0
app (/color, /var) ColB = #400000  ! R=64  G=0 B=0

::start::
ColA + (ColB)
/display(ColA.hex.)
output #C00000
R: 128+64=192=0xC0. Операція змінює ColA — результат зберігається в ліву змінну.
Color + scalar ✓ компілюється
color_arithmetic_test.terra
app (/color, /var) ColA = #404040

::start::
ColA + (16)
/display(ColA.hex.)
output #505050
Scalar застосовується до всіх чотирьох каналів одночасно.
Операція Синтаксис Поведінка
+ ColA + (ColB) Поканальне додавання, wrap-around
- ColA - (ColB) Поканальне віднімання, wrap-around
* ColA * (2) Множення на scalar, wrap-around
/ ColA / (2) Ділення на scalar
05 · &st — насичення #saturate

Модифікатор &st (saturate) обмежує результат операції в межах 0–255 для кожного каналу. Без &st — wrap-around (255+1=0). З &st — clamp (255+1=255).

Без &st — wrap-around ✓ компілюється
color_sat_test.terra
app (/color, /var) ColS = #F00000  ! R=240

::start::
ColS + (32)
/display(ColS.hex.)
output #100000
R: 240+32=272 → 272-256=16=0x10. Переповнення без &st.
З &st — насичення до 255 ✓ компілюється
color_sat_test.terra
app (/color, /var) ColS = #F00000  ! R=240

::start::
ColS + (32)&st
/display(ColS.hex.)
output #FF0000
R: 240+32=272 → насичується до 255=0xFF. &st гарантує що канал не обгорне.
Використання в GUI: &st особливо корисний для плавних анімацій кольору де важливо не виходити за межі 0–255.
06 · Display #display

Вивід /color значення підтримує шість форматів. Формат вказується модифікатором після імені змінної в /display.

Модифікатор Приклад виводу Опис
.hex. #FF6400 HEX без альфи
.hex.a. #FF6400FF HEX з альфою
.rgb. rgb(255, 100, 0) RGB без альфи
.rgb.a. rgba(255, 100, 0, 255) RGBA з альфою
.alpha. 255 Тільки альфа канал
(без модифікатора) ■■■■ Кольоровий блок в терміналі (ANSI)
Всі формати ✓ компілюється
color_display_formats_test.terra
app (/color, /var) ColD = #FF6400CC

::start::
/display(ColD.hex.)
/display(ColD.hex.a.)
/display(ColD.rgb.)
/display(ColD.rgb.a.)
/display(ColD.alpha.)
output #FF6400
#FF6400CC
rgb(255, 100, 0)
rgba(255, 100, 0, 204)
204
07 · Помилки #errors-section

Живі приклади з тестового пакету. Повна таблиця — у розділі Коди помилок.

Type mismatch: канал не може йти в /int2+ ✗ помилка компіляції
err_color_channel_type_mismatch.terra
app (/int2, /var) x = 1000
app (/color, /var) ColM = #FF0000

::start::
x + (ColM.Red)  ! /int2 + i8 — несумісні типи
E206_TYPE_MISMATCH
Тип i16 несумісний з каналом /color (i8). Використайте /intbyte для операцій з Color.Red/Green/Blue/Alpha
Канал кольору завжди /intbyte (i8). Змініть x на /intbyte або зчитайте канал в /intbyte змінну.