diff options
Diffstat (limited to 'vgui2/src/Bitmap.cpp')
| -rw-r--r-- | vgui2/src/Bitmap.cpp | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/vgui2/src/Bitmap.cpp b/vgui2/src/Bitmap.cpp new file mode 100644 index 0000000..4d4a71e --- /dev/null +++ b/vgui2/src/Bitmap.cpp @@ -0,0 +1,272 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <vgui/ISurface.h> +#include "bitmap.h" +#include "vgui_internal.h" +#include "filesystem.h" +#include "tier1/utlbuffer.h" +#include <tier0/dbg.h> + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +using namespace vgui; + +//----------------------------------------------------------------------------- +// Purpose: Constructor +// Input : *filename - image file to load +//----------------------------------------------------------------------------- +Bitmap::Bitmap(const char *filename, bool hardwareFiltered) +{ + _filtered = hardwareFiltered; + + int size = strlen(filename) + 1; + _filename = (char *)malloc( size ); + Assert( _filename ); + + Q_snprintf( _filename, size, "%s", filename ); + + _bProcedural = false; + + if ( Q_stristr( filename, ".pic" ) ) + { + _bProcedural = true; + } + + _id = 0; + _uploaded = false; + _color = Color(255, 255, 255, 255); + _pos[0] = _pos[1] = 0; + _valid = true; + _wide = 0; + _tall = 0; + nFrameCache = 0; + _rotation = 0; + + ForceUpload(); +} + +//----------------------------------------------------------------------------- +// Purpose: Destructor +//----------------------------------------------------------------------------- +Bitmap::~Bitmap() +{ + Evict(); + + if ( _filename ) + { + free( _filename ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: data accessor +//----------------------------------------------------------------------------- +void Bitmap::GetSize(int &wide, int &tall) +{ + wide = 0; + tall = 0; + + if ( !_valid ) + return; + + // if a size has not been set, get it from the texture + if ( 0 == _wide && 0 ==_tall ) + { + g_pSurface->DrawGetTextureSize(_id, _wide, _tall); + + } + wide = _wide; + tall = _tall; +} + +//----------------------------------------------------------------------------- +// Purpose: size of the bitmap +//----------------------------------------------------------------------------- +void Bitmap::GetContentSize(int &wide, int &tall) +{ + GetSize(wide, tall); +} + +//----------------------------------------------------------------------------- +// Purpose: ignored +//----------------------------------------------------------------------------- +void Bitmap::SetSize(int x, int y) +{ +// AssertMsg( _filtered, "Bitmap::SetSize called on non-hardware filtered texture. Bitmap can't be scaled; you don't want to be calling this." ); + _wide = x; + _tall = y; +} + +//----------------------------------------------------------------------------- +// Purpose: data accessor +//----------------------------------------------------------------------------- +void Bitmap::SetPos(int x, int y) +{ + _pos[0] = x; + _pos[1] = y; +} + +//----------------------------------------------------------------------------- +// Purpose: data accessor +//----------------------------------------------------------------------------- +void Bitmap::SetColor(Color col) +{ + _color = col; +} + +//----------------------------------------------------------------------------- +// Purpose: returns the file name of the bitmap +//----------------------------------------------------------------------------- +const char *Bitmap::GetName() +{ + return _filename; +} + +//----------------------------------------------------------------------------- +// Purpose: Renders the loaded image, uploading it if necessary +// Assumes a valid image is always returned from uploading +//----------------------------------------------------------------------------- +void Bitmap::Paint() +{ + if ( !_valid ) + return; + + // if we don't have an _id then lets make one + if ( !_id ) + { + _id = g_pSurface->CreateNewTextureID(); + } + + // if we have not uploaded yet, lets go ahead and do so + if ( !_uploaded ) + { + ForceUpload(); + } + + // set the texture current, set the color, and draw the biatch + g_pSurface->DrawSetColor( _color[0], _color[1], _color[2], _color[3] ); + g_pSurface->DrawSetTexture( _id ); + + if ( _wide == 0 ) + { + GetSize( _wide, _tall); + } + + if ( _rotation == ROTATED_UNROTATED ) + { + g_pSurface->DrawTexturedRect(_pos[0], _pos[1], _pos[0] + _wide, _pos[1] + _tall); + } + else + { + vgui::Vertex_t verts[4]; + verts[0].m_Position.Init( 0, 0 ); + verts[1].m_Position.Init( _wide, 0 ); + verts[2].m_Position.Init( _wide, _tall ); + verts[3].m_Position.Init( 0, _tall ); + + switch ( _rotation ) + { + case ROTATED_CLOCKWISE_90: + verts[0].m_TexCoord.Init( 1, 0 ); + verts[1].m_TexCoord.Init( 1, 1 ); + verts[2].m_TexCoord.Init( 0, 1 ); + verts[3].m_TexCoord.Init( 0, 0 ); + break; + + case ROTATED_ANTICLOCKWISE_90: + verts[0].m_TexCoord.Init( 0, 1 ); + verts[1].m_TexCoord.Init( 0, 0 ); + verts[2].m_TexCoord.Init( 1, 0 ); + verts[3].m_TexCoord.Init( 1, 1 ); + break; + + case ROTATED_FLIPPED: + verts[0].m_TexCoord.Init( 1, 1 ); + verts[1].m_TexCoord.Init( 0, 1 ); + verts[2].m_TexCoord.Init( 0, 0 ); + verts[3].m_TexCoord.Init( 1, 0 ); + break; + + default: + case ROTATED_UNROTATED: + break; + } + + g_pSurface->DrawTexturedPolygon( 4, verts ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: ensures the bitmap has been uploaded +//----------------------------------------------------------------------------- +void Bitmap::ForceUpload() +{ + if ( !_valid || _uploaded ) + return; + + if ( !_id ) + { + _id = g_pSurface->CreateNewTextureID( _bProcedural ); + } + + if ( !_bProcedural ) + { + g_pSurface->DrawSetTextureFile( _id, _filename, _filtered, false ); + } + + _uploaded = true; + _valid = g_pSurface->IsTextureIDValid( _id ); +} + +//----------------------------------------------------------------------------- +// Purpose: data accessor +//----------------------------------------------------------------------------- +HTexture Bitmap::GetID() +{ + return _id; +} + +bool Bitmap::Evict() +{ + if ( _id != 0 ) + { + g_pSurface->DestroyTextureID( _id ); + // purposely not resetting _valid to match existing silly logic + // either a Paint() or ForceUpload() will re-establish + _id = 0; + _uploaded = false; + return true; + } + return false; +} + +int Bitmap::GetNumFrames() +{ + if ( !_valid ) + return 0; + + return g_pSurface->GetTextureNumFrames( _id ); +} + +void Bitmap::SetFrame( int nFrame ) +{ + if ( !_valid ) + return; + + // the frame cache is critical to cheapen the cost of this call + g_pSurface->DrawSetTextureFrame( _id, nFrame, &nFrameCache ); +} + + + + + |