diff options
| author | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
|---|---|---|
| committer | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
| commit | 39ed87570bdb2f86969d4be821c94b722dc71179 (patch) | |
| tree | abc53757f75f40c80278e87650ea92808274aa59 /mp/src/vgui2/vgui_controls/subrectimage.cpp | |
| download | source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip | |
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/vgui2/vgui_controls/subrectimage.cpp')
| -rw-r--r-- | mp/src/vgui2/vgui_controls/subrectimage.cpp | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/mp/src/vgui2/vgui_controls/subrectimage.cpp b/mp/src/vgui2/vgui_controls/subrectimage.cpp new file mode 100644 index 00000000..e7405049 --- /dev/null +++ b/mp/src/vgui2/vgui_controls/subrectimage.cpp @@ -0,0 +1,212 @@ +//========= 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;
+}
+
|