/*--------------------------------------------------------------------
 * FICHERO:       Diblane.h
 * OBJETIVO:      Definir el objeto "Diblane" (DIbujo en BLAnco y NEgro)
 * IDENTIFICADOR: Dbn
 * AUTOR:         Pedro Reina
 * FECHA:         V.4.8.1995
 * OBJETOS UTILIZADOS: Memoria, Zona, Tecla, Usuario
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Funciones pblicas
 *
 *   Dbn_Crea()              DbnCrea.c
 *   Dbn_Ancho()             Diblane.h
 *   Dbn_Alto()              Diblane.h
 *   Dbn_AnchoEnOxel()       Diblane.h
 *   Dbn_Tamano()            Diblane.h
 *   Dbn_Dato()              Diblane.h
 *   Dbn_Destruye()          DbnCrea.c
 *   Dbn_Muestra()           DbnMuest.c
 *   Dbn_Coloca()            DbnColoca.c
 *   Dbn_ReflejaHorizontal() DbnRefHz.c
 *   Dbn_ReflejaVertical()   DbnRefVt.c
 *   Dbn_Punto()             Diblane.h
 *   Dbn_PonPunto()          DbnPonPu.c
 *   Dbn_Invierte()          DbnInvie.c
 *   Dbn_Edita()             DbnEdita.c
 *-----------------------------------------------------------------*/

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

/*--------------------------------------------------------------------
 * Funciones privadas
 *
 *   Dbn_PonAncho()          Diblane.h
 *   Dbn_PonAlto()           Diblane.h
 *   Dbn_PonAnchoEnOxel()    Diblane.h
 *   Dbn_PonTamano()         Diblane.h
 *   Bdn_PonDato()           Diblane.h
 *------------------------------------------------------------------*/

#ifndef _DIBLANE_
#define _DIBLANE_

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

#include "Memoria.h"
#include "Zona.h"
#include "Tecla.h"
#include "Usuario.h"

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

    /* Ninguno */

/*--------------------------------------------------------------------
 * Definicin del tipo "diblane"
 *------------------------------------------------------------------*/
typedef struct {
               entero  Ancho;
               entero  Alto;
               entero  AnchoEnOxel;
               entero  Tamano;
               memoria Dato;
               } Dbn_st, *diblane;

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

   /* Ninguna */

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

diblane Dbn_Crea();
logico  Dbn_Edita();
void    Dbn_Destruye();
void    Dbn_Muestra();
void    Dbn_Coloca();
void    Dbn_ReflejaHorizontal();
void    Dbn_ReflejaVertical();
octeto  Dbn_PonPunto();
        
/*--------------------------------------------------------------------
 * Estructura de los datos en un diblane
 *
 * La funcin Dbn_Dato() da la direccin en memoria donde est almacenado
 * el conjunto de datos que definen un dibujo en blanco y negro.
 *
 * Los puntos del dibujo estn representados por bits. Un bit a 0 quiere
 * decir que el punto pertenece al fondo; se representa normalmente en pantalla
 * como negro y en el papel en blanco. Un bit a 1 quiere decir que el punto
 * pertenece a la figura; se representa normalmente en la pantalla como blanco
 * y en el papel como negro.
 *
 * Los bits estn agrupados de 8 en 8 en posiciones en memoria que se
 * consideran como octetos, es decir, valores sin signo. Cada grupo de
 * 8 puntos se denomina "oxel".
 *
 * Los bits se van escribiendo en memoria de arriba hacia abajo por filas
 * y dentro de cada fila de izquierda a derecha. Si los puntos de cada fila
 * no son mltiplo de 8, el ltimo oxel se rellena hasta completar el octeto
 * mediante bits que deben estar a 0.
 *------------------------------------------------------------------*/

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

/*--------------------------------------------------------------Olimpo
 * MACRO:    Dbn_Ancho()
 * OBJETIVO: Decir el ancho en pixels de un diblane
 * ENTRADAS: El diblane
 * SALIDAS:  El ancho en pixels
 * EJEMPLO:  Dbn_Ancho ( Dibujo )
 *------------------------------------------------------------------*/
#define Dbn_Ancho(d)  ((d)->Ancho)

/*--------------------------------------------------------------------
 * MACRO:    Dbn_PonAncho()
 * OBJETIVO: Poner el ancho en pixels de un diblane
 * ENTRADAS: El diblane y el ancho en pixels
 * SALIDAS:  El ancho en pixels
 * EJEMPLO:  Dbn_PonAncho ( Dibujo, 24 )
 *------------------------------------------------------------------*/
#define Dbn_PonAncho(d,a)  (((d)->Ancho)=(a))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Dbn_Alto()
 * OBJETIVO: Decir el alto en pixels de un diblane
 * ENTRADAS: El diblane
 * SALIDAS:  El alto en pixels
 * EJEMPLO:  Dbn_Alto ( Dibujo )
 *------------------------------------------------------------------*/
#define Dbn_Alto(d)  ((d)->Alto)

/*--------------------------------------------------------------------
 * MACRO:    Dbn_PonAlto()
 * OBJETIVO: Poner el alto en pixels de un diblane
 * ENTRADAS: El diblane y el Alto en pixels
 * SALIDAS:  El alto en pixels
 * EJEMPLO:  Dbn_PonAlto ( Dibujo, 12 )
 *------------------------------------------------------------------*/
#define Dbn_PonAlto(d,a)  (((d)->Alto)=(a))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Dbn_AnchoEnOxel()
 * OBJETIVO: Decir el ancho en oxels de un diblane
 * ENTRADAS: El diblane
 * SALIDAS:  El ancho en oxels
 * EJEMPLO:  Dbn_AnchoEnOxel ( Dibujo )
 *------------------------------------------------------------------*/
#define Dbn_AnchoEnOxel(d)  ((d)->AnchoEnOxel)

/*--------------------------------------------------------------------
 * MACRO:    Dbn_PonAnchoEnOxel()
 * OBJETIVO: Poner el ancho en oxels de un diblane
 * ENTRADAS: El diblane y el ancho en oxels
 * SALIDAS:  El ancho en oxels
 * EJEMPLO:  Dbn_PonAnchoEnOxel ( Dibujo, 4 )
 *------------------------------------------------------------------*/
#define Dbn_PonAnchoEnOxel(d,a)  (((d)->AnchoEnOxel)=(a))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Dbn_Tamano()
 * OBJETIVO: Decir el tamao en octetos de un diblane
 * ENTRADAS: El diblane
 * SALIDAS:  El tamao en octetos
 * EJEMPLO:  Dbn_Tamano ( Dibujo )
 *------------------------------------------------------------------*/
#define Dbn_Tamano(d)  ((d)->Tamano)

/*--------------------------------------------------------------------
 * MACRO:    Dbn_PonTamano()
 * OBJETIVO: Poner el tamao en octetos de un diblane
 * ENTRADAS: El diblane y el tamao en octetos
 * SALIDAS:  El tamao en octetos
 * EJEMPLO:  Dbn_PonTamano ( Dibujo, 1024 )
 *------------------------------------------------------------------*/
#define Dbn_PonTamano(d,t)  (((d)->Tamano)=(t))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Dbn_Dato()
 * OBJETIVO: Decir la direccin donde se encuentran los datos
 *           de un diblane
 * ENTRADAS: El diblane
 * SALIDAS:  La direccin en memoria de los datos
 * EJEMPLO:  Dbn_Dato ( Dibujo )
 *------------------------------------------------------------------*/
#define Dbn_Dato(d)  ((d)->Dato)

/*--------------------------------------------------------------------
 * MACRO:    Dbn_PonDato()
 * OBJETIVO: Poner la direccin donde se encuentran los datos de un diblane
 * ENTRADAS: El diblane y la direccin en memoria
 * SALIDAS:  La direccin en memoria de los datos
 * EJEMPLO:  Dbn_PonDato ( Dibujo, 1024 )
 *------------------------------------------------------------------*/
#define Dbn_PonDato(d,t)  (((d)->Dato)=(t))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Dbn_Punto()
 * OBJETIVO: Decir el valor de un punto de un diblane
 * ENTRADAS: El diblane, la fila y la columna del punto
 * SALIDAS:  El valor del punto, que es 0  1
 * NOTAS:    1. La fila 0 es la de arriba
 *           2. La columna 0 es la de la izquierda
 *           3. Se asume que el punto pertenece al diblane
 * EJEMPLO:  Dbn_Punto ( Dibujo, 4, 17 )
 *------------------------------------------------------------------*/
#define Dbn_Punto(d,f,c)  ( (Dbn_Dato(d)[(f)*Dbn_AnchoEnOxel(d)+(c)/8] & \
                            128 >> (c)%8) > 0 )

#endif /* _DIBLANE_ */
