1.2 - Pixels
Los Pixels son los elemementos de una imagen digital, normalmente la primera aproximación a una imagen digital es como array de Pixels. En cada lugar del array, en principio N dimensional, se ubica un Pixel.
Al tratarse de un bloque de muy bajo nivel, las clases pueden usarse independientemente de todos los demás bloques.
Se han implementado esencialmente pixels RGB, VectorialStatic, VectorialDynamic y Complex.
Conceptualmente una pixel se puede pensar como un array de algún tipo, aunque no tiene porque limitarse a ello. Vale la pena mencionar que el primer punto donde los "templates" hicieron aparición, justamente en los pixeles. La razón fue que para tipos nativos del lenguaje como, char, int, float, etc; la performance mostrada es superior a si hiceramos una clase para representar a estos. Al mismo tiempo, queríamos poder expandir el concepto de Pixel y poder utilizar pixels mas "complejos". Para una discusión mas detallada sobre decisiones de diseño ir a Criterios de Diseño.
El
pixel es uno de lo "puntos de flexibilización" o "hot spots" de
bicoti, alcanza con que este cumpla con la interfaz de le hablamos antes.
No hay herencia entre pixels, la razón es que no es necesario, el
pixel se usa como argumento de un template, y por lo tanto lo que necesitamos
del pixel es la interfaz antes mencionada; además los tipos nativos
de lenguaje son "potenciales" pixels, como no son clases no podríamos
ubicarlos en un árbol de herencia. Debido a esto explicaremos cada
una de las clases
por separado, para conocer esta
interfaz en común, ir a restriciones
de pixels.
Véase la especificación detallada de cada clase en :
La diferencia más destacable entre las clases implementadas es en la forma de alojar memoria, salvo el caso de bicotiPixelComplex. Algunas pruebas de performance han mostrado que es mas eficiente, en términos de tiempos, y produce menos fraccionamineto de memoria, tener almacenadas las componentes en variables distintas o en un array estático, cuyo tamaño se fija en tiempo de compilación.Por ejmplo para representar el concepto de pixel RGB, puedo utilizar bicotiRGB, bicotiPixelVectorialStatic o bicotiPixelVectorialDynamic.
En el caso de bicotiRGB
class bicotiRGB
{
private:
ColorType red;
ColorType green;
ColorType blue;
.
.
.
Por otro lado bicotiPixelVectorialStatic almacena las variables en un Array estático.
class bicotiPixelVectorialStatic
{
private:
ColorType colors[ colors_number ];
.
.
.
Para que el array
sea estático, el tamaño debe conocerse en tiempo de compilación,
por lo tanto esta clase tiene un segundo parámetro ( "template"
) para indicar la cantidad de "colores", el entero "colors_number".
Los pixels estáticos tienen
la ventaja que pueden usarse para cualquier cantidad de "colores", y podrían
ser de utilidad para "prototipar" algún algoritmo donde no alcance
con los pixels existentes, pero es importante destacar que si se desea
usar por ejemplo un pixel UVWX( colors_number = 4 ), como una componente
importante en alguna estructura o algoritmo,siempre
será más eficiente crear una nueva especialización
al estilo bicotiRGB, que usar un pixel vectorial estático.
Ahora, cuando sea necesario un pixel con cantidad de "colores" conocido solo en tiempo de ejecución, hay que alojar los componentes en un array dinámico ( de largo variable ). Esta implementación fué la que se adoptó para la clase base "bicotiPixelVectorialDynamic".
class bicotiPixelVectorialDynamic
{
private:
ColorType * ptr_colors;
unsigned colors_number;
.
.
.
Al igual que en bicotiPixelVectorialStatic, hacer una especialización, como en bicotiRGB, mejora la performance. Notar que esta clases fueron presentadas en orden descendente en performance.