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

/*--------------------------------------------------------------------
 * Funciones pblicas
 *
 *   Trz_Crea()            TrzCrea.c
 *   Trz_Destruye()        TrzCrea.c
 *   Trz_Restituye()       TrzResti.c
 *------------------------------------------------------------------*/

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

/*--------------------------------------------------------------------
 * Funciones privadas
 *
 *   Trz_Modo()            Trozo.h
 *   Trz_PonModo()         Trozo.h
 *   Trz_Ancho()           Trozo.h
 *   Trz_PonAncho()        Trozo.h
 *   Trz_Alto()            Trozo.h
 *   Trz_PonAlto()         Trozo.h
 *   Trz_Dato()            Trozo.h
 *   Trz_PonDato()         Trozo.h
 *   Trz_Cabe()            Trozo.h
 *
 * Funciones privadas QL
 *
 *   Trz_BitsDerecha       Trozo.h
 *   Trz_PonBitsDerecha    Trozo.h
 *   Trz_BitsIzquerda      Trozo.h
 *   Trz_PonBitsIzquierda  Trozo.h
 *   Trz_Columna           Trozo.h
 *   Trz_PonColumna        Trozo.h
 *------------------------------------------------------------------*/

#ifndef _TROZO_
#define _TROZO_

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

#include "Pantalla.h"
#include "Memoria.h"

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

   /* Ninguna */

/*--------------------------------------------------------------------
 * Definicin del tipo "trozo"
 *------------------------------------------------------------------*/
typedef struct {
               octeto  Modo;
               octeto  Ancho;
               octeto  Alto;
               memoria Dato;
#ifdef OLIMPO_QL
               octeto  Columna;
               octeto  BitsIzquierda;
               octeto  BitsDerecha;
#endif
               } Trz_st, *trozo;

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

trozo  Trz_Crea();
void   Trz_Destruye();
logico Trz_Restituye();

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

/*--------------------------------------------------------------------
 * MACRO:    Trz_Modo()
 * OBJETIVO: Decir el modo de pantalla en que se cre el trozo
 * ENTRADAS: El trozo
 * SALIDAS:  El modo
 * EJEMPLO:  Trz_Modo ( Panel )
 *------------------------------------------------------------------*/
#define Trz_Modo(t)  ((t)->Modo)

/*--------------------------------------------------------------------
 * MACRO:    Trz_PonModo()
 * OBJETIVO: Poner el modo de pantalla en que se crea el trozo
 * ENTRADAS: El trozo y el modo
 * SALIDAS:  El modo
 * EJEMPLO:  Trz_PonModo ( Panel, PAN_TEXTO )
 *------------------------------------------------------------------*/
#define Trz_PonModo(t,m)  ((t)->Modo=(m))

/*--------------------------------------------------------------------
 * MACRO:    Trz_Ancho()
 * OBJETIVO: Decir el ancho de un trozo
 * ENTRADAS: El trozo
 * SALIDAS:  El ancho
 * EJEMPLO:  Trz_Ancho ( Panel )
 *------------------------------------------------------------------*/
#define Trz_Ancho(t)  ((t)->Ancho)

/*--------------------------------------------------------------------
 * MACRO:    Trz_PonAncho()
 * OBJETIVO: Poner el ancho de un trozo
 * ENTRADAS: El trozo y el ancho
 * SALIDAS:  El ancho
 * EJEMPLO:  Trz_PonAncho ( Panel, 10 )
 *------------------------------------------------------------------*/
#define Trz_PonAncho(t,a)  ((t)->Ancho=(a))

/*--------------------------------------------------------------------
 * MACRO:    Trz_Alto()
 * OBJETIVO: Decir el alto de un trozo
 * ENTRADAS: El trozo
 * SALIDAS:  El alto
 * EJEMPLO:  Trz_Alto ( Panel )
 *------------------------------------------------------------------*/
#define Trz_Alto(t)  ((t)->Alto)

/*--------------------------------------------------------------------
 * MACRO:    Trz_PonAlto()
 * OBJETIVO: Poner el alto de un trozo
 * ENTRADAS: El trozo y el alto
 * SALIDAS:  El alto
 * EJEMPLO:  Trz_PonAlto ( Panel, 10 )
 *------------------------------------------------------------------*/
#define Trz_PonAlto(t,a)  ((t)->Alto=(a))

/*--------------------------------------------------------------------
 * MACRO:    Trz_Dato()
 * OBJETIVO: Decir la direccin de memoria donde estn los datos
 * ENTRADAS: El trozo
 * SALIDAS:  La direccin
 * EJEMPLO:  Trz_Dato ( Panel )
 *------------------------------------------------------------------*/
#define Trz_Dato(t)  ((t)->Dato)

/*--------------------------------------------------------------------
 * MACRO:    Trz_PonDato()
 * OBJETIVO: Poner la direccin de memoria donde estn los datos
 * ENTRADAS: El trozo y la direccin
 * SALIDAS:  La direccin
 * EJEMPLO:  Trz_PonDato ( Panel, Memoria )
 *------------------------------------------------------------------*/
#define Trz_PonDato(t,m)  ((t)->Dato=(m))

#ifdef OLIMPO_QL
/*--------------------------------------------------------------------
 * MACRO:    Trz_Columna()
 * OBJETIVO: Decir cuntas columnas de 8 pxeles ocupa un trozo
 * ENTRADAS: El trozo
 * SALIDAS:  La cantidad de columnas
 * EJEMPLO:  Trz_Columna ( Panel )
 *------------------------------------------------------------------*/
#define Trz_Columna(t)  ((t)->Columna)
#endif

#ifdef OLIMPO_QL
/*--------------------------------------------------------------------
 * MACRO:    Trz_PonColumna()
 * OBJETIVO: Poner el nmero de columnas de 8 pxeles que ocupa un trozo
 * ENTRADAS: El trozo y la cantidad de columnas
 * SALIDAS:  La cantidad de columnas
 * EJEMPLO:  Trz_PonColumna ( Panel, 7 )
 *------------------------------------------------------------------*/
#define Trz_PonColumna(t,b)  ((t)->Columna=(octeto)(b))
#endif

#ifdef OLIMPO_QL
/*--------------------------------------------------------------------
 * MACRO:    Trz_BitsIzquierda()
 * OBJETIVO: Decir cuntos bits, por la parte izquierda, de la primera
 *           columna de datos no forman parte de los datos interesantes
 * ENTRADAS: El trozo
 * SALIDAS:  La cantidad de bits
 * EJEMPLO:  Trz_BitsIzquierda ( Panel )
 *------------------------------------------------------------------*/
#define Trz_BitsIzquierda(t)  ((t)->BitsIzquierda)
#endif

#ifdef OLIMPO_QL
/*--------------------------------------------------------------------
 * MACRO:    Trz_PonBitsIzquierda()
 * OBJETIVO: Poner el nmero de bits, por la parte izquierda, de la primera
 *           columna de datos que no forman parte de los datos interesantes
 * ENTRADAS: El trozo y la cantidad de bits
 * SALIDAS:  La cantidad de bits
 * EJEMPLO:  Trz_PonBitsIzquierda ( Panel, 3 )
 *------------------------------------------------------------------*/
#define Trz_PonBitsIzquierda(t,b)  ((t)->BitsIzquierda=(octeto)(b))
#endif

#ifdef OLIMPO_QL
/*--------------------------------------------------------------------
 * MACRO:    Trz_BitsDerecha()
 * OBJETIVO: Decir cuntos bits, por la parte derecha, de la ltima
 *           columna de datos no forman parte de los datos interesantes
 * ENTRADAS: El trozo
 * SALIDAS:  La cantidad de bits
 * EJEMPLO:  Trz_BitsDerecha ( Panel )
 *------------------------------------------------------------------*/
#define Trz_BitsDerecha(t)  ((t)->BitsDerecha)
#endif

#ifdef OLIMPO_QL
/*--------------------------------------------------------------------
 * MACRO:    Trz_PonBitsDerecha()
 * OBJETIVO: Poner el nmero de bits, por la parte derecha, de la ltima
 *           columna de datos que no forman parte de los datos interesantes
 * ENTRADAS: El trozo y la cantidad de bits
 * SALIDAS:  La cantidad de bits
 * EJEMPLO:  Trz_PonBitsDerecha ( Panel, 1 )
 *------------------------------------------------------------------*/
#define Trz_PonBitsDerecha(t,b)  ((t)->BitsDerecha=(octeto)(b))
#endif

/*--------------------------------------------------------------------
 * MACRO:    Trz_Cabe()
 * OBJETIVO: Decir si un trozo va a caber a partir de una posicin
 *           de la esquina superior izquierda
 * ENTRADAS: El trozo, la fila superior y la columna izquierda en donde
 *           se desea ver si cabr el trozo
 * SALIDAS:  Lgica, que indica si el trozo cabe
 * EJEMPLO:  Trz_Cabe (Panel,3,4)
 *------------------------------------------------------------------*/
#define Trz_Cabe(t,f,c)  (((c)+Trz_Ancho(Trozo)<=Pan_Ancho()) && \
                          ((f)+Trz_Alto(Trozo)<=Pan_Alto()))


#endif /* _TROZO_ */
