2013-07-11 17:36:59 +02:00
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers , whose names
* are too numerous to list here . Please refer to the COPYRIGHT
* file distributed with this source distribution .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
*
*/
/*
* This code is based on the original source code of Lord Avalot d ' Argent version 1.3 .
* Copyright ( c ) 1994 - 1995 Mike , Mark and Thomas Thurman .
*/
2013-09-07 09:00:34 +02:00
# ifndef AVALANCHE_GRAPHICS_H
# define AVALANCHE_GRAPHICS_H
2013-07-11 17:36:59 +02:00
2013-07-16 13:03:22 +02:00
# include "common/file.h"
2013-09-19 21:21:53 +02:00
# include "common/rect.h"
2013-07-16 13:03:22 +02:00
2013-07-11 17:36:59 +02:00
# include "graphics/surface.h"
2013-09-27 21:57:24 +02:00
# include "avalanche/enums.h"
2013-07-11 17:36:59 +02:00
namespace Avalanche {
class AvalancheEngine ;
2013-09-29 17:54:03 +02:00
struct SpriteType ;
2013-07-11 17:36:59 +02:00
2013-09-21 13:10:14 +02:00
typedef byte FontType [ 256 ] [ 16 ] ;
2013-08-11 14:06:15 +02:00
2013-09-21 13:10:14 +02:00
typedef byte ManiType [ 2049 ] ;
// manitype = array[5..2053] of byte;
2013-07-18 15:13:23 +02:00
// Be aware!!!
2013-09-05 13:20:03 +02:00
typedef byte SilType [ 51 ] [ 11 ] ; // 35, 4
2013-07-18 15:13:23 +02:00
class SpriteInfo {
public :
2013-09-05 13:20:03 +02:00
byte _xWidth ;
byte _xLength , _yLength ;
ManiType * _mani [ 24 ] ;
SilType * _sil [ 24 ] ;
uint16 _size ; // The size of one picture.
2013-07-18 15:13:23 +02:00
} ;
2013-09-29 17:54:03 +02:00
class GraphicManager {
2013-07-11 17:36:59 +02:00
public :
2013-09-29 17:54:03 +02:00
Graphics : : Surface _surface ;
2013-10-01 07:43:21 +02:00
Color _talkBackgroundColor , _talkFontColor ;
2013-07-30 20:33:05 +02:00
2013-09-29 17:54:03 +02:00
GraphicManager ( AvalancheEngine * vm ) ;
~ GraphicManager ( ) ;
2013-09-05 13:20:03 +02:00
void init ( ) ;
2013-09-28 09:43:28 +02:00
void loadDigits ( Common : : File & file ) ; // Load the scoring digits & rwlites
2013-09-28 10:00:23 +02:00
void loadMouse ( byte which ) ;
2013-09-28 09:43:28 +02:00
2013-09-05 13:20:03 +02:00
void fleshColors ( ) ;
2013-09-07 09:00:34 +02:00
2013-09-29 21:28:43 +02:00
Common : : Point drawScreenArc ( int16 x , int16 y , int16 stAngle , int16 endAngle , uint16 radius , Color color ) ;
2013-09-28 15:08:41 +02:00
void drawPieSlice ( int16 x , int16 y , int16 stAngle , int16 endAngle , uint16 radius , Color color ) ;
void drawTriangle ( Common : : Point * p , Color color ) ;
void drawNormalText ( const Common : : String text , FontType font , byte fontHeight , int16 x , int16 y , Color color ) ;
void drawScrollText ( const Common : : String text , FontType font , byte fontHeight , int16 x , int16 y , Color color ) ;
2013-09-28 09:43:28 +02:00
void drawDigit ( int index , int x , int y ) ;
void drawDirection ( int index , int x , int y ) ;
2013-09-28 15:08:41 +02:00
void drawScrollShadow ( int16 x1 , int16 y1 , int16 x2 , int16 y2 ) ;
void drawShadowBox ( int16 x1 , int16 y1 , int16 x2 , int16 y2 , Common : : String text ) ;
2013-09-28 17:09:50 +02:00
void drawScroll ( int mx , int lx , int my , int ly ) ;
2013-09-29 19:03:52 +02:00
void drawMenuBar ( Color color ) ;
2013-09-29 11:26:21 +02:00
void drawSpeedBar ( int speed ) ;
2013-09-29 17:54:03 +02:00
void drawBackgroundSprite ( int16 x , int16 y , SpriteType & sprite ) ;
2013-09-29 19:03:52 +02:00
void drawMenuBlock ( int x1 , int y1 , int x2 , int y2 , Color color ) ;
2013-09-29 19:49:57 +02:00
void drawMenuItem ( int x1 , int y1 , int x2 , int y2 ) ;
2013-09-29 19:03:52 +02:00
void wipeChar ( int x , int y , Color color ) ;
void drawChar ( byte ander , int x , int y , Color color ) ;
2013-09-29 22:19:12 +02:00
void drawDebugLines ( ) ;
2013-09-29 11:26:21 +02:00
2013-09-28 15:08:41 +02:00
void clearAlso ( ) ;
void clearTextBar ( ) ;
void setAlsoLine ( int x1 , int y1 , int x2 , int y2 , Color color ) ;
2013-09-28 14:31:54 +02:00
byte getAlsoColor ( int x1 , int y1 , int x2 , int y2 ) ;
2013-09-29 19:49:57 +02:00
byte getScreenColor ( Common : : Point pos ) ;
2013-08-11 14:06:15 +02:00
2013-07-26 13:32:08 +02:00
// The caller has to .free() the returned Surfaces!!!
2013-09-05 13:20:03 +02:00
// Further information about these two: http://www.shikadi.net/moddingwiki/Raw_EGA_data
2013-09-29 17:54:03 +02:00
Graphics : : Surface loadPictureRow ( Common : : File & file , uint16 width , uint16 height ) ; // Reads Row-planar EGA data.
2013-07-26 13:32:08 +02:00
2013-09-05 13:20:03 +02:00
void drawSprite ( const SpriteInfo & sprite , byte picnum , int16 x , int16 y ) ;
2013-09-29 17:54:03 +02:00
void drawPicture ( Graphics : : Surface & target , const Graphics : : Surface & picture , uint16 destX , uint16 destY ) ; // Can't call .free() here. See showScore() for example.
2013-09-28 10:41:52 +02:00
void drawThinkPic ( Common : : String filename , int id ) ;
void drawToolbar ( ) ;
2013-09-29 12:13:06 +02:00
void drawCursor ( byte pos ) ;
void drawReadyLight ( Color color ) ;
2013-10-01 08:51:07 +02:00
void drawSign ( Common : : String name , int16 xl , int16 yl , int16 y ) ; // This is for drawing a big "about" or "gameover" picture loaded from a file into an empty scroll.
2013-10-01 09:57:41 +02:00
void drawIcon ( int16 x , int16 y , byte which ) ; // Draws an icon to the current scroll.
2013-09-29 12:13:06 +02:00
void prepareBubble ( int xc , int xw , int my , Common : : Point points [ 3 ] ) ;
2013-09-28 10:41:52 +02:00
2013-07-12 10:25:16 +02:00
void refreshScreen ( ) ;
2013-09-27 23:48:53 +02:00
void loadBackground ( Common : : File & file ) ;
2013-08-23 11:33:37 +02:00
void refreshBackground ( ) ;
2013-09-28 10:41:52 +02:00
void setBackgroundColor ( Color x ) ;
2013-10-01 07:43:21 +02:00
void setDialogColor ( Color bg , Color text ) ;
2013-09-28 10:41:52 +02:00
2013-09-27 23:22:36 +02:00
void zoomOut ( int16 x , int16 y ) ; // Only used when entering the map.
2013-08-23 11:33:37 +02:00
2013-09-29 12:13:06 +02:00
void showScroll ( ) ;
2013-09-29 11:26:21 +02:00
void saveScreen ( ) ;
void removeBackup ( ) ;
void restoreScreen ( ) ;
2013-07-11 17:36:59 +02:00
private :
2013-09-28 10:41:52 +02:00
static const uint16 kBackgroundWidth = kScreenWidth ;
static const byte kBackgroundHeight = 8 * 12080 / kScreenWidth ; // With 640 width it's 151.
// The 8 = number of bits in a byte, and 12080 comes from Lucerna::load().
2013-09-05 10:51:47 +02:00
static const byte kEgaPaletteIndex [ 16 ] ;
2013-09-29 17:54:03 +02:00
Graphics : : Surface _background ;
Graphics : : Surface _magics ; // Lucerna::draw_also_lines() draws the "magical" lines here. Further information: https://github.com/urukgit/avalot/wiki/Also
Graphics : : Surface _digits [ 10 ] ; // digitsize and rwlitesize are defined in loadDigits() !!!
Graphics : : Surface _directions [ 9 ] ; // Maybe it will be needed to move them to the class itself instead.
Graphics : : Surface _screen ; // Only used in refreshScreen() to make it more optimized. (No recreation of it at every call of the function.)
Graphics : : Surface _scrolls ;
Graphics : : Surface _backup ;
2013-09-28 09:43:28 +02:00
byte _egaPalette [ 64 ] [ 3 ] ;
AvalancheEngine * _vm ;
2013-09-29 17:54:03 +02:00
Graphics : : Surface loadPictureGraphic ( Common : : File & file ) ; // Reads Graphic-planar EGA data.
void drawText ( Graphics : : Surface & surface , const Common : : String text , FontType font , byte fontHeight , int16 x , int16 y , Color color ) ;
2013-09-29 21:28:43 +02:00
// Taken from Free Pascal's Procedure InternalEllipseDefault. Used to replace Pascal's procedure arc.
// Returns the end point of the arc. (Needed in Clock.)
// TODO: Make it more accurate later.
Common : : Point drawArc ( Graphics : : Surface & surface , int16 x , int16 y , int16 stAngle , int16 endAngle , uint16 radius , Color color ) ;
2013-07-11 17:36:59 +02:00
} ;
} // End of namespace Avalanche
2013-09-07 09:00:34 +02:00
# endif // AVALANCHE_GRAPHICS_H