#include "systempalette.h" namespace SystemPalette { uint32_t entries[256]; // Las 256 entradas de la paleta uint8_t numEntries; // El número de entradas existente actualmente // Vacía la paleta void Clear() { // Fijamos el color transparente en 0 y el blanco en 1 entries[0] = 0x00000000; // Transparente entries[1] = 0xffffffff; // Blanco numEntries = 2; // Ya que 'getRGBA' no comprueba que el índice solicitado sea menor que // 'numentries', rellenamos con 'negro' todas las entradas no usadas. for (int i = 2; i < 256; ++i ) entries[i] = 0x000000ff; } // Obtenemos el índice de la paleta para el color especificado. Si no existe se crea. uint8_t getEntry(const uint32_t color) { // ATENCIÓN!!! Si intentamos introducir más de 256 colores empezará a // sobreescribir los primeros colores. Al menos no corromperá la // memoria. Pensar la mejor forma de controlar esto. // Recorremos la paleta... for (int i = 0; i < numEntries; ++i) { // Si encontramos el color, devolvemos su índice y salimos if (entries[i] == color) return i; } // Si no se ha encontrado, lo ponemos al final entries[numEntries] = color; // Y devolvemos su índice return numEntries++; } // Versión de getEntry para obtener el color con los componentes R, G y B uint8_t getEntry(const uint8_t r, const uint8_t g, const uint8_t b) { return getEntry( (r<<24) + (g<<16) + (b<<8) + 255 ); } // Dado un índice, devolvemos su color uint32_t getRGBA(const uint8_t entry) { // ATENCIÓN!!! No compruebo que el parámetro 'entry' sea menor que el // miembro 'numEntries', por lo que se puede acceder a colores no // definidos (por ejemplo tener 4 colores y acceder al color 8). La // razón es que necesito que esta función sea lo más rápida posible. // En cualquier caso, nunca se va a salir de la memoria ni nada raro. return entries[entry]; } }