/*--------------------------------------------------------------------
 * FICHERO:       Region.h
 * OBJETIVO:      Definir el objeto "Regin"
 * IDENTIFICADOR: Reg
 * AUTOR:         Pedro Reina
 * FECHA:         L.17.7.1995
 * OBJETOS UTILIZADOS: Memoria, Pantalla, Trozo, Cuadro
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Funciones pblicas
 *
 *   Zon_FilSup()            Region.h
 *   Zon_FilInf()            Region.h
 *   Zon_ColIzq()            Region.h
 *   Zon_ColDer()            Region.h
 *   Zon_Ancho()             Region.h
 *   Zon_Alto()              Region.h
 *   Reg_Crea()              RegCrea.c
 *   Reg_Destruye()          RegCrea.c
 *   Reg_Papel()             Region.h
 *   Reg_Tinta()             Region.h
 *   Reg_Color()             Region.h
 *   Reg_Borde()             Region.h
 *   Reg_Cursor()            Region.h
 *   Reg_Limpia()            Region.h
 *   Reg_LimpiaInterior()    Region.h
 *   Reg_PonCar()            Region.h
 *   Reg_PonReal()           Region.h
 *   Reg_PonEntero()         Region.h
 *   Reg_PonTexto()          Region.h
 *   Reg_TextoCentrado()     RegTexCe.c
 *   Reg_Lee()               RegLee.c
 *   Reg_Escribe()           RegEscri.c
 *------------------------------------------------------------------*/

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

/*--------------------------------------------------------------------
 * Funciones privadas
 *
 *   Zon_PonFilSup()         Region.h
 *   Zon_PonFilInf()         Region.h
 *   Zon_PonColIzq()         Region.h
 *   Zon_PonColDer()         Region.h
 *   Zon_DiPapel()           Region.h
 *   Zon_DiTinta()           Region.h
 *-----------------------------------------------------------------*/

#ifndef _REGION_
#define _REGION_

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

#include "Memoria.h"
#include "Pantalla.h"
#include "Trozo.h"
#include "Cuadro.h"

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

    /* Ninguna */

/*--------------------------------------------------------------------
 * Definicin del tipo "region"
 *------------------------------------------------------------------*/
typedef struct {
               octeto FilSup;
               octeto FilInf;
               octeto ColIzq;
               octeto ColDer;
               octeto Papel;
               octeto Tinta;
               trozo  Trozo;
               } Reg_st, *region;

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

   /* Ninguna */

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

region Reg_Crea();
void   Reg_Destruye();
logico Reg_Lee();
logico Reg_Escribe();

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

/*--------------------------------------------------------------Olimpo
 * MACRO:    Reg_FilSup()
 * OBJETIVO: Decir la fila superior de una regin
 * ENTRADAS: La regin
 * SALIDAS:  Un octeto que indica la fila superior
 * EJEMPLO:  Reg_FilSup ( CuadroInfo )
 *------------------------------------------------------------------*/
#define Reg_FilSup(r)  ((r)->FilSup)

/*--------------------------------------------------------------------
 * MACRO:    Reg_PonFilSup()
 * OBJETIVO: Poner la fila superior de una regin
 * ENTRADAS: La regin y un octeto que indica la fila superior
 * SALIDAS:  Un octeto que indica la fila superior
 * EJEMPLO:  Reg_PonFilSup ( CuadroInfo, 4 )
 *------------------------------------------------------------------*/
#define Reg_PonFilSup(r,v)  ((r)->FilSup=(v))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Reg_FilInf()
 * OBJETIVO: Decir la fila inferior de una regin
 * ENTRADAS: La regin
 * SALIDAS:  Un octeto que indica la fila inferior
 * EJEMPLO:  Reg_FilInf ( CuadroInfo )
 *------------------------------------------------------------------*/
#define Reg_FilInf(r)  ((r)->FilInf)

/*--------------------------------------------------------------------
 * MACRO:    Reg_PonFilInf()
 * OBJETIVO: Poner la fila inferior de una regin
 * ENTRADAS: La regin y un octeto que indica la fila inferior
 * SALIDAS:  Un octeto que indica la fila Inferior
 * EJEMPLO:  Reg_PonFilInf ( CuadroInfo, 9 )
 *------------------------------------------------------------------*/
#define Reg_PonFilInf(r,v)  ((r)->FilInf=(v))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Reg_ColIzq()
 * OBJETIVO: Decir la columna izquierda de una regin
 * ENTRADAS: La regin
 * SALIDAS:  Un octeto que indica la columna izquierda
 * EJEMPLO:  Reg_ColIzq ( CuadroInfo )
 *------------------------------------------------------------------*/
#define Reg_ColIzq(r)  ((r)->ColIzq)

/*--------------------------------------------------------------------
 * MACRO:    Reg_PonColIzq()
 * OBJETIVO: Poner la columna izquierda de una regin
 * ENTRADAS: La regin y un octeto que indica la columna izquierda
 * SALIDAS:  Un octeto que indica la columna izquierda
 * EJEMPLO:  Reg_PonColIzq ( CuadroInfo, 4 )
 *------------------------------------------------------------------*/
#define Reg_PonColIzq(r,v)  ((r)->ColIzq=(v))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Reg_ColDer()
 * OBJETIVO: Decir la columna derecha de una regin
 * ENTRADAS: La regin
 * SALIDAS:  Un octeto que indica la columna derecha
 * EJEMPLO:  Reg_ColDer ( CuadroInfo )
 *------------------------------------------------------------------*/
#define Reg_ColDer(r)  ((r)->ColDer)

/*--------------------------------------------------------------------
 * MACRO:    Reg_PonColDer()
 * OBJETIVO: Poner la columna derecha de una regin
 * ENTRADAS: La regin y un octeto que indica la columna derecha
 * SALIDAS:  Un octeto que indica la columna derecha
 * EJEMPLO:  Reg_PonColDer ( CuadroInfo, 9 )
 *------------------------------------------------------------------*/
#define Reg_PonColDer(r,v)  ((r)->ColDer=(v))

/*--------------------------------------------------------------------
 * MACRO:    Reg_DiPapel()
 * OBJETIVO: Decir el color de papel de una regin
 * ENTRADAS: La regin
 * SALIDAS:  Un octeto que indica el color de papel
 * EJEMPLO:  Reg_DiPapel ( CuadroInfo )
 *------------------------------------------------------------------*/
#define Reg_DiPapel(r)  ((r)->Papel)

/*--------------------------------------------------------------Olimpo
 * MACRO:    Reg_Papel()
 * OBJETIVO: Poner el color de papel de una regin
 * ENTRADAS: La regin y un octeto que indica el color de papel
 * SALIDAS:  Un octeto que indica el color de papel
 * EJEMPLO:  Reg_Papel ( CuadroInfo, ROJO )
 *------------------------------------------------------------------*/
#define Reg_Papel(r,p)  ((r)->Papel=(p))

/*--------------------------------------------------------------------
 * MACRO:    Reg_DiTinta()
 * OBJETIVO: Decir el color de tinta de una regin
 * ENTRADAS: La regin
 * SALIDAS:  Un octeto que indica el color de tinta
 * EJEMPLO:  Reg_DiTinta ( CuadroInfo )
 *------------------------------------------------------------------*/
#define Reg_DiTinta(r)  ((r)->Tinta)

/*--------------------------------------------------------------Olimpo
 * MACRO:    Reg_Tinta()
 * OBJETIVO: Poner el color de tinta de una regin
 * ENTRADAS: La regin y un octeto que indica el color de tinta
 * SALIDAS:  Un octeto que indica el color de tinta
 * EJEMPLO:  Reg_Tinta ( CuadroInfo, BLANCO )
 *------------------------------------------------------------------*/
#define Reg_Tinta(r,p)  ((r)->Tinta=(p))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Reg_Color()
 * OBJETIVO: Poner el color del papel y la tinta de una regin
 * ENTRADAS: La regin y dos octetos que indiquen los colores
 * SALIDAS:  Un octeto que indica el color de tinta
 * EJEMPLO:  Reg_Color ( CuadroInfo, NEGRO, BLANCO )
 *------------------------------------------------------------------*/
#define Reg_Color(r,p,t)  (Reg_Papel(r,p),Reg_Tinta(r,t))

/*--------------------------------------------------------------------
 * MACRO:    Reg_Trozo()
 * OBJETIVO: Decir el trozo asociado a una regin
 * ENTRADAS: La regin
 * SALIDAS:  El trozo
 * EJEMPLO:  Reg_Trozo ( CuadroInfo )
 *------------------------------------------------------------------*/
#define Reg_Trozo(r)  ((r)->Trozo)

/*--------------------------------------------------------------------
 * MACRO:    Reg_PonTrozo()
 * OBJETIVO: Poner el trozo asociado a una regin
 * ENTRADAS: La regin y el trozo
 * SALIDAS:  El trozo
 * EJEMPLO:  Reg_PonTrozo ( CuadroInfo, TrozoInfo )
 *------------------------------------------------------------------*/
#define Reg_PonTrozo(r,t)  ((r)->Trozo=(t))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Reg_Ancho()
 * OBJETIVO: Decir la anchura de una regin
 * ENTRADAS: La regin
 * SALIDAS:  La anchura
 * EJEMPLO:  Reg_Ancho ( CuadroInfo )
 *------------------------------------------------------------------*/
#define Reg_Ancho(r)  (Reg_ColDer(r)-Reg_ColIzq(r)+1)

/*--------------------------------------------------------------Olimpo
 * MACRO:    Reg_Alto()
 * OBJETIVO: Decir la altura de una regin
 * ENTRADAS: La regin
 * SALIDAS:  La altura
 * EJEMPLO:  Reg_Alto ( CuadroInfo )
 *------------------------------------------------------------------*/
#define Reg_Alto(r)  (Reg_FilInf(r)-Reg_FilSup(r)+1)

/*--------------------------------------------------------------Olimpo
 * MACRO:    Reg_Limpia()
 * OBJETIVO: Limpiar una regin con un color
 * ENTRADAS: La regin y un octeto que indica el color
 * SALIDAS:  El valor lgico SI
 * EJEMPLO:  Reg_Limpia ( CuadroInfo, NEGRO )
 *------------------------------------------------------------------*/
#define Reg_Limpia(r,c)  (Pan_Borra(c,Reg_FilSup(r),Reg_ColIzq(r), \
                                      Reg_FilInf(r),Reg_ColDer(r)))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Reg_Cursor()
 * OBJETIVO: Colocar el cursor de pantalla en una posicin
 *           relativa de una regin
 * ENTRADAS: La regin, la fila y la columna
 * SALIDAS:  El valor lgico SI
 * EJEMPLO:  Reg_Cursor ( CuadroInfo, 3, 4 )
 * NOTAS:    1. Las filas de una regin se numeran desde 0,
 *              la superior
 *           2. Las columnas de una regin se numeran desde 0,
 *              la izquierda
 *------------------------------------------------------------------*/
#define Reg_Cursor(r,f,c)  Pan_Cursor(Reg_FilSup(r)+f,Reg_ColIzq(r)+c)

/*--------------------------------------------------------------Olimpo
 * MACRO:    Reg_Borde()
 * OBJETIVO: Poner borde en una regin
 * ENTRADAS: La regin, el tipo de lnea para el borde, el 
 *           color de fondo del borde y el de la lnea
 * SALIDAS:  Ninguna
 * EJEMPLO:  Reg_Borde ( CuadroInfo, CDR_DOBLE, BLANCO, NEGRO )
 *------------------------------------------------------------------*/
#define Reg_Borde(r,t,p,l)  (Cdr_Caja(t,Reg_FilSup(r),Reg_ColIzq(r), \
                                      Reg_FilInf(r),Reg_ColDer(r),p,l))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Reg_LimpiaInterior()
 * OBJETIVO: Limpiar el interior de una regin con un color 
 *           (toda la regin salvo las primera y ltima fila
 *           y columna)
 * ENTRADAS: La regin y un octeto que indica el color
 * SALIDAS:  El valor lgico SI
 * EJEMPLO:  Reg_LimpiaInterior ( CuadroInfo, NEGRO )
 *------------------------------------------------------------------*/
#define Reg_LimpiaInterior(r,c)  (Pan_Borra(c,Reg_FilSup(r)+1,      \
                                  Reg_ColIzq(r)+1, Reg_FilInf(r)-1, \
                                  Reg_ColDer(r)-1))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Reg_PonCar()
 * OBJETIVO: Escribir un carcter en cierta posicin de 
 *           una regin
 * ENTRADAS: La regin, la fila, la columna y el carcter
 * SALIDAS:  El valor lgico SI
 * EJEMPLO:  Reg_PonCar (CuadroInfo,3,5,'A')
 *------------------------------------------------------------------*/
#define Reg_PonCar(r,f,c,car)  (Reg_Cursor(r,f,c),                        \
                                Pan_Color(Reg_DiPapel(r),Reg_DiTinta(r)), \
                                Pan_Caracter(car))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Reg_PonTexto()
 * OBJETIVO: Escribir un texto en cierta posicin de una regin
 * ENTRADAS: La regin, la fila, la columna y el texto
 * SALIDAS:  El valor lgico SI
 * EJEMPLO:  Reg_PonTexto (CuadroInfo,3,5,"Hola")
 *------------------------------------------------------------------*/
#define Reg_PonTexto(r,f,c,t)  (Reg_Cursor(r,f,c),                        \
                                Pan_Color(Reg_DiPapel(r),Reg_DiTinta(r)), \
                                Pan_Texto(t))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Reg_PonEntero()
 * OBJETIVO: Escribir un nmero entero en cierta posicin de 
 *           una regin
 * ENTRADAS: La regin, la fila, la columna, el entero y el 
 *           ancho disponible
 * SALIDAS:  El valor lgico SI
 * EJEMPLO:  Reg_PonEntero (CuadroInfo,3,5,12345,6)
 * NOTA:     El nmero se evala dos veces
 *------------------------------------------------------------------*/
#define Reg_PonEntero(r,f,c,e,a)  (Reg_Cursor(r,f,c),                     \
                                Pan_Color(Reg_DiPapel(r),Reg_DiTinta(r)), \
                                Pan_Entero(e,a))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Reg_PonReal()
 * OBJETIVO: Escribir un nmero real en cierta posicin de 
 *           una regin
 * ENTRADAS: La regin, la fila, la columna, un nmero real, el 
 *           ancho asignado y el nmero de decimales
 * SALIDAS:  El valor lgico SI
 * EJEMPLO:  Reg_PonReal (CuadroInfo, 0, 0, 1.23455, 8, 2)
 *------------------------------------------------------------------*/
#define Reg_PonReal(r,f,c,n,a,d)  ( Reg_Cursor(r,f,c),                    \
                                Pan_Color(Reg_DiPapel(r),Reg_DiTinta(r)), \
                                Pan_Real(n,a,d) )


#endif /* _REGION_ */
