/*	SCCS Id: @(#)jtp_mou.c	3.0	2000/11/12	*/
/* Copyright (c) Jaakko Peltonen, 2000				  */
/* Modified by Jeroen Demeyer, 2003 */
/* NetHack may be freely redistributed.  See license for details. */

#ifndef _jtp_mou_c_
#define _jtp_mou_c_

#include "jtp_def.h"
#ifdef USE_DIRECTX_SYSCALLS
#include "jtp_dirx.h"
#endif
#ifdef USE_DOS_SYSCALLS
#include "jtp_dos.h"
#endif
#ifdef USE_SDL_SYSCALLS
#include "jtp_sdl.h"
#endif
#include "jtp_gra.h"
#include "jtp_mou.h"

short int jtp_mousex = 100, jtp_mousey = 100, jtp_mouseb = 0;
short int jtp_oldmx = 100, jtp_oldmy = 100, jtp_oldmb = 0;

jtp_mouse_cursor * jtp_mcursor[JTP_MAX_MCURSOR];

void jtp_readmouse()
{
  jtp_oldmx = jtp_mousex; jtp_oldmy = jtp_mousey; jtp_oldmb = jtp_mouseb;
#ifdef USE_DIRECTX_SYSCALLS
  jtp_DXReadMouse();
  jtp_mousex = jtp_dx_mousex; 
  jtp_mousey = jtp_dx_mousey; 
  jtp_mouseb = jtp_dx_mouseb;
#endif
#ifdef USE_DOS_SYSCALLS
  jtp_DOSReadMouse(&jtp_screen);
  jtp_mousex = jtp_dos_mousex; 
  jtp_mousey = jtp_dos_mousey; 
  jtp_mouseb = jtp_dos_mouseb;
#endif
#ifdef USE_SDL_SYSCALLS
  jtp_SDLReadMouse();
  jtp_mousex = jtp_sdl_mousex; 
  jtp_mousey = jtp_sdl_mousey; 
  jtp_mouseb = jtp_sdl_mouseb;
#endif
}


void jtp_setmouse(int tempx,int tempy)
{
  jtp_mousex=tempx;
  jtp_mousey=tempy;
}


char jtp_mouse_area(int x1,int y1,int x2,int y2)
{
  if ((jtp_mousex>=x1)&&(jtp_mousex<=x2)&&(jtp_mousey>=y1)&&(jtp_mousey<=y2))
    return(1); 
  return(0);  
}

char jtp_oldm_area(int x1,int y1,int x2,int y2)
{
  if ((jtp_oldmx>=x1)&&(jtp_oldmx<=x2)&&(jtp_oldmy>=y1)&&(jtp_oldmy<=y2))
   return(1); 
  return(0);  
}


void jtp_repeatmouse
(
  jtp_mouse_cursor *m_cursor,
  int whenstop
)
{
  unsigned char * m_bg;
 
  m_bg = jtp_get_img(jtp_mousex + m_cursor->xmod, jtp_mousey + m_cursor->ymod,
                     jtp_mousex + m_cursor->xmod + m_cursor->graphic[3], 
                     jtp_mousey + m_cursor->ymod + m_cursor->graphic[1]);
  jtp_put_stencil(jtp_mousex + m_cursor->xmod, jtp_mousey + m_cursor->ymod, m_cursor->graphic);
  jtp_refresh_region(jtp_mousex + m_cursor->xmod, jtp_mousey + m_cursor->ymod,
                     jtp_mousex + m_cursor->xmod + m_cursor->graphic[3],
                     jtp_mousey + m_cursor->ymod + m_cursor->graphic[1]);
  do
  {
    jtp_readmouse();

    if ((jtp_oldmx!=jtp_mousex) || (jtp_oldmy!=jtp_mousey))
    {
       jtp_put_img(jtp_oldmx + m_cursor->xmod, jtp_oldmy + m_cursor->ymod, m_bg);
       free(m_bg);
       
       m_bg = jtp_get_img(jtp_mousex + m_cursor->xmod, jtp_mousey + m_cursor->ymod,
                          jtp_mousex + m_cursor->xmod + m_cursor->graphic[3],
                          jtp_mousey + m_cursor->ymod + m_cursor->graphic[1]);
       jtp_put_stencil(jtp_mousex + m_cursor->xmod, jtp_mousey + m_cursor->ymod, m_cursor->graphic);

       jtp_refresh_region(jtp_mousex + m_cursor->xmod, jtp_mousey + m_cursor->ymod,
                          jtp_mousex + m_cursor->xmod + m_cursor->graphic[3],
                          jtp_mousey + m_cursor->ymod + m_cursor->graphic[1]);
       jtp_refresh_region(jtp_oldmx + m_cursor->xmod, jtp_oldmy + m_cursor->ymod,
                          jtp_oldmx + m_cursor->xmod + m_cursor->graphic[3],
                          jtp_oldmy + m_cursor->ymod + m_cursor->graphic[1]);
    }
  }
  while (jtp_mouseb != whenstop);

  jtp_put_img(jtp_mousex + m_cursor->xmod, jtp_mousey + m_cursor->ymod, m_bg);
  /* jtp_refresh_region(jtp_mousex + m_cursor->xmod, jtp_mousey + m_cursor->ymod,
                     jtp_mousex + m_cursor->xmod + m_cursor->graphic[3],
                     jtp_mousey + m_cursor->ymod + m_cursor->graphic[1]); */
  free(m_bg);
}


void jtp_keymouse
(
  jtp_mouse_cursor *m_cursor,
  int whenstop
)
{
  unsigned char * m_bg;
 
  m_bg = jtp_get_img(jtp_mousex + m_cursor->xmod, jtp_mousey + m_cursor->ymod,
                     jtp_mousex + m_cursor->xmod + m_cursor->graphic[3], 
                     jtp_mousey + m_cursor->ymod + m_cursor->graphic[1]);
  jtp_put_stencil(jtp_mousex + m_cursor->xmod, jtp_mousey + m_cursor->ymod, m_cursor->graphic);
  jtp_refresh_region(jtp_mousex + m_cursor->xmod, jtp_mousey + m_cursor->ymod,
                     jtp_mousex + m_cursor->xmod + m_cursor->graphic[3],
                     jtp_mousey + m_cursor->ymod + m_cursor->graphic[1]);
  do
  {
    jtp_readmouse();

    if ((jtp_oldmx!=jtp_mousex) || (jtp_oldmy!=jtp_mousey))
    {
       jtp_put_img(jtp_oldmx + m_cursor->xmod, jtp_oldmy + m_cursor->ymod, m_bg);
       free(m_bg);
       
       m_bg = jtp_get_img(jtp_mousex + m_cursor->xmod, jtp_mousey + m_cursor->ymod,
                          jtp_mousex + m_cursor->xmod + m_cursor->graphic[3],
                          jtp_mousey + m_cursor->ymod + m_cursor->graphic[1]);
       jtp_put_stencil(jtp_mousex + m_cursor->xmod, jtp_mousey + m_cursor->ymod, m_cursor->graphic);

       jtp_refresh_region(jtp_mousex + m_cursor->xmod, jtp_mousey + m_cursor->ymod,
                          jtp_mousex + m_cursor->xmod + m_cursor->graphic[3],
                          jtp_mousey + m_cursor->ymod + m_cursor->graphic[1]);
       jtp_refresh_region(jtp_oldmx + m_cursor->xmod, jtp_oldmy + m_cursor->ymod,
                          jtp_oldmx + m_cursor->xmod + m_cursor->graphic[3],
                          jtp_oldmy + m_cursor->ymod + m_cursor->graphic[1]);
    }
  }
  while ((jtp_mouseb != whenstop) && (!jtp_kbhit()));

  jtp_put_img(jtp_mousex + m_cursor->xmod, jtp_mousey + m_cursor->ymod, m_bg);
  /* jtp_refresh_region(jtp_mousex + m_cursor->xmod, jtp_mousey + m_cursor->ymod,
                     jtp_mousex + m_cursor->xmod + m_cursor->graphic[3],
                     jtp_mousey + m_cursor->ymod + m_cursor->graphic[1]); */
  free(m_bg);
}


void jtp_press_button
(
  int x1, int y1, int x2, int y2, 
  jtp_mouse_cursor * m_cursor
)
{
 unsigned char *button_bg = jtp_get_img(x1, y1, x2, y2);
 unsigned char *temp_button = jtp_get_img(x1, y1, x2-2,y2-2);

 jtp_fill_rect(x1, y1, x2, y1 + 1, 0);
 jtp_fill_rect(x1, y1, x1 + 1, y2, 0);      
 jtp_put_img(x1 + 2, y1 + 2, temp_button);
 free(temp_button);
 jtp_refresh_region(x1, y1, x2, y2);
 jtp_repeatmouse(m_cursor, JTP_MBUTTON_NONE);
 jtp_put_img(x1, y1, button_bg);
 jtp_refresh_region(x1, y1, x2, y2);
 free(button_bg); 
}


jtp_mouse_cursor *
jtp_get_mcursor(x1, y1, x2, y2)
int x1, y1, x2, y2;
{
  jtp_mouse_cursor *temp1 = (jtp_mouse_cursor *)malloc(sizeof(jtp_mouse_cursor));
  int i, j, tx1, ty1, tx2, ty2;
  unsigned char * tempg;

  for (i = y1; i <= y2; i++)
    for (j = x1; j <= x2; j++)
      if (jtp_screen.vpage[i*jtp_screen.width+j])
      {
        ty1 = i; i = y2+1; j = x2+1;
      }
 
  for (i = y2; i >= y1; i--)
    for (j = x1; j <= x2; j++)
      if (jtp_screen.vpage[i*jtp_screen.width+j])
      {
        ty2 = i; i = y1-1; j = x2+1;
      }
  for (j = x1; j <= x2; j++)
    for (i = ty1; i <= ty2; i++)   
      if (jtp_screen.vpage[i*jtp_screen.width+j])
      {
        tx1 = j; i = ty2+1; j = x2+1;
      }
  for (j = x2; j >= x1; j--)
    for (i = ty1; i <= ty2; i++)   
      if (jtp_screen.vpage[i*jtp_screen.width+j])
      {
        tx2 = j; i = ty2+1; j = x1-1;
      }
 
  temp1->xmod = 0;
  for (i = x1; i <= x2; i++)
    if (jtp_screen.vpage[(y1-1)*jtp_screen.width+i] == 16)
      temp1->xmod = tx1 - i; 

  temp1->ymod = 0;
  for (i = y1; i <= y2; i++)
    if (jtp_screen.vpage[i*jtp_screen.width+x1-1] == 16)
      temp1->ymod = ty1 - i;
 
  temp1->graphic = jtp_get_img(tx1, ty1, tx2, ty2);
  return(temp1);
}



#endif
