1 - Componentes Básicos

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.

    Es conveniente mencionar que para nosotros un Pixel, es una clase que cumple con una interfaz previamente definida; esta interfaz pretende hacer del pixel, una extensión de los tipos nativos del lenguaje.

    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.