/* =========================================================================== Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). Doom 3 BFG Edition Source Code 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. Doom 3 BFG Edition Source Code 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 Doom 3 BFG Edition Source Code. If not, see . In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. =========================================================================== */ #ifndef __SWF_H__ #define __SWF_H__ #include "SWF_Enums.h" #include "SWF_Types.h" #include "SWF_Bitstream.h" #include "SWF_ScriptVar.h" #include "SWF_Sprites.h" #include "SWF_ScriptObject.h" #include "SWF_ParmList.h" #include "SWF_ScriptFunction.h" #include "SWF_SpriteInstance.h" #include "SWF_ShapeParser.h" #include "SWF_TextInstance.h" class idSWFDictionaryEntry { public: idSWFDictionaryEntry(); ~idSWFDictionaryEntry(); idSWFDictionaryEntry& operator=( idSWFDictionaryEntry& other ); swfDictType_t type; const idMaterial* material; idSWFShape* shape; idSWFSprite* sprite; idSWFFont* font; idSWFText* text; idSWFEditText* edittext; idVec2i imageSize; idVec2i imageAtlasOffset; // the compressed images are normalize to reduce compression artifacts, // color must be scaled down by this idVec4 channelScale; }; struct purgableSwfImage_t { purgableSwfImage_t() { image = NULL; swfFrameNum = 0; } idImage* image; unsigned swfFrameNum; }; /* ================================================ This class handles loading and rendering SWF files ================================================ */ class idSWF { public: idSWF( const char* filename, idSoundWorld* soundWorld = NULL ); ~idSWF(); bool IsLoaded() { return ( frameRate > 0 ); } bool IsActive() { return isActive; } void Activate( bool b ); const char* GetName() { return filename; } void Pause() { mainspriteInstance->Stop(); paused = true; } void Resume() { mainspriteInstance->Play(); paused = false; } bool IsPaused() { return paused; } void SetPausedRender( bool valid ) { pausedRender = valid; } bool GetPausedRender() { return pausedRender; } void Render( idRenderSystem* gui, int time = 0, bool isSplitscreen = false ); bool HandleEvent( const sysEvent_t* event ); bool InhibitControl(); void ForceInhibitControl( bool val ) { inhibitControl = val; } void SetGlobal( const char* name, const idSWFScriptVar& value ) { globals->Set( name, value ); } void SetGlobalNative( const char* name, idSWFScriptNativeVariable* native ) { globals->SetNative( name, native ); } idSWFScriptVar GetGlobal( const char* name ) { return globals->Get( name ); } idSWFScriptObject& GetRootObject() { assert( mainspriteInstance->GetScriptObject() != NULL ); return *( mainspriteInstance->GetScriptObject() ); } void Invoke( const char* functionName, const idSWFParmList& parms ); void Invoke( const char* functionName, const idSWFParmList& parms, idSWFScriptVar& scriptVar ); void Invoke( const char* functionName, const idSWFParmList& parms, bool& functionExists ); int PlaySound( const char* sound, int channel = SCHANNEL_ANY, bool blocking = false ); void StopSound( int channel = SCHANNEL_ANY ); float GetFrameWidth() const { return frameWidth; } float GetFrameHeight() const { return frameHeight; } int GetMouseX() { return mouseX; } int GetMouseY() { return mouseY; } bool UseCircleForAccept(); void SetSWFScale( float scale ) { swfScale = scale; } void SetForceNonPCGetPlatform() { forceNonPCPlatform = true; } idRandom2& GetRandom() { return random; } int GetPlatform(); //---------------------------------- // SWF_Dictionary.cpp //---------------------------------- idSWFDictionaryEntry* AddDictionaryEntry( int characterID, swfDictType_t type ); idSWFDictionaryEntry* FindDictionaryEntry( int characterID, swfDictType_t type ); idSWFDictionaryEntry* FindDictionaryEntry( int characterID ); idSWFDictionaryEntry* GetDictionaryEntry( int index ) { return &dictionary[ index ]; } int GetNumDictionaryEntry() { return dictionary.Num(); } idSWFScriptObject* HitTest( idSWFSpriteInstance* spriteInstance, const swfRenderState_t& renderState, int x, int y, idSWFScriptObject* parentObject ); private: idStr filename; ID_TIME_T timestamp; float frameWidth; float frameHeight; uint16 frameRate; float renderBorder; float swfScale; idVec2 scaleToVirtual; int lastRenderTime; bool isActive; bool inhibitControl; bool useInhibtControl; // certain screens need to be rendered when the pause menu is up so if this flag is // set on the gui we will allow it to render at a paused state; bool pausedRender; bool mouseEnabled; bool useMouse; bool blackbars; bool crop; bool paused; bool hasHitObject; bool forceNonPCPlatform; idRandom2 random; static int mouseX; // mouse x coord for all flash files static int mouseY; // mouse y coord for all flash files static bool isMouseInClientArea; idSWFScriptObject* mouseObject; idSWFScriptObject* hoverObject; idSWFSprite* mainsprite; idSWFSpriteInstance* mainspriteInstance; idSWFScriptObject* globals; idSWFScriptObject* shortcutKeys; idSoundWorld* soundWorld; const idMaterial* atlasMaterial; idBlockAlloc< idSWFSpriteInstance, 16 > spriteInstanceAllocator; idBlockAlloc< idSWFTextInstance, 16 > textInstanceAllocator; #define SWF_NATIVE_FUNCTION_SWF_DECLARE( x ) \ class idSWFScriptFunction_##x : public idSWFScriptFunction_Nested< idSWF > { \ public: \ idSWFScriptVar Call( idSWFScriptObject * thisObject, const idSWFParmList & parms ); \ } scriptFunction_##x; SWF_NATIVE_FUNCTION_SWF_DECLARE( shortcutKeys_clear ); SWF_NATIVE_FUNCTION_SWF_DECLARE( deactivate ); SWF_NATIVE_FUNCTION_SWF_DECLARE( inhibitControl ); SWF_NATIVE_FUNCTION_SWF_DECLARE( useInhibit ); SWF_NATIVE_FUNCTION_SWF_DECLARE( precacheSound ); SWF_NATIVE_FUNCTION_SWF_DECLARE( playSound ); SWF_NATIVE_FUNCTION_SWF_DECLARE( stopSounds ); SWF_NATIVE_FUNCTION_SWF_DECLARE( getPlatform ); SWF_NATIVE_FUNCTION_SWF_DECLARE( getTruePlatform ); SWF_NATIVE_FUNCTION_SWF_DECLARE( getLocalString ); SWF_NATIVE_FUNCTION_SWF_DECLARE( swapPS3Buttons ); SWF_NATIVE_FUNCTION_SWF_DECLARE( getCVarInteger ); SWF_NATIVE_FUNCTION_SWF_DECLARE( setCVarInteger ); SWF_NATIVE_FUNCTION_SWF_DECLARE( strReplace ); SWF_NATIVE_FUNCTION_SWF_DECLARE( acos ); SWF_NATIVE_FUNCTION_SWF_DECLARE( cos ); SWF_NATIVE_FUNCTION_SWF_DECLARE( sin ); SWF_NATIVE_FUNCTION_SWF_DECLARE( round ); SWF_NATIVE_FUNCTION_SWF_DECLARE( pow ); SWF_NATIVE_FUNCTION_SWF_DECLARE( sqrt ); SWF_NATIVE_FUNCTION_SWF_DECLARE( abs ); SWF_NATIVE_FUNCTION_SWF_DECLARE( rand ); SWF_NATIVE_FUNCTION_SWF_DECLARE( floor ); SWF_NATIVE_FUNCTION_SWF_DECLARE( ceil ); SWF_NATIVE_FUNCTION_SWF_DECLARE( toUpper ); SWF_NATIVE_VAR_DECLARE_NESTED_READONLY( platform, idSWFScriptFunction_getPlatform, Call( object, idSWFParmList() ) ); SWF_NATIVE_VAR_DECLARE_NESTED( blackbars, idSWF ); SWF_NATIVE_VAR_DECLARE_NESTED( crop, idSWF ); class idSWFScriptFunction_Object : public idSWFScriptFunction { public: idSWFScriptVar Call( idSWFScriptObject* thisObject, const idSWFParmList& parms ) { return idSWFScriptVar(); } void AddRef() { } void Release() { } idSWFScriptObject* GetPrototype() { return &object; } void SetPrototype( idSWFScriptObject* _object ) { assert( false ); } idSWFScriptObject object; } scriptFunction_Object; idList< idSWFDictionaryEntry, TAG_SWF > dictionary; struct keyButtonImages_t { keyButtonImages_t() { key = ""; xbImage = ""; psImage = ""; width = 0; height = 0; baseline = 0; } keyButtonImages_t( const char* _key, const char* _xbImage, const char* _psImage, int w, int h, int _baseline ) { key = _key; xbImage = _xbImage; psImage = _psImage; width = w; height = h; baseline = _baseline; } const char* key; const char* xbImage; const char* psImage; int width; int height; int baseline; }; idList< keyButtonImages_t, TAG_SWF > tooltipButtonImage; struct tooltipIcon_t { tooltipIcon_t() { startIndex = -1; endIndex = -1; material = NULL; imageWidth = 0; imageHeight = 0; baseline = 0; }; int startIndex; int endIndex; const idMaterial* material; short imageWidth; short imageHeight; int baseline; }; idList< tooltipIcon_t, TAG_SWF > tooltipIconList; const idMaterial* guiSolid; const idMaterial* guiCursor_arrow; const idMaterial* guiCursor_hand; const idMaterial* white; private: friend class idSWFSprite; friend class idSWFSpriteInstance; bool LoadSWF( const char* fullpath ); bool LoadBinary( const char* bfilename, ID_TIME_T sourceTime ); void WriteBinary( const char* bfilename ); void FileAttributes( idSWFBitStream& bitstream ); void Metadata( idSWFBitStream& bitstream ); void SetBackgroundColor( idSWFBitStream& bitstream ); //---------------------------------- // SWF_Shapes.cpp //---------------------------------- void DefineShape( idSWFBitStream& bitstream ); void DefineShape2( idSWFBitStream& bitstream ); void DefineShape3( idSWFBitStream& bitstream ); void DefineShape4( idSWFBitStream& bitstream ); void DefineMorphShape( idSWFBitStream& bitstream ); //---------------------------------- // SWF_Sprites.cpp //---------------------------------- void DefineSprite( idSWFBitStream& bitstream ); //---------------------------------- // SWF_Sounds.cpp //---------------------------------- void DefineSound( idSWFBitStream& bitstream ); //---------------------------------- // SWF_Render.cpp //---------------------------------- void DrawStretchPic( float x, float y, float w, float h, float s1, float t1, float s2, float t2, const idMaterial* material ); void DrawStretchPic( const idVec4& topLeft, const idVec4& topRight, const idVec4& bottomRight, const idVec4& bottomLeft, const idMaterial* material ); void RenderSprite( idRenderSystem* gui, idSWFSpriteInstance* sprite, const swfRenderState_t& renderState, int time, bool isSplitscreen = false ); void RenderMask( idRenderSystem* gui, const swfDisplayEntry_t* mask, const swfRenderState_t& renderState, const int stencilMode ); void RenderShape( idRenderSystem* gui, const idSWFShape* shape, const swfRenderState_t& renderState ); void RenderMorphShape( idRenderSystem* gui, const idSWFShape* shape, const swfRenderState_t& renderState ); void DrawEditCursor( idRenderSystem* gui, float x, float y, float w, float h, const swfMatrix_t& matrix ); void DrawLine( idRenderSystem* gui, const idVec2& p1, const idVec2& p2, float width, const swfMatrix_t& matrix ); void RenderEditText( idRenderSystem* gui, idSWFTextInstance* textInstance, const swfRenderState_t& renderState, int time, bool isSplitscreen = false ); uint64 GLStateForRenderState( const swfRenderState_t& renderState ); void FindTooltipIcons( idStr* text ); //---------------------------------- // SWF_Image.cpp //---------------------------------- class idDecompressJPEG { public: idDecompressJPEG(); ~idDecompressJPEG(); byte* Load( const byte* input, int inputSize, int& width, int& height ); private: void* vinfo; }; idDecompressJPEG jpeg; void LoadImage( int characterID, const byte* imageData, int width, int height ); void JPEGTables( idSWFBitStream& bitstream ); void DefineBits( idSWFBitStream& bitstream ); void DefineBitsJPEG2( idSWFBitStream& bitstream ); void DefineBitsJPEG3( idSWFBitStream& bitstream ); void DefineBitsLossless( idSWFBitStream& bitstream ); void DefineBitsLossless2( idSWFBitStream& bitstream ); // per-swf image atlas struct imageToPack_t { int characterID; idVec2i trueSize; // in texels byte* imageData; // trueSize.x * trueSize.y * 4 idVec2i allocSize; // in DXT tiles, includes a border texel and rounding up to DXT blocks }; class idSortBlocks : public idSort_Quick< imageToPack_t, idSortBlocks > { public: int Compare( const imageToPack_t& a, const imageToPack_t& b ) const { return ( b.allocSize.x * b.allocSize.y ) - ( a.allocSize.x * a.allocSize.y ); } }; idList packImages; // only used during creation void WriteSwfImageAtlas( const char* filename ); //---------------------------------- // SWF_Text.cpp //---------------------------------- void DefineFont2( idSWFBitStream& bitstream ); void DefineFont3( idSWFBitStream& bitstream ); void DefineTextX( idSWFBitStream& bitstream, bool rgba ); void DefineText( idSWFBitStream& bitstream ); void DefineText2( idSWFBitStream& bitstream ); void DefineEditText( idSWFBitStream& bitstream ); //---------------------------------- // SWF_Zlib.cpp //---------------------------------- bool Inflate( const byte* input, int inputSize, byte* output, int outputSize ); public: //---------------------------------- // SWF_Names.cpp //---------------------------------- static const char* GetTagName( swfTag_t tag ); static const char* GetActionName( swfAction_t action ); }; #endif // !__SWF_H__