> For the complete documentation index, see [llms.txt](https://03-jon-perez.gitbook.io/coding-library/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://03-jon-perez.gitbook.io/coding-library/c/minilibx/colores.md).

# Colores

Los colores se presentan en formato int. Por lo tanto, es necesario hacer algunas cosas complicadas para obtener un int que pueda contener los valores ARGB.

### El estándar de los enteros de color

Cambiamos los bits para utilizar el formato TRGB. Para definir un color, lo inicializamos asi 0xTTRRGGBB, Donde cada carácter representa lo siguiente:

| Letra | Descripcion      | Ejemplo    |
| ----- | ---------------- | ---------- |
| T     | Transparencia    |            |
| R     | Componente rojo  | 0x00FF0000 |
| G     | Componente Verde | 0x0000FF00 |
| B     | Componente Azul  | 0x000000FF |

Podemos utilizar dos métodos para codificar y decodificar los colores:

* BitShifting
* char/int conversion

### BitShifting <a href="#bitshifting" id="bitshifting"></a>

Dado que cada byte contiene 2^8 = 256 valores (1 byte = 8 bits), y que los valores RGB van de 0 a 255, nos cabe perfectamente un entero (ya que un int son 4 bytes). Para establecer los valores de forma programada utilizamos el desplazamiento de bits. Es decir que un int nos entra perfectamente la combinacion de estos 4 bytes que representan un color.

Para ello utilizaremos la siguiente funcion que nos junta los 4 parametros en un solo integrer, es decir una funcion que nos haga la **combinacion de colores**:

```c
int	create_trgb(int t, int r, int g, int b)
{	
    return (t << 24 | r << 16 | g << 8 | b);
}
```

Esta fucnion lo que hace es superponer los 4 int en uno solo, creando una combinacion de sus bites, mediante el [operador de bites ( | )](/coding-library/c/operadores-de-bits.md#or-or). Sin emabrgo antes de ralizar la comparacion para la superposicon de los bits, tenemos que desplazarlos a sus posicones correspondiente para asi a la hora de juntarlos no se superponga uno encima del otro

* EL byte de trasparencia (T) esta al final del todo, por lo que habra que desplazarlo 24 posiciones hacia la izquierda
* El byte del rojo (R) habra que despalzarlo 16 bites
* El byte del Verde (G) habra que despalzarlo 8 bites
* El byte del azul (B) al ser el ultimo byte, no es necesario depalzarlo

Como puedes ver los desplaamos en 8 en 8, que son los bites que ocupan un byte.

<figure><img src="https://3717492794-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FTbieshNvNxHi9vw1SFR3%2Fuploads%2F6AI7rBUw5mYVUjtwXMDW%2FScreen%20Shot%202022-11-10%20at%2011.45.25%20AM.png?alt=media&amp;token=acd8a579-4cbe-443f-a60d-331953e3101a" alt=""><figcaption></figcaption></figure>

En el caso de que queramos separa la union de estos colores en los 4 parametros (TRGB) habra que utilizar las siguientes funciones:

```c
int	get_t(int trgb)
{
	return ((trgb >> 24) & 0xFF);
}

int	get_r(int trgb)
{
	return ((trgb >> 16) & 0xFF);
}

int	get_g(int trgb)
{
	return ((trgb >> 8) & 0xFF);
}

int	get_b(int trgb)
{
	return (trgb & 0xFF);
}
```

Estas funciones lo que hacen es comparar el byte correspondiente de cada color con una mascara de zero (0xFF) y de esta manera eliminar los valores sobrantes a nuestro color.&#x20;

<figure><img src="https://3717492794-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FTbieshNvNxHi9vw1SFR3%2Fuploads%2FLdeLDZWfydBFan96oNYi%2FScreen%20Shot%202022-11-10%20at%2011.54.00%20AM.png?alt=media&amp;token=c58a52a0-48d0-422c-ae98-a58e2f6cfe03" alt=""><figcaption></figcaption></figure>

Para que quede mas claro este concepto lo esta explicado en el siguiente vido:

{% embed url="<https://www.youtube.com/watch?v=mjqswwqE1RQ>" %}
