diff --git a/source/common/systempalette.cpp b/source/common/systempalette.cpp new file mode 100644 index 0000000..af80ec0 --- /dev/null +++ b/source/common/systempalette.cpp @@ -0,0 +1,54 @@ +#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++; + } + + // 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]; + } +} diff --git a/source/common/systempalette.h b/source/common/systempalette.h new file mode 100644 index 0000000..de6ff42 --- /dev/null +++ b/source/common/systempalette.h @@ -0,0 +1,14 @@ +#pragma once +#include + +namespace SystemPalette +{ + // Vacía la paleta + void Clear(); + + // Obtenemos el índice de la paleta para el color especificado. Si no existe se crea. + uint8_t getEntry(const uint32_t color); + + // Dado un índice, devolvemos su color + uint32_t getRGBA(const uint8_t entry); +}