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

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

#include "Diblane.h"

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

/*--------------------------------------------------------------Olimpo
 * FUNCION:  Dbn_Muestra()
 * OBJETIVO: Mostrar un objeto "diblane" en una zona
 * ENTRADAS: Un diblane y una zona
 * SALIDAS:  Ninguna
 * EJEMPLO:  Dbn_Muestra (Dibujo, Zona)
 *------------------------------------------------------------------*/
void Dbn_Muestra (Dibujo, Zona)
diblane Dibujo;
zona    Zona;
  {
  static tecla Orden[] = { TEC_IZQUIERDA, TEC_DERECHA, TEC_ARRIBA, TEC_ABAJO,
                           TEC_INICIO, TEC_FIN, TEC_AVPAG, TEC_REPAG,
                           TEC_ENTER, NIL };
  static contador AvanceHz=4, AvanceVt=20;  /* Nmeros mgicos */
  contador TopeHz, TopeVt, ComienzoHz=0, ComienzoVt=0;
  contador Nuevo, Diferencia, i, j;
  logico   CabeHz, CabeVt, Sigue=SI, Muestra=SI;
  tecla    Tecla;
  memoria  Pos;

  TopeHz = Min (Dbn_AnchoEnOxel(Dibujo), Zon_AnchoEnOxel(Zona));
  TopeVt = Min (Dbn_Alto(Dibujo), Zon_AltoFisico(Zona));

  CabeHz = Dbn_AnchoEnOxel(Dibujo) <= Zon_AnchoEnOxel(Zona);
  CabeVt = Dbn_Alto(Dibujo) <= Zon_AltoFisico(Zona);

  Usr_Indica (
    "CURSOR: mueve la imagen. INICIO, FIN, AVPAG, REPAG: mueve rpido",
    "ENTER: termina" );

  while ( Sigue )
    {

    if ( Muestra )
      {
      Zon_Borra (Zona,NEGRO);
      Pos = Dbn_Dato (Dibujo) + ComienzoVt * Dbn_AnchoEnOxel(Dibujo)
                              + ComienzoHz;
      for ( i=0 ; i<TopeVt ; i++ )
        {
        for ( j=0 ; j<TopeHz ; j++ )
          { Zon_OxelSeguro (Zona, j, i, Pos[j], BLANCO); }
        Pos += Dbn_AnchoEnOxel (Dibujo);
        }
      Muestra = NO;
      }

    switch ( Tecla = Tec_Validada (Orden) )
      {
      case TEC_ENTER:    Sigue = NO;  break;
      case TEC_FIN:
      case TEC_DERECHA:    if ( CabeHz ) { Son_MalaTecla(); }
                           else
                             {
                             if ( Tecla == TEC_DERECHA )
                               { Nuevo = ComienzoHz + AvanceHz; }
                             else
                               { Nuevo = ComienzoHz + 5 * AvanceHz; }
                             Diferencia = Nuevo + Zon_AnchoEnOxel(Zona) -
                                          Dbn_AnchoEnOxel(Dibujo);
                             if ( Diferencia > 0 ) { Nuevo -= Diferencia; }
                             if ( ComienzoHz == Nuevo ) { Son_MalaTecla(); }
                             else  { ComienzoHz = Nuevo; Muestra = SI; }
                             }
                           break;
      case TEC_INICIO:
      case TEC_IZQUIERDA:  if ( CabeHz ) { Son_MalaTecla(); }
                           else
                             {
                             if ( Tecla == TEC_IZQUIERDA )
                               { Nuevo = ComienzoHz - AvanceHz; }
                             else
                               { Nuevo = ComienzoHz - 5 * AvanceHz; }
                             if ( Nuevo < 0 ) { Nuevo = 0; }
                             if ( ComienzoHz == Nuevo ) { Son_MalaTecla(); }
                             else  { ComienzoHz = Nuevo; Muestra = SI; }
                             }
                           break;
      case TEC_AVPAG:
      case TEC_ABAJO:      if ( CabeVt ) { Son_MalaTecla(); }
                           else
                             {
                             if ( Tecla == TEC_ABAJO )
                               { Nuevo = ComienzoVt + AvanceVt; }
                             else
                               { Nuevo = ComienzoVt + 5 * AvanceVt; }
                             Diferencia = Nuevo + Zon_AltoFisico(Zona) -
                                          Dbn_Alto(Dibujo);
                             if ( Diferencia > 0 ) { Nuevo -= Diferencia; }
                             if ( ComienzoVt == Nuevo ) { Son_MalaTecla(); }
                             else  { ComienzoVt = Nuevo; Muestra = SI; }
                             }
                           break;
      case TEC_REPAG:
      case TEC_ARRIBA:     if ( CabeVt ) { Son_MalaTecla(); }
                           else
                             {
                             if ( Tecla == TEC_ARRIBA )
                               { Nuevo = ComienzoVt - AvanceVt; }
                             else
                               { Nuevo = ComienzoVt - 5 * AvanceVt; }
                             if ( Nuevo < 0 ) { Nuevo = 0; }
                             if ( ComienzoVt == Nuevo ) { Son_MalaTecla(); }
                             else  { ComienzoVt = Nuevo; Muestra = SI; }
                             }
                           break;
      }

    }
    
  Usr_BorraZona (NEGRO);
  }
