You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
5.4 KiB
212 lines
5.4 KiB
//========= 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; |
|
} |
|
|
|
|