===== Culori =====
O culoare este de fapt un [[integerexpressions|număr_întreg]] ce conține în el câteva informații speciale.
O culoare poate fi exprimată în general în 3 moduri:\\
1) prin numele ei (constantă)\\
2) cu ajutorul funcției [[rgb|RGB]]\\
3) ca simplu număr\\
----
==== 1) Culoare exprimată prin numele ei ====
O culoare poate fi specificată cel mai simplu prin numele ei. BASIC-256 are definite 18 constante pentru culori: **BLACK**, **WHITE**, **RED**, **DARKRED**, **GREEN**, **DARKGREEN**, **BLUE**, **DARKBLUE**, **CYAN**, **DARKCYAN**, **PURPLE**, **DARKPURPLE**, **YELLOW**, **DARKYELLOW**, **ORANGE**, **DARKORANGE**, **GREY** / **GRAY**, **DARKGREY** / **DARKGRAY** și **CLEAR**.\\
De exemplu, instrucțiunea de mai jos va selecta culoarea **BLACK** (negru):\\
color black
Cu alte cuvinte, oriunde se solicită o culoare se poate utiliza una din denumirile enumerate.\\
Spuneam mai devreme că o culoare este de fapt un [[integerexpressions|număr_întreg]]. Așa și este, iar constantele enumerate sunt de fapt tot numere. Pentru a demonstra acest lucru, rulează instrucțiunea de mai jos:
print black
Rezultatul va fi: -16777216. Așadar, folosirea constantelor cu numele culorilor este un mod mult mai elegant decât utilizarea unor numere aparent fără niciun sens. De exemplu, cele două linii de mai jos selectează culoarea roșie pentru creion și culoare verde pentru pensulă. Este evident că prima variantă este cea mai ușor de înțeles și de folosit:
color red, green
color -65536, -16711936
Mai jos este lista culorilor predefinite. Pentru fiecare culoare sunt trecute și câteva informații suplimentare, inclusiv valoarea numerică a culorii:
{{page>ro:colorconstants}}
----
==== 2) Culoare exprimată cu ajutorul funcției RGB ====
Utilizatorul are posibilitatea să-și creeze milioane de culori diferite prin utilizarea funcției [[rgb|RGB]].
La începutul acestei pagini am văzut că o culoare este de fapt un [[integerexpressions|număr_întreg]] ce conține în el câteva informații speciale. Ca atare, funcția [[rgb|RGB]] întoarce tot un [[integerexpressions|număr_întreg]] în format ARGB ce reprezintă culoarea creată.\\
El este compus în realitate din 4 octeți (un octet poate avea o valoare între 0 - 255), fiecare octet conținând informații despre unul dintre cele 4 canale: **R**ed (roșu), **G**reen (verde), **B**lue (albastru) și **A**lpha (opacitate, transparență).\\
Prin combinarea canalelor **RGB** (roșu, verde, albastru) se pot obține un număr de 16.777.216 de culori diferite! Fiecare culoare poate fi afișată apoi cu diverse grade de opacitate, date de canalul **A**lpha: 0 - 255, unde 255 înseamnă opacitate maximă, iar 0 înseamnă transparență totală.
Formatul funcției [[rgb|RGB]] este:\\
**RGB(r, g, b)**, în acest caz canalul **A**lpha este implicit 255 (opacitate totală)\\
**RGB(r, g, b, a)**, în acest caz canalul **A**lpha este declarat ultimul, chiar dacă valoare lui este cuprinsă în primul octet din valoarea ARGB\\
Funcția [[rgb|RGB]] compune o culoare în format ARGB din valorile furnizate pentru **R**ed (roșu), **G**reen (verde), **B**lue (albastru), fiecare componentă având valori cuprinse între 0 și 255. Exemplul de mai jos creează culoarea oranj și desenează un cerc cu ea.
clg
color rgb(255, 102, 0)
circle 100, 150, 75
În mod opțional se poate opta pentru un grad diferit de opacitate prin specificarea unei valori pentru canal **A**lpha: 0 - 255, unde 255 înseamnă opacitate maximă, iar 0 înseamnă transparență totală.
clg
color rgb(255, 102, 0)
circle 100, 150, 75
color rgb(255, 102, 0, 128)
circle 150, 100, 75
color rgb(255, 102, 0, 32)
circle 100, 100, 75
Pentru a exemplifica cele menționate este bine de revăzut tabelul ce conține informații despre culorile deja predefinite.
Acum se poate observa în dreptul fiecărei constante valorile canalelor **ARGB** din care este alcătuită (**A** este mereu 255 pentru că toate sunt culori opace, nu transparente), iar așezarea lor ca octeți este cel mai bine văzută în reprezentarea numărului în format hexazecimal (0xAARRGGBB).
{{page>ro:colorconstants}}
----
==== 3) Culoare exprimată printr-un număr ====
Am văzut că o culoare este un [[integerexpressions|număr_întreg]].\\
Numele culorilor (constante) sunt numere, iar funcția [[rgb|RGB]] compune și întoarce o culoare tot ca un [[integerexpressions|număr_întreg]]\\
Cu alte cuvinte, oricare din formele de mai jos va avea același efect, valoarea culorii fiind aceeași (pentru a demonstra acest lucru, înlocuiește instrucțiunea **Color** cu **Print**).
color darkorange #-5227264
color 0xffb03d00 #-5227264
color -5227264 #-5227264
color rgb(176, 61, 0) #-5227264
color rgb(176, 61, 0, 255) #-5227264
color rgb(0xb0, 0x3d, 0x00, 0xff) #-5227264
color rgb(0xb0, 0x3d, 0x00) #-5227264
----
==== Exemplu ====
Rulează codul de mai jos. Trage cu mouse-ul de manetele R, G, B și A sau dă clic pe constantele din dreapta și urmărește codul generat.
{{ro:colorsprogram.png|Program util pentru a învăța cum se alcătuiesc culorile}}
# Program util pentru a învăța cum se alcătuiesc culorile
# Florin Oprea 27.08.2017
culori_valori[] = {BLACK, WHITE, RED, DARKRED, GREEN, DARKGREEN, BLUE, DARKBLUE, CYAN, DARKCYAN, PURPLE, DARKPURPLE, YELLOW, DARKYELLOW, ORANGE, DARKORANGE, GREY, DARKGREY, CLEAR}
culori_nume[] = {"BLACK", "WHITE", "RED", "DARKRED", "GREEN", "DARKGREEN", "BLUE", "DARKBLUE", "CYAN", "DARKCYAN", "PURPLE", "DARKPURPLE", "YELLOW", "DARKYELLOW", "ORANGE", "DARKORANGE", "GREY", "DARKGREY", "CLEAR"}
r=0: g=0: b=0: a=255: c=0
culoarea_veche = 0
outputvisible(true)
graphvisible(true)
graphsize 640, 400
fastgraphics
#crează imaginea de fundal
clg white
color red
circle 75,75,50
penwidth 5
color orange, yellow
circle 150,150,75
penwidth 10
color blue, clear
rect 150,30,150, 100
penwidth 1
img = imagecopy(25,25,200,200)
#desenează decoraținile ferestrei
clg 0xfff0f0f0
color black
font "Courier",12,75
text 25,5,"A": text 65,5,"R": text 105,5,"G": text 145,5,"B"
call adancitura(200, 20, 200, 200, 0)
call adancitura(450, 10, 50, 380, 0)
for f = 0 to 18
color culori_valori[f]
rect 450, f*20+10, 50, 20
color black
text 510,f*20+12,culori_nume[f]
next f
loop:
#verifică unde a făcut clic cu mouse-ul
if clickb = MOUSEBUTTON_LEFT then
#clic pe ARGB
if clicky>15 and clicky <300 then
c = 0
if clickx>15 and clickx<45 then c = 1
if clickx>55 and clickx<85 then c = 2
if clickx>95 and clickx<125 then c = 3
if clickx>135 and clickx<165 then c = 4
end if
#clic pe culorile prestabilite (constante)
if clickx >=450 and clickx<600 and clicky >=10 and clicky <=390 then
culoarea_curenta = culori_valori[(clicky-10)\20]
b=int(culoarea_curenta&0xff)
g=int((culoarea_curenta&0xff00)/0x100)
r=int((culoarea_curenta&0xff0000)/0x10000)
if culoarea_curenta&0xff000000 = 0 then a=0 else a=255
end if
end if
#muse-ul este apăsat, se verifică dacă se mișcă vreun buton ARGB
if mouseb = MOUSEBUTTON_LEFT then
v=mousey-30
if v<0 then v=0
if v>255 then v=255
v=255-v
begin case
case c=1
a=v
case c=2
r=v
case c=3
g=v
case c=4
b=v
end case
else
c=0
end if
#se creează noua culoare
culoarea_curenta = rgb(r,g,b,a)
#desenează și scrie text doar dacă s-a modificat ceva
if culoarea_curenta <> culoarea_veche then
culoarea_veche = culoarea_curenta
call control(30,30,a,white)
call control(70,30,r,red)
call control(110,30,g,green)
call control(150,30,b,blue)
imagedraw img,200,20
color clear, culoarea_curenta
rect 225, 45, 150, 150
txt = "#liniile de mai jos generază aceeași culoare:";chr(10)
color 0xfff0f0f0
rect 430, 10, 16, 381
#culoarea creată este de fapt o constantă?
for f = 0 to 18
if culoarea_curenta = culori_valori[f] then
txt = txt;"color ";culori_nume[f];chr(10)
color black, darkgray
poly {430, f*20+10, 445, f*20+20, 430, f*20+30}
exit for
end if
next f
if a=255 then txt = txt;"color rgb(";r;", ";g;", ";b;")";chr(10)
txt = txt;"color rgb(";r;", ";g;", ";b;", ";a;")";chr(10)
txt = txt;"color ";culoarea_curenta;chr(10)
txt = txt;"color 0x";tohex(culoarea_curenta)
cls
print txt
end if
refresh
pause 0.01
goto loop
subroutine adancitura(x, y, latime, inaltime, culoare)
color gray
rect x-2, y-2, latime+4, inaltime+4
color white
rect x, y, latime+2, inaltime+2
color culoare
rect x, y, latime, inaltime
end subroutine
subroutine control(x, y, valoare, culoare)
color 0xfff0f0f0
rect x-10, y-10, 20, y+265
color gray
rect x-1, y-1, 3, 258
color white
rect x, y, 2, 257
color black
rect x, y, 1, 256
#mâner
yy=y+(255-valoare)
color clear, 0x20000000
circle x+3, yy+3, 5
color culoare
circle x, yy, 5
color black,0x30000000
circle x, yy, 5
color culoare
circle x-1, yy-1, 4
color black,clear
circle x, yy, 5
call adancitura(x-17, y+280, 34, 16, white)
call adancitura(x-17, y+300, 34, 16, white)
color black
text x-15,y+280,valoare
text x-15,y+300,tohex(valoare)
end subroutine