source-engine/vgui2/vgui_controls/subrectimage.cpp

213 lines
5.4 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= 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;
}