/*--------------------------------------------------------------------
 * FICHERO:  ZonOxFis.c
 * OBJETIVO: Definir las funciones Zon_OxelFisico(), Zon_AnchoEnOxel()
 *           y Zon_PrimerUtil()
 * AUTOR:    Pedro Reina
 * FECHA:    V.14.4.1995
 *------------------------------------------------------------------*/

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

#include "Zona.h"

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

/*--------------------------------------------------------------------
 * FUNCION:  Zon_OxelFisico()
 * OBJETIVO: Dibujar un oxel de la pantalla
 * ENTRADAS: Los valores "x" e "y" del oxel, la mscara de dibujo
 *           y el color
 * SALIDAS:  SI, ya que debe poder ejecutarse
 * NOTAS:    1. Los valores "x" e "y" se cuentan a partir de 0 desde la
 *              izquierda y desde arriba respectivamente
 *           2. Para ejecutar esta funcin el Oxel debe existir
 *           3. En el QL se asume que la pantalla comienza en la
 *              direccin 131072
 * EJEMPLO:  Zon_OxelFisico ( 0, 5, 0x84, ROJO )
 *------------------------------------------------------------------*/

#ifdef OLIMPO_PC
#pragma warn -aus
logico Zon_OxelFisico (X, Y, Mascara, Color)
contador X, Y;
octeto   Mascara, Color;
  {
  char far * Direccion;
  int        Inutil;

  Direccion = MK_FP ( 0xA000, (int) 80*Y + X );

  Pan_MandaOrden (0x3CE,8,Mascara);
  Pan_MandaOrden (0x3C4,2,0x0F);
  Inutil = *Direccion;
  *Direccion = 0;
  Pan_MandaOrden (0x3C4,2,Color);
  *Direccion = 0xFF;

  Pan_MandaOrden (0x3C4,2,0x0F);
  Pan_MandaOrden (0x3CE,3,0);
  Pan_MandaOrden (0x3CE,8,0xFF);

  return ( SI );
  }
#pragma warn +aus
#endif

#ifdef OLIMPO_QL
logico Zon_OxelFisico (X, Y, Mascara, Color)
contador X, Y;
octeto   Mascara, Color;
  {
  memoria Direccion;

  Direccion = (memoria) (Pan_Comienzo() + 128 * Y + 2 * X);

  switch ( Color )
    {
    case VERDE:
                 *Direccion     |= Mascara;
                 *(Direccion+1) &= ~Mascara;
                 break;
    case ROJO:
                 *Direccion     &= ~Mascara;
                 *(Direccion+1) |= Mascara;
                 break;
    case BLANCO:
                 *Direccion     |= Mascara;
                 *(Direccion+1) |= Mascara;
                 break;
    case NEGRO:
                 *Direccion     &= ~Mascara;
                 *(Direccion+1) &= ~Mascara;
                 break;
    }

  return ( SI );
  }
#endif

/*--------------------------------------------------------------------
 * FUNCION:  Zon_AnchoEnOxel()
 * OBJETIVO: Decir la anchura en oxels de una zona
 * ENTRADAS: La zona
 * SALIDAS:  Un contador que indica la anchura en oxels
 * EJEMPLO:  Zon_AnchoEnOxel ( Imagen )
 * ALGORITMO:
 *      Hallar el primer pixel de la zona que inicia un oxel
 *      Hallar el ltimo pixel de la zona que concluye un oxel
 *      Restar los dos valores y dividir por 8
 *------------------------------------------------------------------*/

#ifdef OLIMPO_QL
contador Zon_AnchoEnOxel (Zona)
zona Zona;
  {
  contador PrimerPixel, UltimoPixel, Ancho;

  PrimerPixel = Zon_PrimerUtil (Zona);

  UltimoPixel = Zon_MargenIzquierdo(Zona) + Zon_AnchoFisico(Zona);
  while ( UltimoPixel % 8 != 7 )
    { UltimoPixel--; }

  Ancho = UltimoPixel - PrimerPixel + 1;

  return ( Ancho > 0 ? Ancho/8 : 0 );
  }
#endif

#ifdef OLIMPO_QL
/*--------------------------------------------------------------------
 * FUNCION:  Zon_PrimerUtil()
 * OBJETIVO: Decir cual es el primer pixel de una zona que inicia un oxel
 * ENTRADAS: La zona
 * SALIDAS:  Un contador que indica el primer pixel que inicia un oxel
 * EJEMPLO:  Zon_PrimerUtil ( Imagen )
 * ALGORITMO:
 *      Hallar el primer pixel de la zona
 *      Ir sumando de uno en uno hasta que salga mltiplo de 8
 *------------------------------------------------------------------*/
contador Zon_PrimerUtil (Zona)
zona Zona;
  {
  contador PrimerPixel;

  PrimerPixel = Zon_MargenIzquierdo(Zona);
  while ( PrimerPixel % 8 != 0 )
    { PrimerPixel++; }

  return ( PrimerPixel );
  }
#endif
