◉ /color
32-бітний колір у форматі RGBA. Чотири канали по 8 біт — Red, Green, Blue, Alpha. Операції з автоматичним насиченням, channel access, display у hex та rgb форматах.
Колір оголошується через тег /color. Значення задається як HEX (#RRGGBB або #RRGGBBAA) або як RGB/RGBA кортеж.
! Оголошення /color змінної через HEX app (/color, /var) ColA = #FF6400 app (/color, /var) ColB = #1E90FFCC ! з альфа каналом ::start:: /display(ColA.hex.) /display(ColB.hex.a.)
#1E90FFCC
app (/color, /var) Sky = (93, 138, 168) ! RGB, alpha=255 app (/color, /var) Fire = (255, 80, 0, 200) ! RGBA
/color зберігається як <4 x i8> вектор в LLVM IR. Порядок байт: R, G, B, A. Compile-time константа — жодних runtime перетворень.
Terra надає вбудовані кольорові константи. Вони доступні як вирази і можуть присвоюватись /color змінним.
| Константа | Значення | Колір |
|---|---|---|
| Color.Red | #FF0000 |
Червоний |
| Color.Green | #00FF00 |
Зелений |
| Color.Blue | #0000FF |
Синій |
| Color.Black | #000000 |
Чорний |
| Color.White | #FFFFFF |
Білий |
app (/color, /var) ColM = #E32636 ::start:: ColM = Color.Red /display(ColM.hex.)
Доступ до окремих каналів кольору через крапкову нотацію. Повертає /intbyte значення (0–255).
| Синтаксис | Канал | Індекс | Тип результату |
|---|---|---|---|
| Col.Red | Червоний | 0 | /intbyte (i8) |
| Col.Green | Зелений | 1 | /intbyte (i8) |
| Col.Blue | Синій | 2 | /intbyte (i8) |
| Col.Alpha | Альфа (прозорість) | 3 | /intbyte (i8) |
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
100
0
/intbyte — може використовуватись в будь-якому /intbyte контексті.
i8 (0–255). Не можна присвоїти в /int2, /int4 або інший тип.
Арифметичні операції над /color змінними виконуються поканально — кожен канал (R, G, B, A) оброблюється незалежно. Поведінка при переповненні: wrap-around (255+1=0).
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.)
app (/color, /var) ColA = #404040 ::start:: ColA + (16) /display(ColA.hex.)
| Операція | Синтаксис | Поведінка |
|---|---|---|
| + | ColA + (ColB) |
Поканальне додавання, wrap-around |
| - | ColA - (ColB) |
Поканальне віднімання, wrap-around |
| * | ColA * (2) |
Множення на scalar, wrap-around |
| / | ColA / (2) |
Ділення на scalar |
Модифікатор &st (saturate) обмежує результат операції в межах 0–255 для кожного каналу. Без &st — wrap-around (255+1=0). З &st — clamp (255+1=255).
app (/color, /var) ColS = #F00000 ! R=240 ::start:: ColS + (32) /display(ColS.hex.)
&st.
app (/color, /var) ColS = #F00000 ! R=240 ::start:: ColS + (32)&st /display(ColS.hex.)
&st гарантує що канал не обгорне.
&st особливо корисний для плавних анімацій кольору де важливо не виходити за межі 0–255.
Вивід /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) |
app (/color, /var) ColD = #FF6400CC ::start:: /display(ColD.hex.) /display(ColD.hex.a.) /display(ColD.rgb.) /display(ColD.rgb.a.) /display(ColD.alpha.)
#FF6400CC
rgb(255, 100, 0)
rgba(255, 100, 0, 204)
204
Живі приклади з тестового пакету. Повна таблиця — у розділі Коди помилок.
app (/int2, /var) x = 1000 app (/color, /var) ColM = #FF0000 ::start:: x + (ColM.Red) ! /int2 + i8 — несумісні типи
i16 несумісний з каналом /color (i8). Використайте /intbyte для операцій з Color.Red/Green/Blue/Alpha
/intbyte (i8). Змініть x на /intbyte або зчитайте канал в /intbyte змінну.