mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 22:27:05 +00:00
213 lines
5.4 KiB
C++
213 lines
5.4 KiB
C++
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
//=============================================================================
|
||
|
|
||
|
#include "vgui_controls/subrectimage.h"
|
||
|
#include "tier0/dbg.h"
|
||
|
#include "vgui/ISurface.h"
|
||
|
#include "vgui_controls/Controls.h"
|
||
|
|
||
|
// NOTE: This has to be the last file included!
|
||
|
#include "tier0/memdbgon.h"
|
||
|
|
||
|
|
||
|
using namespace vgui;
|
||
|
|
||
|
// Officially the invalid texture ID is zero, but -1 is used in many
|
||
|
// places, and changing it carries some risk. Adding a named constant
|
||
|
// for this file avoids warnings and makes future changes easier.
|
||
|
const HTexture SUBRECT_INVALID_TEXTURE = (HTexture)-1;
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Constructor, destructor
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CSubRectImage::CSubRectImage( const char *filename, bool hardwareFiltered, int subx, int suby, int subw, int subh )
|
||
|
{
|
||
|
SetSize( subw, subh );
|
||
|
sub[ 0 ] = subx;
|
||
|
sub[ 1 ] = suby;
|
||
|
sub[ 2 ] = subw;
|
||
|
sub[ 3 ] = subh;
|
||
|
|
||
|
_filtered = hardwareFiltered;
|
||
|
// HACKHACK - force VGUI materials to be in the vgui/ directory
|
||
|
// This needs to be revisited once GoldSRC is grandfathered off.
|
||
|
//!! need to make this work with goldsrc
|
||
|
int size = strlen(filename) + 1 + strlen("vgui/");
|
||
|
_filename = (char *)malloc( size );
|
||
|
Assert( _filename );
|
||
|
|
||
|
Q_snprintf( _filename, size, "vgui/%s", filename );
|
||
|
|
||
|
_id = SUBRECT_INVALID_TEXTURE;
|
||
|
_uploaded = false;
|
||
|
_color = Color(255, 255, 255, 255);
|
||
|
_pos[0] = _pos[1] = 0;
|
||
|
_valid = true;
|
||
|
_wide = subw;
|
||
|
_tall = subh;
|
||
|
ForceUpload();
|
||
|
}
|
||
|
|
||
|
CSubRectImage::~CSubRectImage()
|
||
|
{
|
||
|
if ( vgui::surface() && _id != SUBRECT_INVALID_TEXTURE )
|
||
|
{
|
||
|
vgui::surface()->DestroyTextureID( _id );
|
||
|
_id = SUBRECT_INVALID_TEXTURE;
|
||
|
}
|
||
|
|
||
|
if ( _filename )
|
||
|
{
|
||
|
free( _filename );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: data accessor
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CSubRectImage::GetSize(int &wide, int &tall)
|
||
|
{
|
||
|
wide = _wide;
|
||
|
tall = _tall;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: size of the bitmap
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CSubRectImage::GetContentSize(int &wide, int &tall)
|
||
|
{
|
||
|
wide = 0;
|
||
|
tall = 0;
|
||
|
|
||
|
if (!_valid)
|
||
|
return;
|
||
|
|
||
|
if ( _id != SUBRECT_INVALID_TEXTURE )
|
||
|
{
|
||
|
surface()->DrawGetTextureSize(_id, wide, tall);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: ignored
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CSubRectImage::SetSize(int x, int y)
|
||
|
{
|
||
|
_wide = x;
|
||
|
_tall = y;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: data accessor
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CSubRectImage::SetPos(int x, int y)
|
||
|
{
|
||
|
_pos[0] = x;
|
||
|
_pos[1] = y;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: data accessor
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CSubRectImage::SetColor(Color col)
|
||
|
{
|
||
|
_color = col;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: returns the file name of the bitmap
|
||
|
//-----------------------------------------------------------------------------
|
||
|
const char *CSubRectImage::GetName()
|
||
|
{
|
||
|
return _filename;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Renders the loaded image, uploading it if necessary
|
||
|
// Assumes a valid image is always returned from uploading
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CSubRectImage::Paint()
|
||
|
{
|
||
|
if ( !_valid )
|
||
|
return;
|
||
|
|
||
|
// if we don't have an _id then lets make one
|
||
|
if ( _id == SUBRECT_INVALID_TEXTURE )
|
||
|
{
|
||
|
_id = surface()->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
|
||
|
surface()->DrawSetColor( _color[0], _color[1], _color[2], _color[3] );
|
||
|
surface()->DrawSetTexture( _id );
|
||
|
|
||
|
if ( _wide == 0 || _tall == 0 )
|
||
|
return;
|
||
|
|
||
|
int cw, ch;
|
||
|
GetContentSize( cw, ch );
|
||
|
if ( cw == 0 || ch == 0 )
|
||
|
return;
|
||
|
|
||
|
float s[ 2 ];
|
||
|
float t[ 2 ];
|
||
|
|
||
|
s[ 0 ] = (float)sub[ 0 ] / (float)cw;
|
||
|
s[ 1 ] = (float)(sub[ 0 ]+sub[ 2 ]) / (float)cw;
|
||
|
t[ 0 ] = (float)sub[ 1 ] / (float)ch;
|
||
|
t[ 1 ] = (float)(sub[ 1 ]+sub[ 3 ]) / (float)ch;
|
||
|
surface()->DrawTexturedSubRect(
|
||
|
_pos[0],
|
||
|
_pos[1],
|
||
|
_pos[0] + _wide,
|
||
|
_pos[1] + _tall,
|
||
|
s[ 0 ],
|
||
|
t[ 0 ],
|
||
|
s[ 1 ],
|
||
|
t[ 1 ] );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: ensures the bitmap has been uploaded
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CSubRectImage::ForceUpload()
|
||
|
{
|
||
|
if ( !_valid || _uploaded )
|
||
|
return;
|
||
|
|
||
|
if ( _id == SUBRECT_INVALID_TEXTURE )
|
||
|
{
|
||
|
_id = surface()->CreateNewTextureID( false );
|
||
|
}
|
||
|
|
||
|
surface()->DrawSetTextureFile( _id, _filename, _filtered, false );
|
||
|
|
||
|
_uploaded = true;
|
||
|
|
||
|
_valid = surface()->IsTextureIDValid( _id );
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: data accessor
|
||
|
//-----------------------------------------------------------------------------
|
||
|
HTexture CSubRectImage::GetID()
|
||
|
{
|
||
|
return _id;
|
||
|
}
|
||
|
|
||
|
bool CSubRectImage::IsValid()
|
||
|
{
|
||
|
return _valid;
|
||
|
}
|
||
|
|