summaryrefslogtreecommitdiff
path: root/vguimatsurface/memorybitmap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vguimatsurface/memorybitmap.cpp')
-rw-r--r--vguimatsurface/memorybitmap.cpp181
1 files changed, 181 insertions, 0 deletions
diff --git a/vguimatsurface/memorybitmap.cpp b/vguimatsurface/memorybitmap.cpp
new file mode 100644
index 0000000..4cf6d36
--- /dev/null
+++ b/vguimatsurface/memorybitmap.cpp
@@ -0,0 +1,181 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include <vgui/ISurface.h>
+#include "memorybitmap.h"
+#include <string.h>
+#include <stdlib.h>
+#include "MatSystemSurface.h"
+#include "materialsystem/imaterialvar.h"
+#include "materialsystem/itexture.h"
+#include "bitmap/imageformat.h"
+#include "vtf/vtf.h"
+#include "KeyValues.h"
+#include "TextureDictionary.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+extern CMatSystemSurface g_MatSystemSurface;
+
+using namespace vgui;
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor
+// Input : *filename - image file to load
+//-----------------------------------------------------------------------------
+MemoryBitmap::MemoryBitmap(unsigned char *texture,int wide, int tall)
+{
+ _texture=texture;
+ _uploaded = false;
+ _color = Color(255, 255, 255, 255);
+ _pos[0] = _pos[1] = 0;
+ _valid = true;
+ _w = wide;
+ _h = tall;
+ m_iTextureID = -1;
+
+ ForceUpload(texture,wide,tall);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Destructor
+//-----------------------------------------------------------------------------
+MemoryBitmap::~MemoryBitmap()
+{
+ // Free the old texture ID.
+ if ( m_iTextureID != -1 )
+ {
+ TextureDictionary()->DestroyTexture( m_iTextureID );
+ m_iTextureID = -1;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: data accessor
+//-----------------------------------------------------------------------------
+void MemoryBitmap::GetSize(int &wide, int &tall)
+{
+ wide = 0;
+ tall = 0;
+
+ if (!_valid)
+ return;
+
+ g_MatSystemSurface.DrawGetTextureSize(m_iTextureID, wide, tall);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: size of the bitmap
+//-----------------------------------------------------------------------------
+void MemoryBitmap::GetContentSize(int &wide, int &tall)
+{
+ GetSize(wide, tall);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: ignored
+//-----------------------------------------------------------------------------
+void MemoryBitmap::SetSize(int x, int y)
+{
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: data accessor
+//-----------------------------------------------------------------------------
+void MemoryBitmap::SetPos(int x, int y)
+{
+ _pos[0] = x;
+ _pos[1] = y;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: data accessor
+//-----------------------------------------------------------------------------
+void MemoryBitmap::SetColor(Color col)
+{
+ _color = col;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: returns the file name of the bitmap
+//-----------------------------------------------------------------------------
+const char *MemoryBitmap::GetName()
+{
+ return "MemoryBitmap";
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Renders the loaded image, uploading it if necessary
+// Assumes a valid image is always returned from uploading
+//-----------------------------------------------------------------------------
+void MemoryBitmap::Paint()
+{
+ if (!_valid)
+ return;
+
+ // if we have not uploaded yet, lets go ahead and do so
+ if (!_uploaded)
+ {
+ ForceUpload(_texture,_w,_h);
+ }
+
+ //set the texture current, set the color, and draw the biatch
+ g_MatSystemSurface.DrawSetTexture(m_iTextureID);
+ g_MatSystemSurface.DrawSetColor(_color[0], _color[1], _color[2], _color[3]);
+
+ int wide, tall;
+ GetSize(wide, tall);
+ g_MatSystemSurface.DrawTexturedRect( _pos[0], _pos[1], _pos[0] + wide, _pos[1] + tall);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: ensures the bitmap has been uploaded
+//-----------------------------------------------------------------------------
+void MemoryBitmap::ForceUpload(unsigned char *texture,int wide, int tall)
+{
+ _texture=texture;
+ bool sizechanged = ( _w != wide || _h != tall );
+ _w = wide;
+ _h = tall;
+
+ if (!_valid)
+ return;
+
+ if(_w==0 || _h==0)
+ return;
+
+ // Not our first time through and the size changed, destroy and recreate texture id...
+ if ( m_iTextureID != -1 && sizechanged )
+ {
+ TextureDictionary()->DestroyTexture( m_iTextureID );
+ m_iTextureID = -1;
+ }
+
+ if ( m_iTextureID == -1 )
+ {
+ m_iTextureID = g_MatSystemSurface.CreateNewTextureID( true );
+ }
+
+ g_MatSystemSurface.DrawSetTextureRGBA( m_iTextureID, texture, wide, tall, true, true );
+
+ _uploaded = true;
+ _valid = g_MatSystemSurface.IsTextureIDValid(m_iTextureID);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: data accessor
+//-----------------------------------------------------------------------------
+HTexture MemoryBitmap::GetID()
+{
+ return m_iTextureID;
+}
+
+