/* 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 3 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, see <http://www.gnu.org/licenses/>.
 *
 */

#ifndef CRYO_EDEN_GRAPHICS_H
#define CRYO_EDEN_GRAPHICS_H

#include "cryo/defs.h" // Room

namespace Cryo {

class EdenGame;
class HnmPlayer;

class EdenGraphics {
public:
	EdenGraphics(EdenGame *game);
	~EdenGraphics();

	// Original name: noclipax
	void drawSprite(int16 index, int16 x, int16 y, bool withBlack = false, bool onSubtitle = false);

	// Original name: af_subtitle
	void displaySubtitles();

	// Original name: bars_in
	void showBars();

	void sundcurs(int16 x, int16 y);

	void rundcurs();

	void unglow();

	void glow(int16 index);

	void setGlowX(int16 value);

	void setGlowY(int16 value);

	// Original name : blackbars
	void drawBlackBars();

	// Original name: bars_out
	void hideBars();

	// Original name: afsalle
	void displayRoom();

	// Original name: af_image
	void displayImage();

	void effetpix();

	// Original name: effet1
	void displayEffect1();

	// Original name: effet2
	void displayEffect2();

	void setShowBlackBars(bool value);

	bool getShowBlackBars();

	void paneltobuf();

	void cursbuftopanel();

	void langbuftopanel();

	View *getSubtitlesView();

	View *getMainView();

	byte *getHnmViewBuf();

	void setCurCharRect(Common::Rect *charRect);

	void setPaletteColor(byte *buffer);

	// Original name: sauvefondbouche
	void saveMouthBackground();

	// Original name: restaurefondbouche
	void restoreMouthBackground();

	void openWindow();

	bool _savedUnderSubtitles;

	void setSavedUnderSubtitles(bool value);

	byte *getSubtitlesViewBuf();

	View *getUnderBarsView();

	void SendPalette2Screen(int16 value);

	void setFade(bool value);

	bool getFade();

	// Original name: effet3
	void displayEffect3();

	void setDestRect(int16 sx, int16 sy, int16 ex, int16 ey);

	void setSrcRect(int16 sx, int16 sy, int16 ex, int16 ey);

	void fadeToBlack(int delay);

	// Original name: fadetoblack128
	void fadeToBlackLowPalette(int delay);

	// Original name: fadefromblack128
	void fadeFromBlackLowPalette(int delay);

	void clearScreen();

	void playHNM(int16 num);

	void setCursKeepPos(int16 x, int16 y);

	void restoreUnderSubtitles();

	void initRects();

	void initGlobals();

	void saveTopFrieze(int16 x);

	void saveBottomFrieze();

	void restoreTopFrieze();

	void restoreBottomFrieze();

private:
	EdenGame *_game;

	int16 _glowX;
	int16 _glowY;
	int16 _glowW;
	int16 _glowH;

	bool  _showVideoSubtitle;

	Common::Point _cursKeepPos;

	View  *_mainView;
	View  *_underSubtitlesView;
	View  *_subtitlesView;
	View  *_underBarsView;

	Common::Rect _underSubtitlesScreenRect;
	Common::Rect _underSubtitlesBackupRect;

	Common::Rect _underTopBarScreenRect;
	Common::Rect _underBottomBarBackupRect;
	Common::Rect _underBottomBarScreenRect;
	Common::Rect _underTopBarBackupRect;

	byte *_underSubtitlesViewBuf; // CHECKME: Useless?

	byte *_mainViewBuf;

	View  *_hnmView;
	byte *_hnmViewBuf;
	byte *_view2Buf;

	Common::Rect *_curCharacterRect;

	Common::Rect _rect_dst, _rect_src;

	View  *_view2;

	int _hnmFrameNum;

	bool  _videoCanceledFlag;  //TODO: hnm_canceled

	color_t _globalPalette[256];    //TODO palette_t

	byte *_subtitlesViewBuf;

	bool _needToFade;

	int _eff2pat;

	color3_t _newColor;
	color_t  _oldPalette[256];    // TODO palette_t ?
	color_t  _newPalette[256];

	bool _showBlackBars;

	void saveUnderSubtitles(int16 y);



	void displayHNMSubtitle();

	void readPalette(byte *ptr);

	void getglow(int16 x, int16 y, int16 w, int16 h);

	void loadMouthRectFromCurChar();

	// Original name afsalle1
	void displaySingleRoom(Room *room);

	// Original name: effet4
	void displayEffect4();

	void colimacon(const int16 pattern[]);

	// Original name: rectanglenoir32
	void blackRect32();

	////// film.c
	// Original name: showfilm
	void showMovie(int16 num, char arg1);

	// Original name bullehnm
	void handleHNMSubtitles();
};

}   // namespace Cryo

#endif // CRYO_EDEN_GRAPHICS_H
