Source code for /engineering/REVERSEM/MYPIC.CPPOriginal file MYPIC.CPP
   1 /*--------------------------------------------------------------------------
   2 
   3   REVERSE :
   4 
   5   UNIT    : My picture
   6 
   7 
   8 
   9 ---------------------------------------------------------------------------*/
  10 
  11 
  12 // ------------------------------------------------------------------------
  13 // --- INCLUDES
  14 // ------------------------------------------------------------------------
  15 #include<stdlib.h>
  16 #include<stdio.h>
  17 extern "C" {
  18    #include "xtile21!.h"
  19 };
  20 #include<string.h>
  21 #include<alloc.h>
  22 #include"reversem.hpp"
  23 #include"mypic.hpp"
  24 
  25 // ------------------------------------------------------------------------
  26 // --- DEFINITIONS
  27 // ------------------------------------------------------------------------
  28 
  29 // --- Definitions ---------------------------------------------------------
  30 
  31 #define  PICTUREX_SIZE	      100
  32 #define  PICTUREY_SIZE	      100
  33 #define  PICTURE_DATA_SIZE    (PICTUREX_SIZE * PICTUREY_SIZE)
  34 
  35 // -- Screen location for picture
  36 #define  PICTUREX_LOC		4
  37 #define  PICTUREY_LOC	       31
  38 
  39 // -- Text definitions
  40 #define  TEXT_X			8
  41 #define  TEXT_Y		      134
  42 #define  TEXT_X_SIZE           92
  43 #define  TEXT_Y_SIZE           22
  44 #define  TEXT_COLOR	      103
  45 #define  TEXT_BACKGROUND      123
  46 
  47 // ------------------------------------------------------------------------
  48 // --- PRIVATE MEMBERS
  49 // ------------------------------------------------------------------------
  50 
  51 // -- Members :  -----------------------------------------------------
  52 void  MyPicture::LoadPicture( AVAILABLE_PICTURES Which,
  53 			      unsigned int       FindPic ) {
  54 
  55    unsigned char  *PicLocation;
  56    long		   PicOffset;
  57 
  58    // Generate a pointer and a file offset.
  59    PicLocation = PicDump + (FindPic * PICTURE_DATA_SIZE);
  60    PicOffset   = (long)((long)(Which) * (long)(PICTURE_DATA_SIZE));
  61 
  62    fseek( PicFile, PicOffset, SEEK_SET );
  63    fread( PicLocation, PICTURE_DATA_SIZE, 1, PicFile );
  64 
  65 };
  66 
  67 
  68 void  MyPicture::DisplayPicture( unsigned int  FindPic ) {
  69 
  70    XWait_Retrace();
  71    XPut_Tile( PICTUREX_LOC, PICTUREY_LOC, PICTUREX_SIZE, PICTUREY_SIZE,
  72 	      PicDump + (FindPic * PICTURE_DATA_SIZE) );
  73 };
  74 
  75 
  76 inline void  MyPicture::ClearText( void ) {
  77 
  78    XSet_Box( TEXT_X, TEXT_Y, TEXT_X_SIZE, TEXT_Y_SIZE, TEXT_BACKGROUND );
  79 
  80 };
  81 
  82 
  83 // ------------------------------------------------------------------------
  84 // --- CONSTRUCTOR/DESTRUCTOR
  85 // ------------------------------------------------------------------------
  86 
  87 MyPicture::MyPicture( void ) {
  88 
  89    int  Step;
  90 
  91    // Open pic file, and allocate pic dump.  For now, any error is fatal.
  92    PicFile = fopen( "mypics.cmb", "rb" );
  93    if ( PicFile == NULL ) {
  94       puts( ".. FATAL ERROR ..  Unable to open 'mypics.cmb' file.\n\r\n\r");
  95       exit( 1 );
  96    }
  97    PicDump = (unsigned char *) farmalloc( (unsigned long) PICTURE_DATA_SIZE * MAX_LOADED_PICTURES );
  98    if ( PicDump == NULL ) {
  99       puts( ".. FATAL ERROR ..  Unable to allocate memory for my pictures.\n\r\n\r");
 100       exit( 1 );
 101    }
 102 
 103    // Clear the pictures loaded array.
 104    for (Step = 0; Step < MAX_LOADED_PICTURES; Step++ ) {
 105       LoadPics[Step] = NO_PICTURE;
 106    }
 107 
 108    UseTick = 0;
 109 
 110 };
 111 
 112 
 113 MyPicture::~MyPicture() {
 114 
 115    // Close file and return memory
 116    fclose(  PicFile );
 117    farfree( PicDump );
 118 
 119 };
 120 
 121 
 122 // ------------------------------------------------------------------------
 123 // --- PUBLIC MEMBERS
 124 // ------------------------------------------------------------------------
 125 void  MyPicture::Reset( void ) {
 126 
 127    int  Step;
 128 
 129    // Reset the picture system.  Clear the loaded and clear the text window.
 130    for (Step = 0; Step < MAX_LOADED_PICTURES; Step++ ) {
 131       LoadPics[Step] = NO_PICTURE;
 132    }
 133    UseTick = 0;
 134 
 135    ClearText();
 136 
 137 };
 138 
 139 
 140 void  MyPicture::ShowPicture( AVAILABLE_PICTURES  Which ) {
 141 
 142    unsigned int  FindPic;
 143    unsigned int  Step;
 144 
 145    UseTick++;
 146 
 147    // If the picture requested is loaded, then show it.
 148    // If it is not loaded, then first load it.
 149    // If there is no room to load it, then replace the least recently used.
 150 
 151    for ( FindPic = 0; FindPic < MAX_LOADED_PICTURES; FindPic++ ) {
 152 
 153       if ( LoadPics[FindPic] == Which ) {
 154 	 // It is loaded!!
 155 	 DisplayPicture( FindPic );
 156 	 TickOfLastUse[FindPic] = UseTick;
 157 	 return;
 158       }
 159    }
 160 
 161    // Ok, not loaded.  Find a space to load
 162    for ( FindPic = 0; FindPic < MAX_LOADED_PICTURES; FindPic++ ) {
 163 
 164       if ( LoadPics[FindPic] == NO_PICTURE ) {
 165 
 166 	 // It is an empty spot!!
 167 	 LoadPicture( Which, FindPic );
 168 	 LoadPics[FindPic] = Which;
 169 	 DisplayPicture( FindPic );
 170 	 TickOfLastUse[FindPic] = UseTick;
 171 	 return;
 172       }
 173    }
 174 
 175    // Ok, boot the least recently used
 176    FindPic = 0;
 177    for ( Step = 1; Step < MAX_LOADED_PICTURES; Step++ ) {
 178       if ( TickOfLastUse[Step] < TickOfLastUse[FindPic] )
 179 	 FindPic = Step;
 180    }
 181    LoadPicture( Which, FindPic );
 182    LoadPics[FindPic] = Which;
 183    DisplayPicture( FindPic );
 184    TickOfLastUse[FindPic] = UseTick;
 185 
 186 };
 187 
 188 
 189 void   MyPicture::SayText( char*   Line1,
 190 			   char*   Line2,
 191 			   char*   Line3	) {
 192 
 193    // Display the lines that are not NULL
 194    ClearText();
 195 
 196    if( Line1 != NULL )
 197       XString4_C( TEXT_X, TEXT_Y,    TEXT_COLOR, Line1 );
 198    if( Line2 != NULL )
 199       XString4_C( TEXT_X, TEXT_Y+6,  TEXT_COLOR, Line2 );
 200    if( Line3 != NULL )
 201       XString4_C( TEXT_X, TEXT_Y+12, TEXT_COLOR, Line3 );
 202 
 203 };