mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-08 17:59:37 +00:00
1
This commit is contained in:
@@ -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 );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user