diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /public/panorama/data/imageloader.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'public/panorama/data/imageloader.h')
| -rw-r--r-- | public/panorama/data/imageloader.h | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/public/panorama/data/imageloader.h b/public/panorama/data/imageloader.h new file mode 100644 index 0000000..891dd32 --- /dev/null +++ b/public/panorama/data/imageloader.h @@ -0,0 +1,229 @@ +//=========== Copyright Valve Corporation, All rights reserved. ===============// +// +// Purpose: +//=============================================================================// + +#ifndef IMAGESOURCE_H +#define IMAGESOURCE_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "panorama/data/iimagesource.h" +#include "panorama/controls/panelptr.h" +#include "tier1/utlbuffer.h" +#include "tier1/fileio.h" +#include "tier1/utlmap.h" +#include "refcount.h" +#include "../../panorama/uifileresource.h" +#include "tier1/utldelegate.h" + +namespace panorama +{ + +// Helper to determine byte size of a pixel in a given format +int GetFormatPixelBytes( EImageFormat format ); + +class CMovie; +class IUIRenderEngine; +class IUITexture; +class CImageData; + + +// Helper for converting rgba8 to a8 throwing out rgb channels +void ConvertRGBA8ToA8( CUtlBuffer &bufIn, CUtlBuffer &bufOut, uint32 unWide, uint32 unTall ); + +class CImageProxySource; +class CImageLoaderTask; + +#if defined( SOURCE2_PANORAMA ) +class CLoadFromVTexTask; +#endif + +enum ESourceFormats +{ + k_ESourceFormatUnknown, + k_ESourceFormatTGA, + k_ESourceFormatPNG, + k_ESourceFormatJPG, + k_ESourceFormatRawRGBA, + k_ESourceFormatGIF, + k_ESourceFormatVTEX +}; + +class CImageData; +typedef void (ImageDecodeCallback_t)( bool bSuccess, CImageData *pNewImage, CUtlBuffer *pBufDecoded ); + +class CImageDecodeWorkItem +{ +public: + CImageDecodeWorkItem( IUIRenderEngine *pRenderEngine, CUtlBuffer &bufDataInMayModify, const char *pchFilePath, int nWide, int nTall, int nResizeWidth, int nResizeHeight, + EImageFormat formatOut, bool bAllowAnimation, CUtlDelegate< ImageDecodeCallback_t > del ); + ~CImageDecodeWorkItem(); + + void RunWorkItem(); + void DispatchResult(); + +private: + + bool m_bSuccess; + IUIRenderEngine *m_pSurface; + CUtlBuffer *m_pBuffer; + CUtlString m_strFilePath; + int m_nWide; + int m_nTall; + int m_nResizeWidth; + int m_nResizeHeight; + EImageFormat m_eFormat; + bool m_bAllowAnimation; + CImageData *m_pNewImage; + + CUtlDelegate< ImageDecodeCallback_t > m_Del; +}; + +class CImageDecodeWorkThreadPool; +class CImageDecodeThread : public CThread +{ +public: + CImageDecodeThread( CImageDecodeWorkThreadPool *pParent ) + { + m_bExit = false; + m_pParent = pParent; + } + + ~CImageDecodeThread() + { + + } + + void Stop() { m_bExit = true; } + + virtual int Run() OVERRIDE; + +private: + volatile bool m_bExit; + CImageDecodeWorkThreadPool *m_pParent; +}; + +class CImageDecodeWorkThreadPool +{ +public: + CImageDecodeWorkThreadPool(); + ~CImageDecodeWorkThreadPool(); + + // Run frame on main thread + void RunFrame(); + + void AddWorkItem( CImageDecodeWorkItem *pWorkItem ); + +private: + + friend class CImageDecodeThread; + CImageDecodeThread * m_pWorkThreads[1]; + + CThreadMutex m_AsyncIoLock; + CThreadEvent m_ThreadEvent; + CUtlLinkedList< CImageDecodeWorkItem *, int > m_llAsyncIORequests; + CUtlLinkedList< CImageDecodeWorkItem *, int > m_llAsyncIOResults; +}; + +// +// A container of images we have loaded +// +class CImageResourceManager : public IUIImageManager +{ +public: + CImageResourceManager( IUIRenderEngine *pSurface ); + ~CImageResourceManager(); + virtual void Shutdown(); + + virtual IImageSource *LoadImageFromURL( const IUIPanel *pPanel, const char *pchResourceURLDefault, const char *pchResourceURL, bool bPrioritizeLoad, EImageFormat imgFormatOut, int32 nResizeWidth = panorama::k_ResizeNone, int32 nResizeHeight = panorama::k_ResizeNone, bool bAllowAnimation = true ); + virtual IImageSource *LoadImageFileFromMemory( const IUIPanel *pPanel, const char *pchResourceURLDefault, const CUtlBuffer &bufFile, int nResizeWidth = panorama::k_ResizeNone, int nResizeHeight = panorama::k_ResizeNone, bool bAllowAnimation = true ); + virtual IImageSource *LoadImageFromMemory( const IUIPanel *pPanel, const char *pchResourceURLDefault, const CUtlBuffer &bufRGBA, int nWide, int nTall, EImageFormat imgFormatIn = k_EImageFormatR8G8B8A8, int nResizeWidth = panorama::k_ResizeNone, int nResizeHeight = panorama::k_ResizeNone, bool bAllowAnimation = true ); + virtual CUtlString GetPchImageSourcePath( IImageSource *pImageSource ) OVERRIDE; + + virtual void ReloadChangedFile( const char *pchFile ) OVERRIDE; + virtual void ReloadChangedImage( IImageSource *pImageToReload ) OVERRIDE; + + bool OnImageUnreferenced( CImageProxySource *pImage ); + + void RunFrame(); + + void QueueImageDecodeWorkItem( CImageDecodeWorkItem *pWorkItem ); + +#ifdef DBGFLAG_VALIDATE + virtual void Validate( CValidator &validator, const tchar *pchName ); +#endif + +private: + IImageSource *LoadImageInternal( const IUIPanel *pPanel, CFileResource &fileResourceDefault, CFileResource &fileResource, bool bPrioritizeLoad, EImageFormat imgFormatOut, int32 nResizeWidth, int32 nResizeHeight, bool bAllowAnimation ); + CImageProxySource *GetDefaultImage( CFileResource &fileDefault, EImageFormat imgFormatOut, bool bAllowAnimation ); + + friend class CLoadFileURLTask; + friend class CLoadFileLocalTask; + friend class CImageLoaderTask; +#if defined( SOURCE2_PANORAMA ) + friend class CLoadFromVTexTask; +#endif + + // Internally adds image to our tracking maps + void AddImageToManager( CFileResource &resource, CImageProxySource *pImageProxy, int32 nResizeWidth, int32 nResizeHeight, bool bAllowAnimation ); + bool RemoveImageFromManager( IImageSource *pImage ); + + // Loads a resource, returns vector index + bool OnImageLoaded( CFileResource & resource, CImageData *pImage, int32 nResizeWidth, int32 nResizeHeight, bool bAllowAnimation ); + bool OnFailedImageLoad( CFileResource & resource, int32 nResizeWidth, int32 nResizeHeight, bool bAllowAnimation ); + void AddLoad( CFileResource &resource, EImageFormat eFormat, bool bPrioritizeLoad, int32 nResizeWidth, int32 nResizeHeight, bool bAllowAnimation ); + + // Synchronous load only used for initial global default image + bool LoadLocalFileSynchronous( CFileResource &resource, EImageFormat eFormat, bool bAllowAnimation ); + +#if defined( SOURCE2_PANORAMA ) + bool FixupFileResourceToCompiledImage( CFileResource &fileResource ); +#endif + + struct UrlImageKey_t + { + CFileResource fileResource; + int32 nTargetWidth; + int32 nTargetHeight; + bool bAllowAnimation; + + // Sort on size only + bool operator <( const UrlImageKey_t &l ) const + { + if ( nTargetWidth < l.nTargetWidth ) + return true; + else if ( nTargetWidth > l.nTargetWidth ) + return false; + + if ( nTargetHeight < l.nTargetHeight ) + return true; + else if ( nTargetHeight > l.nTargetHeight ) + return false; + + if ( bAllowAnimation && !l.bAllowAnimation ) + return true; + else if ( !bAllowAnimation && l.bAllowAnimation ) + return false; + + return fileResource < l.fileResource; + } + }; + CUtlMap< UrlImageKey_t, CImageProxySource *, int, CDefLess< UrlImageKey_t > > m_mapImagesByURL; + CUtlMap< IImageSource *, UrlImageKey_t, int, CDefLess< IImageSource *> > m_mapAllImages; + + CUtlVector< CImageLoaderTask * > m_vecLoaderTasksToStart; + CUtlRBTree< CImageLoaderTask *, int, CDefLess< CImageLoaderTask * > > m_treeLoadTasks; + + IUIRenderEngine *m_pSurface; + + CImageDecodeWorkThreadPool *m_pImageDecodePool; + + bool m_bInited; +}; + +} // namespace panorama + +#endif // IMAGESOURCE_H
\ No newline at end of file |