/*--------------------------------------------------------------------
 * FICHERO:       Tiff.h
 * OBJETIVO:      Definir el objeto "Tiff"
 * IDENTIFICADOR: Tif
 * AUTOR:         Pedro Reina
 * FECHA:         V.14.7.1995
 * OBJETOS UTILIZADOS: Memoria, Cadena, Usuario, Fichero
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Funciones pblicas
 *
 *   Tif_Abre()                TifAbre.c
 *   Tif_Cierra()              TifCreOb.c
 *   Tif_Ancho()               TifAncho.c
 *   Tif_Alto()                TifAlto.c
 *   Tif_BitsPorPixel()        TifBPP.c
 *   Tif_Compresion()          TifCompr.c
 *   Tif_Interpretacion()      TifInter.c
 *   Tif_FilasPorBanda()       TifFilBa.c
 *   Tif_MuestrasPorPixel()    TifMuePi.c
 *   Tif_TotalBanda()          Tiff.h
 *   Tif_TamanoBanda()         TifTamBa.c
 *   Tif_Siguiente()           TifSigui.c
 *   Tif_Tamano()              TifTaman.c
 *   Tif_LeeImagenBN()         TifLeIBN.c
 *   Tif_LeeBandaBN()          TifLeBBN.c
 *   Tif_Crea()                TifCrea.c
 *   Tif_EscribeDirectorioBN() TifEsDBN.c
 *   Tif_EscribeImagenBN()     TifEsIBN.c
 *   Tif_EscribeBandaBN()      TifEsBBN.c
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Funciones conocidas
 *
 *   Ninguna
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Funciones privadas
 *
 *   Tif_CreaObjeto()        TifCreOb.c
 *   Tif_Fichero()           Tiff.h
 *   Tif_PonFichero()        Tiff.h
 *   Tif_Formato()           Tiff.h
 *   Tif_PonFormato()        Tiff.h
 *   Tif_Directorio()        Tiff.h
 *   Tif_PonDirectorio()     Tiff.h
 *   Tif_TotalTag()          Tiff.h
 *   Tif_PonTotalTag()       Tiff.h
 *   Tif_PonTotalBanda()     Tiff.h
 *   Tif_ComienzoDir()       Tiff.h
 *   Tif_PonComienzoDir()    Tiff.h
 *   Tif_MetodoCompr()       Tiff.h
 *   Tif_PonMetodoCompr()    Tiff.h
 *   Tif_Destruye()          TifCreOb.c
 *   Tif_LeeDirectorio()     TifLeeDi.c
 *   Tif_NumeroTag()         TifNuTag.c
 *   Tif_Desplazamiento()    TifDespl.c
 *------------------------------------------------------------------*/

#ifndef _TIFF_
#define _TIFF_

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

#include "Memoria.h"
#include "Cadena.h"
#include "Usuario.h"
#include "Fichero.h"

/*--------------------------------------------------------------------
 * Definicin de macros constantes
 *------------------------------------------------------------------*/

#define TIF_CABECERA     8
#define TIF_LONGITUDTAG 12

/* Orden de los octetos */

#define TIF_MOTOROLA (octeto)0
#define TIF_INTEL    (octeto)1

/* Modos de compresin */

#define TIF_SIN_COMPRESION (contpos)1
#define TIF_CCITT1D        (contpos)2
#define TIF_FAX3           (contpos)3
#define TIF_FAX4           (contpos)4
#define TIF_LZW            (contpos)5
#define TIF_JPEG           (contpos)6
#define TIF_PACKBITS   (contpos)32773

/* Interpretaciones fotomtricas */

#define TIF_BLANCO_CERO  (contpos)0
#define TIF_NEGRO_CERO   (contpos)1
#define TIF_RGB          (contpos)2
#define TIF_PALETA       (contpos)3
#define TIF_MASCARA      (contpos)4

/*--------------------------------------------------------------------
 * Definicin del tipo "tiff"
 *------------------------------------------------------------------*/
typedef struct {
               fichero  Fichero;
               octeto   Formato;
               contador TotalTag;
               contador TotalBanda;
               entero   ComienzoDir;
               contpos  MetodoCompr;
               memoria  Directorio;
               } Tif_st, *tiff;

/*--------------------------------------------------------------------
 * Variables globales
 *------------------------------------------------------------------*/

   /* Ninguna */

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

tiff    Tif_CreaObjeto();
void    Tif_Destruye();
tiff    Tif_Abre();
void    Tif_Cierra();
tiff    Tif_Crea();
logico  Tif_LeeDirectorio();
contpos Tif_NumeroTag();
entero  Tif_ValorTag();
entero  Tif_Ancho();
entero  Tif_Alto();
logico  Tif_LeeDato();
logico  Tif_Siguiente();
contpos Tif_Compresion();
contpos Tif_Interpretacion();
contpos Tif_MuestrasPorPixel();
entero  Tif_FilasPorBanda();
entero  Tif_TamanoBanda();
entero  Tif_Desplazamiento();
entero  Tif_Tamano();
logico  Tif_LeeBandaBN();
logico  Tif_LeeImagenBN();

/*--------------------------------------------------------------------
 * Estructura de un fichero TIFF (Tag Image File Format)
 *
 *   Los primeros 8 octetos son la cabecera
 *     Los dos primeros pueden ser
 *       MM -> El fichero usa formato Motorola
 *       II -> El fichero usa formato Intel
 *     Los dos siguientes son el nmero 42, y ya debe estar en el
 *     formato definido anteriormente
 *     Los cuatro siguientes son un puntero al primer
 *     directorio de imagen (Image File Directory, IFD)
 *  
 *   Cada directorio tiene esta estructura
 *     Dos octetos que indican cuntos "tags" (etiquetas) tiene
 *     el directorio
 *     Los tags, de 12 octetos cada uno
 *     Cuatro octetos que son el puntero al siguiente directorio
 *     (si no hay ms, cero)
 *
 *   Cada tag tiene esta estructura
 *     Dos octetos indican el nmero del tag
 *     Dos octetos indican el tipo del tag
 *     Cuatro octetos indican la longitud del tag
 *     Cuatro octetos indican el valor (o valores) del tag o
 *     bien un puntero a los datos
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Definicin de macros funciones
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * MACRO:    Tif_Fichero()
 * OBJETIVO: Decir el fichero asociado con un tiff
 * ENTRADAS: Un tiff
 * SALIDAS:  El fichero asociado
 * EJEMPLO:  Tif_Fichero ( Imagen )
 *------------------------------------------------------------------*/
#define Tif_Fichero(t)  ((t)->Fichero)

/*--------------------------------------------------------------------
 * MACRO:    Tif_PonFichero()
 * OBJETIVO: Anotar el fichero asociado con un tiff
 * ENTRADAS: Un tiff y un fichero
 * SALIDAS:  El fichero asociado
 * EJEMPLO:  Tif_PonFichero ( Imagen, Fichero )
 *------------------------------------------------------------------*/
#define Tif_PonFichero(t,f)  (((t)->Fichero)=(f))

/*--------------------------------------------------------------------
 * MACRO:    Tif_Formato()
 * OBJETIVO: Decir el formato usado por un tiff
 * ENTRADAS: Un tiff
 * SALIDAS:  El formato
 * EJEMPLO:  Tif_Formato ( Imagen )
 *------------------------------------------------------------------*/
#define Tif_Formato(t)  ((t)->Formato)

/*--------------------------------------------------------------------
 * MACRO:    Tif_PonFormato()
 * OBJETIVO: Anotar el formato asociado con un tiff
 * ENTRADAS: Un tiff y el formato
 * SALIDAS:  El formato
 * EJEMPLO:  Tif_PonFormato ( Imagen, TIF_MOTOROLA )
 *------------------------------------------------------------------*/
#define Tif_PonFormato(t,f)  (((t)->Formato)=(f))

/*--------------------------------------------------------------------
 * MACRO:    Tif_Directorio()
 * OBJETIVO: Decir la direccin de memoria donde est almacenado el IFD
 *           (Directorio de imagen)
 * ENTRADAS: Un tiff
 * SALIDAS:  La direccin de memoria
 * EJEMPLO:  Tif_Directorio ( Imagen )
 *------------------------------------------------------------------*/
#define Tif_Directorio(t)  ((t)->Directorio)

/*--------------------------------------------------------------------
 * MACRO:    Tif_PonDirectorio()
 * OBJETIVO: Anotar la direccin de memoria donde est almacenado el IFD
 *           (Directorio de imagen)
 * ENTRADAS: Un tiff y la direccin de memoria
 * SALIDAS:  La direccin de memoria
 * EJEMPLO:  Tif_PonDirectorio ( Imagen, Memoria )
 *------------------------------------------------------------------*/
#define Tif_PonDirectorio(t,d)  (((t)->Directorio)=(d))

/*--------------------------------------------------------------------
 * MACRO:    Tif_TotalTag()
 * OBJETIVO: Decir el nmero total de tags presentes en el directorio
 *           de imagen que se encuentre en memoria
 * ENTRADAS: Un tiff
 * SALIDAS:  El total de tags
 * EJEMPLO:  Tif_TotalTag ( Imagen )
 *------------------------------------------------------------------*/
#define Tif_TotalTag(t)  ((t)->TotalTag)

/*--------------------------------------------------------------------
 * MACRO:    Tif_PonTotalTag()
 * OBJETIVO: Anotar el nmero total de tags presentes en el directorio
 *           de imagen que se encuentre en memoria
 * ENTRADAS: Un tiff y el total de tags
 * SALIDAS:  El total de tags
 * EJEMPLO:  Tif_PonTotalTag ( Imagen, 12 )
 *------------------------------------------------------------------*/
#define Tif_PonTotalTag(t,n)  (((t)->TotalTag)=(n))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Tif_TotalBanda()
 * OBJETIVO: Decir el nmero total de bandas de la
 *           imagen que se encuentre en memoria
 * ENTRADAS: Un tiff
 * SALIDAS:  El total de bandas
 * EJEMPLO:  Tif_TotalBanda ( Imagen )
 *------------------------------------------------------------------*/
#define Tif_TotalBanda(t)  ((t)->TotalBanda)

/*--------------------------------------------------------------------
 * MACRO:    Tif_PonTotalBanda()
 * OBJETIVO: Anotar el nmero total de bandas de la
 *           imagen que se encuentre en memoria
 * ENTRADAS: Un tiff y el total de bandas
 * SALIDAS:  El total de tags
 * EJEMPLO:  Tif_PonTotalBanda ( Imagen, 12 )
 *------------------------------------------------------------------*/
#define Tif_PonTotalBanda(t,b)  (((t)->TotalBanda)=(b))

/*--------------------------------------------------------------------
 * MACRO:    Tif_ComienzoDir()
 * OBJETIVO: Decir la posicin en el fichero tiff del comienzo
 *           del directorio de la imagen que se est grabando
 * ENTRADAS: Un tiff
 * SALIDAS:  La posicin
 * EJEMPLO:  Tif_ComienzoDir ( Imagen )
 *------------------------------------------------------------------*/
#define Tif_ComienzoDir(t)  ((t)->ComienzoDir)

/*--------------------------------------------------------------------
 * MACRO:    Tif_PonComienzoDir()
 * OBJETIVO: Anotar la posicin en el fichero tiff del comienzo
 *           del directorio de la imagen que se est grabando
 * ENTRADAS: Un tiff y la posicin
 * SALIDAS:  La posicin
 * EJEMPLO:  Tif_PonComienzoDir ( Imagen, 1200 )
 *------------------------------------------------------------------*/
#define Tif_PonComienzoDir(t,c)  (((t)->ComienzoDir)=(c))

/*--------------------------------------------------------------------
 * MACRO:    Tif_MetodoCompr()
 * OBJETIVO: Decir el mtodo de compresin de la imagen que 
 *           se est grabando
 * ENTRADAS: Un tiff
 * SALIDAS:  El mtodo de compresin
 * EJEMPLO:  Tif_MetodoCompr ( Imagen )
 *------------------------------------------------------------------*/
#define Tif_MetodoCompr(t)  ((t)->MetodoCompr)

/*--------------------------------------------------------------------
 * MACRO:    Tif_PonMetodoCompr()
 * OBJETIVO: Anotar el mtodo de compresin de la imagen que 
 *           se est grabando
 * ENTRADAS: Un tiff y el mtodo de compresin
 * SALIDAS:  El mtodo de compresin
 * EJEMPLO:  Tif_PonMetodoCompr ( Imagen, TIF_SIN_COMPRESION )
 *------------------------------------------------------------------*/
#define Tif_PonMetodoCompr(t,m)  (((t)->MetodoCompr)=(m))

#endif /* _TIFF_ */                  
