|
|
//========= 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; }
|