/*--------------------------------------------------------------------
 * FICHERO:  DbnColoc.c
 * OBJETIVO: Definir la funcin Dbn_Coloca()
 * AUTOR:    Pedro Reina
 * FECHA:    S.8.7.1995
 *------------------------------------------------------------------*/

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

#include "Diblane.h"

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

/*--------------------------------------------------------------Olimpo
 * FUNCION:  Dbn_Coloca()
 * OBJETIVO: Mostrar un objeto "diblane" en una posicin
 *           de una zona
 * ENTRADAS: Un diblane, una zona, el nmero de oxel y el nmero
 *           de fila de la posicin y los colores del fondo y
 *           la figura
 * SALIDAS:  Ninguna
 * EJEMPLO:  Dbn_Coloca (Dibujo, Zona, 5, 7, BLANCO, ROJO)
 * ALGORITMO:
 *      Calcular el ltimo oxel y la ltima columna en la que
 *        puede escribirse
 *      Calcular si el ltimo oxel de cada lnea necesita tratamiento
 *        especial
 *      Si lo necesita
 *          Para cada lnea
 *              Dibujar todos los oxels salvo el ltimo
 *              Dibujar el ltimo oxel con la mscara correspondiente
 *      Si no lo necesita 
 *          Para cada lnea
 *              Dibujar todos los oxels
 *------------------------------------------------------------------*/
void Dbn_Coloca (Dibujo, Zona, X, Y, Papel, Tinta)
diblane  Dibujo;
zona     Zona;
contador X, Y;
octeto   Papel, Tinta;
  {
  contador TopeHz, TopeVt, i, j, k;
  memoria  Pos;
  octeto   Mascara;
  logico   CuidadoUltimo = NO;

  TopeHz = Min (X+Dbn_AnchoEnOxel(Dibujo), Zon_AnchoEnOxel(Zona));
  TopeVt = Min (Y+Dbn_Alto(Dibujo), Zon_AltoFisico(Zona));
  Pos = Dbn_Dato (Dibujo);

  Mascara = 0xFF << (8*Dbn_AnchoEnOxel(Dibujo)-Dbn_Ancho(Dibujo));
  if ( Mascara != 0xFF && TopeHz <= X+Dbn_AnchoEnOxel(Dibujo) )
    { CuidadoUltimo = SI; }

  if ( CuidadoUltimo )
    {
    for ( j=Y ; j<TopeVt ; j++ )
      {
      for ( i=X , k=0 ; i<TopeHz-1 ; i++ , k++ )
        {
        Zon_OxelSeguro (Zona, i, j, ~Pos[k], Papel);
        Zon_OxelSeguro (Zona, i, j,  Pos[k], Tinta);
        }
      Zon_OxelSeguro (Zona, i, j, ~Pos[k] & Mascara, Papel);
      Zon_OxelSeguro (Zona, i, j,  Pos[k] & Mascara, Tinta);
      Pos += Dbn_AnchoEnOxel (Dibujo);
      }
    }
    
  else
    {
    for ( j=Y ; j<TopeVt ; j++ )
      {
      for ( i=X , k=0 ; i<TopeHz ; i++ , k++ )
        {
        Zon_OxelSeguro (Zona, i, j, ~Pos[k], Papel);
        Zon_OxelSeguro (Zona, i, j,  Pos[k], Tinta);
        }
      Pos += Dbn_AnchoEnOxel (Dibujo);
      }
    }
  }   
