/**********************************************************************\
*                                                                      *
*  display.c -- graphics display functions, bitmaps, scrolling, etc.   *
*                                                                      *
\**********************************************************************/

#include "defs.h"
#include "bitmaps.h"

/**********************************************************************\
*                                                                      *
*  do_bitmaps -- display some bitmaps on the screen                    *
*                                                                      *
\**********************************************************************/

do_bitmaps()
{

   /* width, height, position and colors of TNT plunger bitmap */

   static int tnt_width[]   = { 6,  3,  4,  4};
   static int tnt_height[]  = {28, 25, 27, 17};
   static int tnt_color[]   = { 0,  7,  8, 15};
   static int tnt_xoffset[] = { 0, 24, 16, 16};
   static int tnt_yoffset[] = { 0, -2, -1, -2};
   static char *tnt_bitmap[4] = {tnt0,tnt7,tnt8,tnt15};

   /* width, height, position and colors of "kablooy" explosion */

   static int kablooy_width[]   = {13,  6};
   static int kablooy_height[]  = {53,  8};
   static int kablooy_color[]   = { 4, 15};
   static int kablooy_xoffset[] = { 0, 29};
   static int kablooy_yoffset[] = { 0,-24};
   static char *kablooy_bitmap[2] = {kablooy4,kablooy15};

   /* strings for info window */

   static char *string[] = {
   "Bitmaps",
   "Bitmaps can be clipped, flipped, mode-independent",
   "and mode-specific.",
   };

   register int i;
   int x,y;
   int ymin,ymax;

   /* clear lower part of screen */

   fg_mousevis(OFF);
   fg_restore(0,xlimit,menu_bottom,ylimit);

   /* display the info window */

   info_window(120,520,60,string,3);

   /* calculate where the TNT bitmap is going to go */

   ymin = scale(60);
   ymax = ymin + 4 * (ptsize+1);

   x = 520;
   y = ymax;

   /* put the TNT bitmap next to the info window */

   fg_mousevis(OFF);
   for (i = 0; i < 4; i++)
   {
      fg_move(x+tnt_xoffset[i],y+tnt_yoffset[i]);
      fg_setcolor(tnt_color[i]);
      fg_drawmap(tnt_bitmap[i],tnt_width[i],tnt_height[i]);
   }

   /* save info window to hidden page, to be replaced after the explosion */

   x = 440;
   y = ymax + 20;
   fg_save(400,520,ymin,y);

   /* take a rectangular bite out of the info window on the hidden page */

   fg_transfer(464,568,144,180,464,y-10,hidden,hidden);

   /* pause 1 second */

   fg_mousevis(ON);
   fg_waitfor(18);

   /* move the plunger down */

   fg_mousevis(OFF);
   fg_transfer(544,567,ymax-30,ymax-25,544,ymax-23,visual,visual);
   fg_mousevis(ON);
   fg_waitfor(6);

   fg_mousevis(OFF);
   fg_transfer(544,567,ymax-28,ymax-23,544,ymax-21,visual,visual);
   fg_mousevis(ON);
   fg_waitfor(6);
   fg_mousevis(OFF);

   /* display the explosion */

   for (i = 0; i < 2; i++)
   {
      fg_move(x+kablooy_xoffset[i],y+kablooy_yoffset[i]);
      fg_setcolor(kablooy_color[i]);
      fg_drawmap(kablooy_bitmap[i],kablooy_width[i],kablooy_height[i]);
   }

   /* blink the "kablooy" text 4 times */

   for (i = 0; i < 4; i++)
   {
      fg_waitfor(3);
      fg_move(x+kablooy_xoffset[1],y+kablooy_yoffset[1]);
      fg_setcolor(4);
      fg_drawmap(kablooy_bitmap[1],kablooy_width[1],kablooy_height[1]);
      fg_waitfor(3);
      fg_move(x+kablooy_xoffset[1],y+kablooy_yoffset[1]);
      fg_setcolor(15);
      fg_drawmap(kablooy_bitmap[1],kablooy_width[1],kablooy_height[1]);
   }

   /* wait a bit, then restore the info window with the corner missing */

   fg_waitfor(3);
   fg_restore(440,568,y-68,y);

   /* draw the torn edges of the info window using the tear bitmap */

   fg_setcolor(0);
   fg_move(461,ymax);
   fg_drawmap(tear,8,29);

   /* restore all the stuff on the hidden page */

   draw_screen();

   /* wait for a keystroke, restore the visual page, and return */

   fg_mousevis(ON);
   wait_for_keystroke();

   fg_mousevis(OFF);
   fg_restore(0,xlimit,menu_bottom,ylimit);

   fg_mousevis(ON);
   redraw = TRUE;

   return(OK);
}

/**********************************************************************\
*                                                                      *
*  do_scroll -- do a circular scroll of part of the screen             *
*                                                                      *
\**********************************************************************/

do_scroll()
{
   register int i;
   int y1,y2;

   y1 = scale(4);
   y2 = ylimit - y1;

   fg_mousevis(OFF);

   /* save the area under the scroll */

   fg_transfer(280,439,y1,y2,0,y2,hidden,hidden);

   /* do a nice circular scroll */

   for (i = y1; i <= y2; i+=2)
      fg_scroll(280,439,y1,y2,-2,0);

   /* fix the area under the scroll */

   fg_transfer(0,159,y1,y2,280,y2,hidden,hidden);
   fg_save(0,159,y1,y2);

   fg_mousevis(ON);
   return(OK);
}

/**********************************************************************\
*                                                                      *
* do_transfer -- demo the transfer function                            *
*                                                                      *
\**********************************************************************/

do_transfer()
{
   register int i;
   int x,y;
   int ymin,ymax;

   static char *string[] = {
   "Transfer",
   "Use Fastgraph's image transfer routines",
   "to copy rectangular areas, either on the",
   "same video page or different video pages."
    };

   /* clear work area of visual page and display the info window */

   fg_mousevis(OFF);
   fg_restore(0,xlimit,menu_bottom,ylimit);
   info_window(24,419,60,string,4);

   /* save the info window to the hidden page */

   ymin = scale(60);
   ymax = ymin + 5 * (ptsize+1) + 2;
   fg_save(24,419,ymin,ymax);

   /* transfer a 6 copies of the info window from hidden page to visual */

   x = 56;
   y = ymax+ptsize+1;
   for (i = 0; i < 6; i++)
   {
      fg_transfer(24,419,ymin,ymax,x,y,hidden,visual);
      x += 32;
      y += ptsize;
      fg_waitfor(2);
   }

   /* wait for a keystroke */

   fg_mousevis(ON);
   wait_for_keystroke();

   fg_mousevis(OFF);

   /* clear the area where the info window was on the hidden page */

   y = 5 * (ptsize+1) + 2;

   fg_transfer(24,419,ymax+1,ymax+y+1,24,ymax,hidden,hidden);

   /* restore the screen and return */

   fg_restore(0,xlimit,menu_bottom,ylimit);
   redraw = TRUE;

   fg_mousevis(ON);
   return(OK);
}

/**********************************************************************\
*                                                                      *
*  view_graphic -- display a graphic image for the selected product    *
*                                                                      *
\**********************************************************************/

view_graphic()
{
   int xmin, xmax, ymin, ymax;

   static int defaults[] = {0,1,2,3,4,5,20, 7,56,57,58,59,60,61,62,63};

   fg_mousevis(OFF);
   fg_restore(0,xlimit,menu_bottom,ylimit);

   /* define the window extremes */

   xmin = 210;
   xmax = 430;
   ymin = scale(145);
   ymax = scale(205);

   /* display the status window */

   draw_window(xmin,xmax,ymin,ymax,"View Graphic");
   fg_setcolor(0);

   /* if using the proper video mode, display the image */

   if (mode == 16)
   {
      center_pstring("Loading image...",xmin,xmax,ymin+row_offset(3));

      /* display the graphic on the hidden page */

      fg_setpage(hidden);
      fg_move(0,ylimit);
      fg_dispfile("casino.ppr",xlimit+1,1);
      fg_setpage(visual);

      /* need to adjust the palettes for this graphic */

      fg_palette(7,38);
      fg_palette(13,39);
      fg_fadein(0);

      /* restore the hidden page */

      draw_screen();

      /* wait for a keystroke */

      fg_mousevis(ON);
      wait_for_keystroke();
      fg_mousevis(OFF);

      /* before we restore the palettes, erase the visual page */

      fg_erase();
      fg_palettes(defaults);

      /* copy menu screen from hidden to visual */

      fg_restore(0,xlimit,0,ylimit);
   }

   /* otherwise, display an error window */

   else
   {
      center_pstring("Incorrect video mode.",xmin,xmax,ymin+row_offset(3));
      center_pstring("Press any key.",xmin,xmax,ymin+row_offset(4));
      wait_for_keystroke();
      erase_window(xmin,xmax,ymin,ymax);
   }

   redraw = TRUE;
   return(OK);
}
