next up previous
Next: Bibliography Up: Arquitectura Final BiCoTI-II Previous: Bibliotecas Gráficas


La Fachada de Actor Image

Los templates ofrecen muchas ventajas, especialmente desde el punto de vista de la performance. En contrapartida el uso excesivo de templates, sobre todos entre clases interdependientes, puede volverse tedioso por respetar la coherencia de tipos.
En BiCoTI-II, no son muchos los templates; dentro de los actores, solo son templates los bicotiActorGraphic2DImage. Un imagen gráfica de pixel unsigned char sería una instancia de bicotiActorGraphic2DImage<unsigned char>. Un factory QT asociado sería bicotiHomologousFactoryQT<unsigned char, bicotiPixelConverterChar2QRGB>. El segundo parámetro de este último template debe ser compatible con el primero, es decir no son independientes.
El problema de la compatibilidad entre templates era mucho más grave en BiCoTI-I y se había encontrado en su momento, una solución conveniente; la fachada. La fachada es un pattern cuyo propósito es enmascarar complejas relaciones entre diversos objetos detrás de una interface simplificada, que aún sin abarcar todo el dominio de aplicación enmascarado, logra prestar los servicios más generales del módulo.
Existe en BiCoTI-I toda una arquitectura de fachadas, de hecho hay una fachada por módulo y fachadas que enmascaran otras fachadas, centrando todo en la bicotiImageImplementation. Nuestro equipo enriqueció las fachadas previas, agregando el módulo de I/O para todas las implementaciones y extendió la fachada de imagen para agregar capacidades gráficas en el caso específico del Actor Image.

Veamos otra versión del ejemplo (2.3), usando fachadas.

#include <image_2D_array_char.hpp>
void main( int argc, char ** argv )
{
  bicotiImage2DArrayChar imagen;
  imagen.BuildMapper();
  imagen.GetMapper()->BuildDeviceFile( "archivos1.jpg" );
  imagen.GetMapper()->BuildMapperJPEGIJG();
  imagen.GetMapper()->Read();
  imagen.GetMapper()->BuildDeviceFile( "salida1.jpg" );
  imagen.GetMapper()->Write();
  imagen.DestroyMapper();
};
Podemos ver la idea práctica de las fachadas. Cuando se elige una instancia de esta, se selecciona además de la dimensión e implementación, el tipo de pixel a usar[*] y el template para el resto de los objetos se resuelve automáticamente. La fachada encapsula además los punteros y las dependencias entre componentes.

En el siguiente ejemplo se usa la nueva fachada de Actor Image para leer la imagen de disco y mostrarla en una ventana del mismo tamaño de la imagen leída. Aunque a veces puede ser tedioso escribir los nombre de las clases BiCoTI, son estos ejemplos casi autoexplicativos los que muestran la conveniencia en la elección. Merece comentario en el ejemplo la instrucción SetMainActor( true ) del actor, indica que al cerrar la ventana se detenga el Event Loop.

#include <actor_image_2D_rgb_char_qt.hpp>

void main( int argc, char ** argv )
{
  bicotiActorImage2DRGBCharQT imagen;
  bicotiActorImage2DRGBCharQT :: EventLoopManager event_loop( argc, argv );
  bicotiActorImage2DRGBCharQT :: HomologousFactory factory;

  imagen.BuildMapper();
  imagen.GetMapper()->BuildDeviceFile( "archivos.jpg" );
  imagen.GetMapper()->BuildMapperJPEGIJG();
  imagen.GetMapper()->Read();
  imagen.DestroyMapper();

  int width = imagen.GetImplementation()->GetX0Size();
  int height = imagen.GetImplementation()->GetX1Size();
  imagen.GetActor()->SetSize( width , height );
  imagen.GetActor()->SetMainActor( true );
  factory.CreateHomologous( imagen.GetActor() );

  event_loop.Start();
};

Terminaremos viendo otro ejemplo en el que leemos la imagen sobre un actor monocromático, le sumamos 1, calculamos el logaritmo y multiplicamos por 42 todos los pixeles de la imagen para finalmente mostrarlo.

#include <actor_image_2D_char_qt.hpp>

void main( int argc, char ** argv )
{
  bicotiActorImage2DCharQT imagen;
  bicotiActorImage2DCharQT :: EventLoopManager event_loop( argc, argv );
  bicotiActorImage2DCharQT :: HomologousFactory factory;

  imagen.BuildMapper();
  imagen.GetMapper()->BuildDeviceFile( "archivos.jpg" );
  imagen.GetMapper()->BuildMapperJPEGIJG();
  imagen.GetMapper()->Read();
  imagen.DestroyMapper();

  imagen.BuildOperatorUnary();
  imagen.GetOperatorUnary()->Addition( 1 );
  imagen.GetOperatorUnary()->Logarithm();
  imagen.GetOperatorUnary()->Product( 42 );
  imagen.DestroyOperatorUnary();

  int width = imagen.GetImplementation()->GetX0Size();
  int height = imagen.GetImplementation()->GetX1Size();
  imagen.GetActor()->SetSize( width , height );
  imagen.GetActor()->SetMainActor( true );
  factory.CreateHomologous( imagen.GetActor() );

  event_loop.Start();
};


next up previous
Next: Bibliography Up: Arquitectura Final BiCoTI-II Previous: Bibliotecas Gráficas
Claudio Risso 2001-06-02