source-engine/public/panorama/layout/backgroundimage.h

264 lines
7.4 KiB
C
Raw Permalink Normal View History

2020-04-22 16:56:21 +00:00
//=========== Copyright Valve Corporation, All rights reserved. ===============//
//
// Purpose:
//=============================================================================//
#ifndef BACKGROUNDIMAGE_H
#define BACKGROUNDIMAGE_H
#ifdef _WIN32
#pragma once
#endif
#include "csshelpers.h"
#include "../data/panoramavideoplayer.h"
#include "utlstring.h"
#include "uilength.h"
namespace panorama
{
class IImageSource;
class CMovie;
class CPanel2D;
//-----------------------------------------------------------------------------
// Purpose: Background position for background image
//-----------------------------------------------------------------------------
class CBackgroundPosition
{
public:
CBackgroundPosition();
~CBackgroundPosition() {}
EHorizontalAlignment GetHorizontalAlignment() const { return m_eHorizontalAlignment; }
CUILength GetHorizontalLength() const { return m_horizontal; }
EVerticalAlignment GetVeriticalAlignment() const { return m_eVerticalAlignment; }
CUILength GetVerticalLength() const { return m_vertical; }
bool IsHorizontalSet() const
{
return ( m_eHorizontalAlignment != k_EHorizontalAlignmentUnset && m_horizontal.IsSet() );
}
bool IsVerticalSet() const
{
return ( m_eVerticalAlignment != k_EVerticalAlignmentUnset && m_vertical.IsSet() );
}
bool IsSet() const
{
return ( IsHorizontalSet() && IsVerticalSet() );
}
void Set( EHorizontalAlignment eHorizontal, const CUILength &horizontal, EVerticalAlignment eVertical, const CUILength &vertical );
void ResolveDefaultValues();
void ToString( CFmtStr1024 *pfmtBuffer );
void ScaleLengthValues( float flScaleFactor )
{
m_horizontal.ScaleLengthValue( flScaleFactor );
m_vertical.ScaleLengthValue( flScaleFactor );
}
bool operator==( const CBackgroundPosition &rhs ) const
{
return ( m_eHorizontalAlignment == rhs.m_eHorizontalAlignment && m_horizontal == rhs.m_horizontal && m_eVerticalAlignment == rhs.m_eVerticalAlignment && m_vertical == rhs.m_vertical );
}
bool operator!=( const CBackgroundPosition &rhs ) const
{
return !( *this == rhs );
}
private:
EHorizontalAlignment m_eHorizontalAlignment;
CUILength m_horizontal;
EVerticalAlignment m_eVerticalAlignment;
CUILength m_vertical;
};
//-----------------------------------------------------------------------------
// Purpose: Background images have a repeat in the x & y directions
//-----------------------------------------------------------------------------
class CBackgroundRepeat
{
public:
CBackgroundRepeat() { Set( k_EBackgroundRepeatUnset, k_EBackgroundRepeatUnset ); }
~CBackgroundRepeat() {}
bool IsSet() const { return (m_eHorizontal != k_EBackgroundRepeatUnset && m_eVertical != k_EBackgroundRepeatUnset); }
void Set( EBackgroundRepeat eHorizontal, EBackgroundRepeat eVertical )
{
m_eHorizontal = eHorizontal;
m_eVertical = eVertical;
}
void ResolveDefaultValues()
{
if ( m_eHorizontal == k_EBackgroundRepeatUnset )
m_eHorizontal = k_EBackgroundRepeatRepeat;
if ( m_eVertical == k_EBackgroundRepeatUnset )
m_eVertical = k_EBackgroundRepeatRepeat;
}
EBackgroundRepeat GetHorizontal() const { return m_eHorizontal; }
EBackgroundRepeat GetVertical() const { return m_eVertical; }
bool operator==( const CBackgroundRepeat &rhs ) const
{
return ( m_eHorizontal == rhs.m_eHorizontal && m_eVertical == rhs.m_eVertical );
}
bool operator!=( const CBackgroundRepeat &rhs ) const
{
return !( *this == rhs );
}
private:
EBackgroundRepeat m_eHorizontal;
EBackgroundRepeat m_eVertical;
};
//-----------------------------------------------------------------------------
// Purpose: Can have multiple background image layers, each contains the following
//-----------------------------------------------------------------------------
class CBackgroundImageLayer
{
private:
enum EImagePath
{
k_EImagePathUnset,
k_EImagePathNone,
k_EImagePathSet
};
public:
CBackgroundImageLayer();
~CBackgroundImageLayer();
void SetPathUnset()
{
m_eImagePath = k_EImagePathUnset;
m_sURLPath.Clear();
}
void SetPathToNone()
{
m_eImagePath = m_eImagePath;
m_sURLPath.Clear();
}
void SetPath( const char *pchPath )
{
m_eImagePath = k_EImagePathSet;
m_sURLPath = pchPath;
}
bool IsPathSet() { return (m_eImagePath != k_EImagePathUnset); }
bool IsPathNone() { return (m_eImagePath == k_EImagePathNone); }
const char *GetPath() { return m_sURLPath.String(); }
// from background-position
const CBackgroundPosition &GetPosition() { return m_position; }
void SetPosition( const CBackgroundPosition &position ) { m_position = position; }
const CUILength &GetWidth() { return m_width; }
const CUILength &GetHeight() { return m_height; }
void SetBackgroundSize( const CUILength &width, const CUILength &height )
{
m_width = width;
m_height = height;
m_eBackgroundSizeConstant = k_EBackgroundSizeConstantNone;
}
EBackgroundSizeConstant GetBackgroundSizeConstant() { return m_eBackgroundSizeConstant; }
void SetBackgroundSize( EBackgroundSizeConstant eConstant )
{
Assert( eConstant != k_EBackgroundSizeConstantNone );
m_eBackgroundSizeConstant = eConstant;
m_width.SetLength( k_flFloatAuto );
m_height.SetLength( k_flFloatAuto );
}
CBackgroundRepeat GetRepeat() { return m_repeat; }
void SetRepeat( const CBackgroundRepeat &repeat ) { m_repeat = repeat; }
IImageSource *GetImage() { return m_pImage; }
CVideoPlayerPtr GetMovie() { return m_pVideoPlayer; }
bool IsCompletelyUnset()
{
return (m_eImagePath == k_EImagePathUnset && !m_position.IsSet() && !m_width.IsSet() && !m_height.IsSet() && !m_repeat.IsSet() );
}
bool IsSet()
{
return (m_eImagePath != k_EImagePathUnset && m_position.IsSet() && m_width.IsSet() && m_height.IsSet() && m_repeat.IsSet() );
}
void ResolveDefaultValues();
void ApplyUIScaleFactor( float flScaleFactor );
void OnAppliedToPanel( IUIPanel *pPanel );
void MergeTo( CBackgroundImageLayer *pTarget );
void ToString( CFmtStr1024 *pfmtBuffer );
// comparison operators
bool operator==( const CBackgroundImageLayer &rhs ) const
{
return ( m_eImagePath == rhs.m_eImagePath && m_sURLPath == rhs.m_sURLPath && m_position == rhs.m_position &&
m_width == rhs.m_width&& m_height == rhs.m_height && m_repeat == rhs.m_repeat && m_eBackgroundSizeConstant == rhs.m_eBackgroundSizeConstant );
}
bool operator!=( const CBackgroundImageLayer &rhs ) const
{
return !( *this == rhs );
}
// helpers for drawing
void CalculateFinalDimensions( float *pflWidth, float *pflHeight, float flPanelWidth, float flPanelHeight, float flScaleFactor );
void CalculateFinalPosition( float *px, float *py, float flWidthPanel, float flHeightPanel, float flWidthImage, float flHeightImage );
void CalculateFinalSpacing( float *px, float *py, float flWidthPanel, float flHeightPanel, float flWidthImage, float flHeightImage );
void Set( const CBackgroundImageLayer &rhs );
#ifdef DBGFLAG_VALIDATE
virtual void Validate( CValidator &validator, const tchar *pchName );
#endif
private:
CBackgroundImageLayer( const CBackgroundImageLayer &rhs );
CBackgroundImageLayer& operator=( const CBackgroundImageLayer &rhs ) const;
// from background-image
CUtlString m_sURLPath;
EImagePath m_eImagePath;
// from background-position
CBackgroundPosition m_position;
// from background-size
EBackgroundSizeConstant m_eBackgroundSizeConstant;
CUILength m_width;
CUILength m_height;
// from background-repeat
CBackgroundRepeat m_repeat;
// loaded when applied to a panel
IImageSource *m_pImage;
CVideoPlayerPtr m_pVideoPlayer;
};
} // namespace panorama
#endif //BACKGROUNDIMAGE_H