diff options
Diffstat (limited to 'public/panorama/layout/uilength.h')
| -rw-r--r-- | public/panorama/layout/uilength.h | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/public/panorama/layout/uilength.h b/public/panorama/layout/uilength.h new file mode 100644 index 0000000..d6dad83 --- /dev/null +++ b/public/panorama/layout/uilength.h @@ -0,0 +1,147 @@ +//=========== Copyright Valve Corporation, All rights reserved. ===============// +// +// Purpose: +//=============================================================================// + +#ifndef UILENGTH_H +#define UILENGTH_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "float.h" +#include "tier0/dbg.h" +#include "tier1/utlvector.h" +#include "mathlib/mathlib.h" +#include "../panorama.h" + +namespace panorama +{ + +//----------------------------------------------------------------------------- +// Purpose: defines +//----------------------------------------------------------------------------- +const float k_flFloatAuto = FLT_MAX; +const float k_flFloatNotSet = FLT_MIN; + +// Sometimes we want to say "infinite width/height", but we can't use FLT_MAX as it's "auto" +const float k_flMaxWidthOrHeight = 512000000.0f; + +//----------------------------------------------------------------------------- +// Purpose: Represents possible length values +//----------------------------------------------------------------------------- +class CUILength +{ +public: + enum EUILengthTypes + { + k_EUILengthUnset, + k_EUILengthLength, + k_EUILengthPercent, + k_EUILengthFitChildren, + k_EUILengthFillParentFlow, + k_EUILengthHeightPercentage, + k_EUILengthWidthPercentage, + }; + + CUILength() : m_flValue( k_flFloatNotSet ), m_eType( k_EUILengthUnset ) {} + CUILength( float flValue, EUILengthTypes eType ) : m_flValue( flValue ), m_eType( eType ) {} + + bool IsSet() const { return (m_eType != k_EUILengthUnset); } + bool IsLength() const { return (m_eType == k_EUILengthLength); } + bool IsPercent() const { return (m_eType == k_EUILengthPercent); } + bool IsFitChildren() const { return (m_eType == k_EUILengthFitChildren); } + bool IsFillParentFlow() const { return (m_eType == k_EUILengthFillParentFlow); } + bool IsHeightPercentage() const { return (m_eType == k_EUILengthHeightPercentage); } + bool IsWidthPercentage() const { return (m_eType == k_EUILengthWidthPercentage); } + + float GetValue() const { return m_flValue; } + CUILength::EUILengthTypes GetType() const { return m_eType; } + + void SetFitChildren() { Set( k_flFloatAuto, k_EUILengthFitChildren ); } + void SetLength( float flValue ) { Set( flValue, k_EUILengthLength ); } + void SetPercent( float flValue ) { Set( flValue, k_EUILengthPercent ); } + void SetFillParentFlow( float flWeight ) { Set( flWeight, k_EUILengthFillParentFlow ); } + void SetParentFlow( float flValue ) { Set( flValue, k_EUILengthFillParentFlow ); } + void SetHeightPercentage( float flValue ) { Set( flValue, k_EUILengthHeightPercentage ); } + void SetWidthPercentage( float flValue ) { Set( flValue, k_EUILengthWidthPercentage ); } + + void Set( float flValue, EUILengthTypes eType ) + { + m_flValue = flValue; + m_eType = eType; + } + + void ConvertToLength( float flTotalLength ) + { + if ( m_eType == k_EUILengthPercent ) + Set( GetValueAsLength( flTotalLength ), k_EUILengthLength ); + else + Assert( m_eType == k_EUILengthLength || m_eType == k_EUILengthUnset ); + } + + void ConvertToPercent( float flTotalLength ) + { + if ( m_eType == k_EUILengthLength ) + Set( m_flValue / flTotalLength * 100.0, k_EUILengthPercent ); + else + Assert( m_eType == k_EUILengthPercent || m_eType == k_EUILengthUnset ); + } + + float GetValueAsLength( float flTotalLength ) const + { + float flRet = m_flValue; + if ( m_eType == k_EUILengthPercent ) + flRet = m_flValue * flTotalLength / 100.0; + else + Assert( m_eType == k_EUILengthLength ); + + return flRet; + } + + void ScaleLengthValue( float flScaleFactor ) + { + if ( m_eType == k_EUILengthLength && m_flValue != k_flFloatAuto && m_flValue != k_flFloatNotSet ) + { + // Don't make width/height values of 1.0 shrink, as things like 1 px horizontal rules will go invisible! Kind of hacky, + // but this mostly works without issue as we have so few things < 1px. + if ( fabsf( 1.0f - fabsf( m_flValue ) ) < 0.1f && flScaleFactor < 1.0f ) + { + // Don't need to adjust + } + else + { + // If the original value was pixel aligned, try to keep that. This is important so text doesn't accumulate error layers down + // from us and thus get blurry. Can't apply this rule to all values though as things like a shadow offset of 5.5 can be common + // and the half pixel can be important for the shadow to balance on both sides of the layer. + if ( fabsf( m_flValue - (float)RoundFloatToInt( m_flValue ) ) < 0.001f ) + m_flValue = (float)RoundFloatToInt( m_flValue * flScaleFactor ); + else + m_flValue = m_flValue * flScaleFactor; + } + } + } + + bool operator==( const CUILength &rhs ) const + { + return (m_flValue == rhs.m_flValue && m_eType == rhs.m_eType); + } + + bool operator!=( const CUILength &rhs ) const + { + return !(*this == rhs); + } + + +private: + float m_flValue; + EUILengthTypes m_eType; +}; + +// Helper for doing lerp on ui length values, converting % and such +CUILength LerpUILength( float flProgress, CUILength start, CUILength end, float flPixelSize ); + +} // namespace panorama + +#endif //UILENGTH_H
\ No newline at end of file |