/*--------------------------------------------------------------------
 * FICHERO:  PanMueve.c
 * OBJETIVO: Definir la funcin Pan_Mueve()
 * AUTOR:    Pedro Reina
 * FECHA:    X.19.7.1995
 *------------------------------------------------------------------*/

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

#include "Pantalla.h"

#ifdef OLIMPO_PC
#include <dos.h>       /*  REGS  int86()  */
#include <conio.h>     /*  gettextinfo() text_info */
#endif

#ifdef OLIMPO_QL
#include <qlib.h>      /*  sd_scrol()  sd_wdef()   */
#endif

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

/*--------------------------------------------------------------Olimpo
 * FUNCION:  Pan_Mueve()
 * OBJETIVO: Mover hacia arriba o hacia abajo el contenido de un
 *           rectngulo de pantalla
 * ENTRADAS: La direccin de movimiento, el nmero de filas que
 *           hay que mover y las coordenadas del rectngulo
 * SALIDAS:  Ninguna
 * EJEMPLO:  Pan_Mueve ( PAN_ARRIBA, 2,3,4,8,15 )
 *------------------------------------------------------------------*/

#ifdef OLIMPO_PC
void Pan_Mueve (Direccion, Ancho, F1, C1, F2, C2)
octeto Direccion, Ancho, F1, C1, F2, C2;
  {
  union  REGS r;
  octeto Papel;
  struct text_info Info;

  r.h.ah = Direccion==PAN_ARRIBA ? 0x06 : 0x07;
  r.h.al = Ancho;
  r.h.bh = 0x00;
  r.h.ch = F1 + (Pan_Mod_==PAN_GRAFICO ? Pan_Margen() : 0);
  r.h.cl = C1;
  r.h.dh = F2 + (Pan_Mod_==PAN_GRAFICO ? Pan_Margen() : 0);
  r.h.dl = C2;

  int86 (0x10,&r,&r);

  /* Encontrar el color del papel */
  if ( Pan_Modo() == PAN_TEXTO )
    {
    gettextinfo (&Info);
    Papel = Info.attribute >> 4 & 7;
    }
  else  { Papel = Pan_Pap_; }

  /* Borrar la zona que aparece con el color del papel */
  if ( Direccion == PAN_ABAJO )
    { Pan_Borra (Papel, F1, C1, F1+Ancho-1, C2); }
  else
    { Pan_Borra (Papel, F2-Ancho+1, C1, F2, C2); }
  }
#endif

#ifdef OLIMPO_QL
void Pan_Mueve (Direccion, Ancho, F1, C1, F2, C2)
octeto Direccion, Ancho, F1, C1, F2, C2;
  {
  struct QLRECT Bloque;
  int    Amplitud;

  /* Redefino la pantalla como el rectngulo que hay que mover */
  Bloque.q_width  = Pan_AnchoCar() * (C2-C1+1);
  Bloque.q_height = Pan_AltoCar()* (F2-F1+1);
  Bloque.q_x      = Pan_MargenIzquierdo() + Pan_AnchoCar()*C1;
  Bloque.q_y      = Pan_MargenSuperior() + Pan_AltoCar()*F1;
  sd_wdef (Pan_Canal(),-1L,0,0,&Bloque);

  /* Muevo la ventana QDOS */
  Amplitud = Direccion == PAN_ABAJO ? Ancho : -Ancho;
  sd_scrol (Pan_Canal(), -1L, Amplitud*Pan_AltoCar());

  /* Redefino la pantalla como la original de Olimpo */
  Bloque.q_width  = 480;
  Bloque.q_height = 250;
  Bloque.q_x      = Pan_MargenIzquierdo();
  Bloque.q_y      = Pan_MargenSuperior();
  sd_wdef (Pan_Canal(),-1L,0,0,&Bloque);
  }
#endif
