diff --git a/client/GUIClasses.cpp b/client/GUIClasses.cpp index 24a4f6eee..9f713ceb5 100644 --- a/client/GUIClasses.cpp +++ b/client/GUIClasses.cpp @@ -58,6 +58,9 @@ extern TTF_Font * GEOR16; extern std::queue events; extern boost::mutex eventsM; +#undef min +#undef max + static StackState* getStackState(const CGObjectInstance *obj, int pos, bool town) { const CGHeroInstance *h = dynamic_cast(obj); diff --git a/hch/CVideoHandler.cpp b/hch/CVideoHandler.cpp index 3cdee6736..5f8903f31 100644 --- a/hch/CVideoHandler.cpp +++ b/hch/CVideoHandler.cpp @@ -103,8 +103,8 @@ CBIKHandler::CBIKHandler() //binkGetError = FindAddress("_BinkGetError@0"); binkOpen = (BinkOpen)FindAddress("_BinkOpen@8"); binkSetSoundSystem = (BinkSetSoundSystem)FindAddress("_BinkSetSoundSystem@8"); - //getPalette = (BinkGetPalette)FindAddress("_BinkGetPalette@4"); - binkNextFrame = (BinkNextFrame)FindAddress("_BinkNextFrame@4"); + //getPalette = (BinkGetPalette)FindAddress("_BinkGetPalette@4"); + binkNextFrame = (BinkNextFrame)FindAddress("_BinkNextFrame@4"); binkDoFrame = (BinkDoFrame)FindAddress("_BinkDoFrame@4"); binkCopyToBuffer = (BinkCopyToBuffer)FindAddress("_BinkCopyToBuffer@28"); binkWait = (BinkWait)FindAddress("_BinkWait@4"); @@ -228,8 +228,8 @@ void CSmackPlayer::close() void CSmackPlayer::open( std::string name ) { - Uint32 flags[2] = {0xff400, 0xfe400}; - + Uint32 flags[2] = {0xff400, 0xfe400}; + data = ptrSmackOpen( (void*)name.c_str(), flags[1], -1); if (!data) { @@ -301,32 +301,32 @@ void CSmackPlayer::redraw( int x, int y, SDL_Surface *dst, bool update ) SDL_UpdateRect(dst, x, y, w, h); } -CVideoPlayer::CVideoPlayer() +CVideoPlayer::CVideoPlayer() { vidh = new CVidHandler(std::string(DATA_DIR "Data" PATHSEPARATOR "VIDEO.VID")); - current = NULL; -} - -CVideoPlayer::~CVideoPlayer() -{ - delete vidh; -} - -void CVideoPlayer::open(std::string name) -{ - if(boost::algorithm::ends_with(name, ".BIK")) - current = &bikPlayer; - else - current = &smkPlayer; - - fname = name; - first = true; - - //extract video from video.vid so we can play it - vidh->extract(name, name); - current->open(name); -} - + current = NULL; +} + +CVideoPlayer::~CVideoPlayer() +{ + delete vidh; +} + +void CVideoPlayer::open(std::string name) +{ + if(boost::algorithm::ends_with(name, ".BIK")) + current = &bikPlayer; + else + current = &smkPlayer; + + fname = name; + first = true; + + //extract video from video.vid so we can play it + vidh->extract(name, name); + current->open(name); +} + void CVideoPlayer::close() { if(!current) @@ -355,16 +355,16 @@ void CVideoPlayer::show(int x, int y, SDL_Surface *dst, bool update) current->show(x, y, dst, update); } -bool CVideoPlayer::wait() -{ - return current->wait(); -} - -int CVideoPlayer::curFrame() const -{ - return current->curFrame(); -} - +bool CVideoPlayer::wait() +{ + return current->wait(); +} + +int CVideoPlayer::curFrame() const +{ + return current->curFrame(); +} + int CVideoPlayer::frameCount() const { return current->frameCount(); diff --git a/hch/CVideoHandler.h b/hch/CVideoHandler.h index 80377a1ca..cea766c35 100644 --- a/hch/CVideoHandler.h +++ b/hch/CVideoHandler.h @@ -1,103 +1,103 @@ -#ifndef __CVIDEOHANDLER_H__ -#define __CVIDEOHANDLER_H__ -#include "../global.h" - -#ifdef _WIN32 - -#include - -struct SDL_Surface; - -#pragma pack(push,1) -struct BINK_STRUCT -{ - si32 width; - si32 height; - si32 frameCount; - si32 currentFrame; - si32 lastFrame; - si32 FPSMul; - si32 FPSDiv; - si32 unknown0; - ui8 flags; - ui8 unknown1[260]; - si32 CurPlane; // current plane - void *plane0; // posi32er to plane 0 - void *plane1; // posi32er to plane 1 - si32 unknown2; - si32 unknown3; - si32 yWidth; // Y plane width - si32 yHeight; // Y plane height - si32 uvWidth; // U&V plane width - si32 uvHeight; // U&V plane height -}; -#pragma pack(pop) - -typedef BINK_STRUCT* HBINK; - -class DLLHandler -{ -public: - std::string name; - HINSTANCE dll; - void Instantiate(const char *filename); - const char *GetLibExtension(); - void *FindAddress(const char *symbol); - - DLLHandler(); - virtual ~DLLHandler(); //d-tor -}; +#ifndef __CVIDEOHANDLER_H__ +#define __CVIDEOHANDLER_H__ +#include "../global.h" -typedef void*(__stdcall* BinkSetSoundSystem)(void * soundfun, void*); -typedef HBINK(__stdcall* BinkOpen)(HANDLE bikfile, int flags); -typedef void(__stdcall* BinkClose)(HBINK); -//typedef si32(__stdcall* BinkGetPalette)(HBINK); -typedef void(__stdcall* BinkNextFrame)(HBINK); -typedef void(__stdcall* BinkDoFrame)(HBINK); -typedef ui8(__stdcall* BinkWait)(HBINK); -typedef si32(__stdcall* BinkCopyToBuffer)(HBINK, void* buffer, int stride, int height, int x, int y, int mode); +#ifdef _WIN32 + +#include + +struct SDL_Surface; + +#pragma pack(push,1) +struct BINK_STRUCT +{ + si32 width; + si32 height; + si32 frameCount; + si32 currentFrame; + si32 lastFrame; + si32 FPSMul; + si32 FPSDiv; + si32 unknown0; + ui8 flags; + ui8 unknown1[260]; + si32 CurPlane; // current plane + void *plane0; // posi32er to plane 0 + void *plane1; // posi32er to plane 1 + si32 unknown2; + si32 unknown3; + si32 yWidth; // Y plane width + si32 yHeight; // Y plane height + si32 uvWidth; // U&V plane width + si32 uvHeight; // U&V plane height +}; +#pragma pack(pop) + +typedef BINK_STRUCT* HBINK; + +class DLLHandler +{ +public: + std::string name; + HINSTANCE dll; + void Instantiate(const char *filename); + const char *GetLibExtension(); + void *FindAddress(const char *symbol); + + DLLHandler(); + virtual ~DLLHandler(); //d-tor +}; + +typedef void*(__stdcall* BinkSetSoundSystem)(void * soundfun, void*); +typedef HBINK(__stdcall* BinkOpen)(HANDLE bikfile, int flags); +typedef void(__stdcall* BinkClose)(HBINK); +//typedef si32(__stdcall* BinkGetPalette)(HBINK); +typedef void(__stdcall* BinkNextFrame)(HBINK); +typedef void(__stdcall* BinkDoFrame)(HBINK); +typedef ui8(__stdcall* BinkWait)(HBINK); +typedef si32(__stdcall* BinkCopyToBuffer)(HBINK, void* buffer, int stride, int height, int x, int y, int mode); class IVideoPlayer { -public: - virtual void open(std::string name)=0; +public: + virtual void open(std::string name)=0; virtual void close()=0; virtual void nextFrame()=0; virtual void show(int x, int y, SDL_Surface *dst, bool update = true)=0; virtual void redraw(int x, int y, SDL_Surface *dst, bool update = true)=0; //reblits buffer - virtual bool wait()=0; - virtual int curFrame() const =0; + virtual bool wait()=0; + virtual int curFrame() const =0; virtual int frameCount() const =0; }; - -class CBIKHandler : public DLLHandler, public IVideoPlayer -{ -public: - HANDLE hBinkFile; - HBINK hBink; - char * buffer; - BinkSetSoundSystem binkSetSoundSystem; - BinkOpen binkOpen; - //BinkGetPalette getPalette; - BinkNextFrame binkNextFrame; - BinkDoFrame binkDoFrame; - BinkCopyToBuffer binkCopyToBuffer; - BinkWait binkWait; - BinkClose binkClose; - - CBIKHandler(); - void open(std::string name); + +class CBIKHandler : public DLLHandler, public IVideoPlayer +{ +public: + HANDLE hBinkFile; + HBINK hBink; + char * buffer; + BinkSetSoundSystem binkSetSoundSystem; + BinkOpen binkOpen; + //BinkGetPalette getPalette; + BinkNextFrame binkNextFrame; + BinkDoFrame binkDoFrame; + BinkCopyToBuffer binkCopyToBuffer; + BinkWait binkWait; + BinkClose binkClose; + + CBIKHandler(); + void open(std::string name); void close(); void nextFrame(); void show(int x, int y, SDL_Surface *dst, bool update = true); void redraw(int x, int y, SDL_Surface *dst, bool update = true); //reblits buffer - bool wait(); - int curFrame() const; - int frameCount() const; -}; - -//////////SMK Player /////////////////////////////////////////////////////// + bool wait(); + int curFrame() const; + int frameCount() const; +}; + +//////////SMK Player /////////////////////////////////////////////////////// struct SmackStruct { @@ -124,8 +124,8 @@ typedef bool (__stdcall* SmackWait)(SmackStruct*); typedef void (__stdcall* SmackSoundOnOff) (SmackStruct*, bool); - -class CSmackPlayer: public DLLHandler, public IVideoPlayer + +class CSmackPlayer: public DLLHandler, public IVideoPlayer { public: SmackOpen ptrSmackOpen; @@ -140,89 +140,89 @@ public: SmackStruct* data; CSmackPlayer(); - ~CSmackPlayer(); - void open(std::string name); + ~CSmackPlayer(); + void open(std::string name); void close(); void nextFrame(); void show(int x, int y, SDL_Surface *dst, bool update = true); void redraw(int x, int y, SDL_Surface *dst, bool update = true); //reblits buffer - bool wait(); - int curFrame() const; + bool wait(); + int curFrame() const; int frameCount() const; }; - -class CVidHandler; - -class CVideoPlayer : public IVideoPlayer -{ -private: - CVidHandler * vidh; //.vid file handling - - CSmackPlayer smkPlayer; //for .SMK - CBIKHandler bikPlayer; //for .BIK - IVideoPlayer *current; //points to bik or smk player, appropriate to type of currently played video - - std::string fname; //name of current video file (empty if idle) - bool first; //are we about to display the first frame (blocks update) -public: - CVideoPlayer(); //c-tor - ~CVideoPlayer(); //d-tor - - - void open(std::string name); + +class CVidHandler; + +class CVideoPlayer : public IVideoPlayer +{ +private: + CVidHandler * vidh; //.vid file handling + + CSmackPlayer smkPlayer; //for .SMK + CBIKHandler bikPlayer; //for .BIK + IVideoPlayer *current; //points to bik or smk player, appropriate to type of currently played video + + std::string fname; //name of current video file (empty if idle) + bool first; //are we about to display the first frame (blocks update) +public: + CVideoPlayer(); //c-tor + ~CVideoPlayer(); //d-tor + + + void open(std::string name); void close(); void nextFrame(); //move animation to the next frame void show(int x, int y, SDL_Surface *dst, bool update = true); //blit current frame void redraw(int x, int y, SDL_Surface *dst, bool update = true); //reblits buffer void update(int x, int y, SDL_Surface *dst, bool forceRedraw, bool update = true); //moves to next frame if appropriate, and blits it or blits only if redraw paremeter is set true - bool wait(); //true if we should wait before displaying next frame (for keeping FPS) - int curFrame() const; //current frame number <1, framecount> - int frameCount() const; - - bool openAndPlayVideo(std::string name, int x, int y, SDL_Surface *dst, bool stopOnKey = false); //opens video, calls playVideo, closes video; returns playVideo result (if whole video has been played) - bool playVideo(int x, int y, SDL_Surface *dst, bool stopOnKey = false); //plays whole opened video; returns: true when whole video has been shown, false when it has been interrupted -}; - -#else - -#include - -typedef struct AVFormatContext AVFormatContext; -typedef struct AVCodecContext AVCodecContext; -typedef struct AVCodec AVCodec; -typedef struct AVFrame AVFrame; -struct SwsContext; -class CVidHandler; - -class CVideoPlayer -{ -private: - int stream; // stream index in video - AVFormatContext *format; - AVCodecContext *codecContext; // codec context for stream - AVCodec *codec; - AVFrame *frame; - struct SwsContext *sws; - - SDL_Overlay *overlay; - SDL_Rect pos; // overlay position - - CVidHandler *vidh; - -public: - CVideoPlayer(); - ~CVideoPlayer(); - - bool init(); - bool open(std::string fname, int x, int y); - void close(); - bool nextFrame(); // display next frame - - const char *data; // video buffer - int length; // video size - unsigned int offset; // current data offset -}; - -#endif - -#endif // __CVIDEOHANDLER_H__ + bool wait(); //true if we should wait before displaying next frame (for keeping FPS) + int curFrame() const; //current frame number <1, framecount> + int frameCount() const; + + bool openAndPlayVideo(std::string name, int x, int y, SDL_Surface *dst, bool stopOnKey = false); //opens video, calls playVideo, closes video; returns playVideo result (if whole video has been played) + bool playVideo(int x, int y, SDL_Surface *dst, bool stopOnKey = false); //plays whole opened video; returns: true when whole video has been shown, false when it has been interrupted +}; + +#else + +#include + +typedef struct AVFormatContext AVFormatContext; +typedef struct AVCodecContext AVCodecContext; +typedef struct AVCodec AVCodec; +typedef struct AVFrame AVFrame; +struct SwsContext; +class CVidHandler; + +class CVideoPlayer +{ +private: + int stream; // stream index in video + AVFormatContext *format; + AVCodecContext *codecContext; // codec context for stream + AVCodec *codec; + AVFrame *frame; + struct SwsContext *sws; + + SDL_Overlay *overlay; + SDL_Rect pos; // overlay position + + CVidHandler *vidh; + +public: + CVideoPlayer(); + ~CVideoPlayer(); + + bool init(); + bool open(std::string fname, int x, int y); + void close(); + bool nextFrame(); // display next frame + + const char *data; // video buffer + int length; // video size + unsigned int offset; // current data offset +}; + +#endif + +#endif // __CVIDEOHANDLER_H__