/*--------------------------------------------------------------------
 * FICHERO:  Vtif.c
 * OBJETIVO: Probar el objeto Tiff
 * AUTOR:    Pedro Reina
 * FECHA:    S.8.7.1995
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Ficheros de cabecera
 *------------------------------------------------------------------*/

#include "Diblane.h"   /* Para las comprobaciones */
#include "Tiff.h"

/*--------------------------------------------------------------------
 * Declaracin de funciones
 *------------------------------------------------------------------*/

void P_Tif_Abre();
void P_Datos();
void P_Tif_LeeImagenBN();
void P_Tif_LeeBandaBN();
void P_Tif_Siguiente();
void P_Tif_Cierra();
void P_Tif_Crea();
void P_ImagenSimpleBN();
void P_ImagenBandasBN();
void P_ImagenGrandeBN();

diblane CreaDiblaneEjemplo();
diblane CreaDiblaneGrande();

/*--------------------------------------------------------------------
 * Variable global
 *------------------------------------------------------------------*/

tiff Tiff;

/*--------------------------------------------------------------------
 * Programa principal
 *------------------------------------------------------------------*/
void main()
  {
  int Opcion, Sigue=1;
  contador Fil, Col;

  Pan_Define (PAN_TEXTO);
  while ( Sigue )
    {
    Pan_Color (NEGRO,BLANCO);
    Pan_Limpia();
    Fil = 0, Col = 3;
    Pan_PonTexto (Fil++,Col,"Prueba del objeto Tiff" );
    Pan_PonTexto (Fil++,Col,"======================" );
    Fil++;
    Pan_PonTexto (Fil++,Col,"0. Fin del programa" );
    Pan_PonTexto (Fil++,Col,"1. Paso a grfico" );
    Pan_PonTexto (Fil++,Col,"2. Paso a texto" );
    Pan_PonTexto (Fil++,Col,"3. Tif_Abre()" );
    Pan_PonTexto (Fil++,Col,"4. Datos de la imagen" );
    Pan_PonTexto (Fil++,Col,"5. Tif_LeeImagenBN()" );
    Pan_PonTexto (Fil++,Col,"6. Tif_LeeBandaBN()" );
    Pan_PonTexto (Fil++,Col,"7. Tif_Siguiente()" );
    Pan_PonTexto (Fil++,Col,"8. Tif_Cierra()" );
    Pan_PonTexto (Fil++,Col,"9. Tif_Crea()" );
    Col--;
    Pan_PonTexto (Fil++,Col,"10. Imagen simple" );
    Pan_PonTexto (Fil++,Col,"11. Imagen con 3 bandas" );
    Pan_PonTexto (Fil++,Col,"12. Imagen grande" );
    Fil++;
    Pan_PonTexto (Fil++,Col,"Introduce nmero de opcin: " );
    scanf ( "%d", &Opcion );
    getchar();

    switch ( Opcion )
      {
      case 0:   Sigue = 0;               break;
      case 1:   Pan_Cierra();
                Pan_Define (PAN_GRAFICO);
                break;
      case 2:   Pan_Cierra();
                Pan_Define (PAN_TEXTO);
                break;
      case 3:   P_Tif_Abre();            break;
      case 4:   P_Datos();               break;
      case 5:   P_Tif_LeeImagenBN();     break;
      case 6:   P_Tif_LeeBandaBN();      break;
      case 7:   P_Tif_Siguiente();       break;
      case 8:   P_Tif_Cierra();          break;
      case 9:   P_Tif_Crea();            break;
      case 10:  P_ImagenSimpleBN();      break;
      case 11:  P_ImagenBandasBN();      break;
      case 12:  P_ImagenGrandeBN();      break;
      }
    }
  Pan_Cierra();
  }

/*--------------------------------------------------------------------
 * Funcin P_Tif_Abre()
 *------------------------------------------------------------------*/
void P_Tif_Abre()
  {
  cadena Propuesta, NombreFich;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Tif_Abre()");

  Propuesta = Fch_Nombre ("","tif");
  Pan_PonTexto (2,0,"Nombre del fichero TIFF:");
  NombreFich = Usr_Texto (Propuesta,30,4,0,BLANCO,NEGRO);
  Usr_BorraZona (NEGRO);
  Pan_Color (NEGRO,BLANCO);
  Cad_Destruye (Propuesta);

  if ( (Tec_Ultima() != TEC_ESC) &&
       (Tiff = Tif_Abre (NombreFich)) )
    { Pan_PonTexto (6,0,"Fichero abierto"); }

  Cad_Destruye (NombreFich);
  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Datos()
 *------------------------------------------------------------------*/
void P_Datos()
  {
  contador i;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Datos de la imagen");

  Pan_PonTexto (2,0,"Anchura: ");
  Pan_Entero (Tif_Ancho(Tiff),1);

  Pan_PonTexto (3,0,"Altura: ");
  Pan_Entero (Tif_Alto(Tiff),1);

  Pan_PonTexto (4,0,"Mtodo de compresin: ");
  Pan_Entero (Tif_Compresion(Tiff),1);

  Pan_PonTexto (5,0,"Bits por pixel: ");
  Pan_Entero (Tif_BitsPorPixel(Tiff),1);

  Pan_PonTexto (6,0,"Interpretacin fotomtrica: ");
  Pan_Entero (Tif_Interpretacion(Tiff),1);

  Pan_PonTexto (7,0,"Filas por banda: ");
  Pan_Entero (Tif_FilasPorBanda(Tiff),1);

  Pan_PonTexto (8,0,"Muestras por pixel: ");
  Pan_Entero (Tif_MuestrasPorPixel(Tiff),1);

  Pan_PonTexto (9,0,"Nmero de bandas: ");
  Pan_Entero (Tif_TotalBanda(Tiff),1);

  Pan_PonTexto (10,0,"Tamao de las bandas: ");
  for ( i=0 ; i<Tif_TotalBanda(Tiff) ; i++ )
    {
    Pan_Entero (Tif_TamanoBanda(Tiff,i),1);
    Pan_Caracter (' ');
    }

  Pan_PonTexto (11,0,"Desplazamiento a los datos: ");
  for ( i=0 ; i<Tif_TotalBanda(Tiff) ; i++ )
    {
    Pan_Entero (Tif_Desplazamiento(Tiff,i),1);
    Pan_Caracter (' ');
    }

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Tif_LeeImagenBN()
 *------------------------------------------------------------------*/
void P_Tif_LeeImagenBN()
  {
  diblane Dibujo=NIL;
  entero  Alto, Ancho;
  zona    Zona=NIL;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Tif_LeeImagenBN()");

  if ( (Ancho = Tif_Ancho(Tiff)) &&
       (Alto  = Tif_Alto(Tiff))  &&
       (Dibujo = Dbn_Crea (Ancho, Alto)) )
    {
    if ( Zona = Zon_Crea (2,2,19,77) )
      {
      if ( Tif_LeeImagenBN (Tiff, Dbn_Dato(Dibujo)) )
        { Dbn_Muestra (Dibujo, Zona, ROJO, BLANCO); }
      else
        { Pan_PonTexto (2,0,"No se puede leer la imagen"); }
      }
    else
      { Pan_PonTexto (2,0,"No se puede crear zona"); }
    }
  else
    { Pan_PonTexto (2,0,"No se puede crear diblane"); }

  if ( Dibujo )  { Dbn_Destruye (Dibujo); }
  if ( Zona )  { Zon_Destruye (Zona); }

  Pan_Color (NEGRO,BLANCO);
  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Tif_LeeBandaBN()
 *------------------------------------------------------------------*/
void P_Tif_LeeBandaBN()
  {
  diblane  Dibujo=NIL;
  entero   Alto, Ancho;
  contador Banda;
  zona     Zona=NIL;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Tif_LeeBandaBN()");

  Pan_PonTexto (2,0,"Banda: ");
  Banda = Usr_Entero (0,2,0,Tif_TotalBanda(Tiff)-1,2,7,NEGRO,BLANCO);

  if ( (Ancho = Tif_Ancho(Tiff)) &&
       (Alto  = Tif_FilasPorBanda(Tiff))  &&
       (Dibujo = Dbn_Crea (Ancho, Alto)) )
    {
    if ( Zona = Zon_Crea (4,2,19,77) )
      {
      if ( Tif_LeeBandaBN (Tiff, Banda, Dbn_Dato(Dibujo)) )
        { Dbn_Muestra (Dibujo, Zona, ROJO, BLANCO); }
      else
        { Pan_PonTexto (2,0,"No se puede leer la banda"); }
      }
    else
      { Pan_PonTexto (2,0,"No se puede crear zona"); }
    }
  else
    { Pan_PonTexto (2,0,"No se puede crear diblane"); }

  if ( Dibujo )  { Dbn_Destruye (Dibujo); }
  if ( Zona )  { Zon_Destruye (Zona); }

  Pan_Color (NEGRO,BLANCO);
  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Tif_Siguiente()
 *------------------------------------------------------------------*/
void P_Tif_Siguiente()
  {
  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Tif_Siguiente()");

  if ( Tif_Siguiente (Tiff) )
    { Pan_PonTexto (2,0,"Se ha cargado el siguiente directorio"); }
  else
    { Pan_PonTexto (2,0,"No se ha cargado otro directorio"); }

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Tif_Cierra()
 *------------------------------------------------------------------*/
void P_Tif_Cierra()
  {
  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Tif_Cierra()");

  if ( Tiff )
    {
    Tif_Cierra (Tiff);
    Tiff = NIL;
    Pan_PonTexto (2,0,"Tiff cerrado.");
    }
  else
    { Pan_PonTexto (2,0,"No estaba abierto."); }

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Tif_Crea()
 *------------------------------------------------------------------*/
void P_Tif_Crea()
  {
  cadena Propuesta, NombreFich;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Tif_Crea()");

  Propuesta = Fch_Nombre ("","tif");
  Pan_PonTexto (2,0,"Nombre del fichero TIFF:");
  NombreFich = Usr_Texto (Propuesta,30,4,0,BLANCO,NEGRO);
  Usr_BorraZona (NEGRO);
  Pan_Color (NEGRO,BLANCO);
  Cad_Destruye (Propuesta);

  if ( (Tec_Ultima() != TEC_ESC) &&
       (Tiff = Tif_Crea (NombreFich)) )
    { Pan_PonTexto (6,0,"Fichero creado"); }

  Cad_Destruye (NombreFich);
  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_ImagenSimpleBN()
 *------------------------------------------------------------------*/
void P_ImagenSimpleBN()
  {
  diblane Dibujo=NIL;
  entero  Alto=120, Ancho=170;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de escritura de una imagen simple BN");

  if ( Dibujo = CreaDiblaneEjemplo() )
    {
    if ( Tif_EscribeDirectorioBN (Tiff, Ancho, Alto, 1,
                                  TIF_SIN_COMPRESION, TIF_NEGRO_CERO) )
      { 
      if ( Tif_EscribeBandaBN (Tiff, Alto*((Ancho+7)/8), 0, Dbn_Dato(Dibujo)) )
        { Pan_PonTexto (2,0,"Imagen escrita"); }
      else  
        { Pan_PonTexto (2,0,"No se puede escribir imagen"); }
      }   
    else
      { Pan_PonTexto (2,0,"No se puede escribir directorio"); }
    }
  else
    { Pan_PonTexto (2,0,"No se puede crear diblane"); }

  if ( Dibujo )  { Dbn_Destruye (Dibujo); }

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_ImagenBandasBN()
 *------------------------------------------------------------------*/
void P_ImagenBandasBN()
  {
  diblane  Dibujo=NIL;
  entero   Alto=120, Ancho=170;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de escritura de una imagen con 3 bandas BN");

  if ( Dibujo = CreaDiblaneEjemplo() )
    {
    if ( Tif_EscribeDirectorioBN (Tiff, Ancho, 3*Alto, 3,
                                  TIF_SIN_COMPRESION, TIF_BLANCO_CERO) )
      {
      Tif_EscribeBandaBN (Tiff, Alto*((Ancho+7)/8), 0, Dbn_Dato(Dibujo));
      Dbn_ReflejaHorizontal (Dibujo);
      Tif_EscribeBandaBN (Tiff, Alto*((Ancho+7)/8), 1, Dbn_Dato(Dibujo));
      Dbn_ReflejaVertical (Dibujo);
      if ( Tif_EscribeBandaBN (Tiff, Alto*((Ancho+7)/8), 2, Dbn_Dato(Dibujo)) )
        { Pan_PonTexto (2,0,"Imagen escrita"); }
      else  
        { Pan_PonTexto (2,0,"No se puede escribir imagen"); }
      }   
    else
      { Pan_PonTexto (2,0,"No se puede escribir directorio"); }
    }
  else
    { Pan_PonTexto (2,0,"No se puede crear diblane"); }

  if ( Dibujo )  { Dbn_Destruye (Dibujo); }

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_ImagenGrandeBN()
 *------------------------------------------------------------------*/
void P_ImagenGrandeBN()
  {
  diblane Dibujo=NIL;
  entero  Alto=272, Ancho=512;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de escritura de una imagen grande BN");

  if ( Dibujo = CreaDiblaneGrande() )
    {
    if ( Tif_EscribeImagenBN (Tiff, Ancho, Alto, 0, Dbn_Dato(Dibujo),
                                  TIF_SIN_COMPRESION, TIF_NEGRO_CERO) )
      { Pan_PonTexto (2,0,"Imagen escrita"); }   
    else
      { Pan_PonTexto (2,0,"No se puede escribir imagen"); }
    }
  else
    { Pan_PonTexto (2,0,"No se puede crear diblane"); }

  if ( Dibujo )  { Dbn_Destruye (Dibujo); }

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin CreaDiblaneEjemplo()
 *------------------------------------------------------------------*/
diblane CreaDiblaneEjemplo()
  {
  diblane Diblane;
  entero  i, j;
  
  if ( Diblane = Dbn_Crea ((entero)170,(entero)120) )
    {
    for ( i=0 ; i<170 ; i++ )
      { 
      Dbn_PonPunto (Diblane,   0L, i, 1); 
      Dbn_PonPunto (Diblane,   1L, i, 1); 
      Dbn_PonPunto (Diblane, 118L, i, 1); 
      Dbn_PonPunto (Diblane, 119L, i, 1); 
      }
    for ( i=0 ; i<120 ; i++ )
      { 
      Dbn_PonPunto (Diblane, i,   0L, 1); 
      Dbn_PonPunto (Diblane, i,   1L, 1); 
      Dbn_PonPunto (Diblane, i, 168L, 1); 
      Dbn_PonPunto (Diblane, i, 169L, 1); 
      }
    for ( i=5 ; i<20 ; i++ )
      { 
      for ( j=7 ; j<15 ; j++ )
        { Dbn_PonPunto (Diblane, i, j, 1); }
      }
    }

  return ( Diblane );
  }

/*--------------------------------------------------------------------
 * Funcin CreaDiblaneGrande()
 *------------------------------------------------------------------*/
diblane CreaDiblaneGrande()
  {
  diblane Diblane;
  entero  i, j;
  
  if ( Diblane = Dbn_Crea ((entero)512,(entero)272) ) /* Aprox. 17K */
    {
    for ( i=0 ; i<512 ; i++ )
      { 
      Dbn_PonPunto (Diblane,   0L, i, 1); 
      Dbn_PonPunto (Diblane,   1L, i, 1); 
      Dbn_PonPunto (Diblane,   2L, i, 1); 
      Dbn_PonPunto (Diblane,   3L, i, 1); 
      Dbn_PonPunto (Diblane, 268L, i, 1); 
      Dbn_PonPunto (Diblane, 269L, i, 1); 
      Dbn_PonPunto (Diblane, 270L, i, 1); 
      Dbn_PonPunto (Diblane, 271L, i, 1); 
      }
    for ( i=0 ; i<272 ; i++ )
      { 
      Dbn_PonPunto (Diblane, i,   0L, 1); 
      Dbn_PonPunto (Diblane, i,   1L, 1); 
      Dbn_PonPunto (Diblane, i,   2L, 1); 
      Dbn_PonPunto (Diblane, i,   3L, 1); 
      Dbn_PonPunto (Diblane, i, 508L, 1); 
      Dbn_PonPunto (Diblane, i, 509L, 1); 
      Dbn_PonPunto (Diblane, i, 510L, 1); 
      Dbn_PonPunto (Diblane, i, 511L, 1); 
      }
    for ( i=40 ; i<80 ; i++ )
      { 
      for ( j=40 ; j<80 ; j++ )
        { 
        Dbn_PonPunto (Diblane, i, j, 1); 
        Dbn_PonPunto (Diblane, i, 512-j, 1); 
        }
      }
    for ( i=192 ; i<232 ; i++ )
      { 
      for ( j=80 ; j<432 ; j++ )
        { Dbn_PonPunto (Diblane, i, j, 1); }
      }
    }                                 

  return ( Diblane );
  }
