Counter Strike : Global Offensive Source Code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

217 lines
6.1 KiB

//====== Copyright © 1996-2004, Valve Corporation, All rights reserved. =======
//
// A class representing an image
//
//=============================================================================
#ifndef DMEIMAGE_H
#define DMEIMAGE_H
#ifdef _WIN32
#pragma once
#endif
#include "datamodel/dmelement.h"
#include "datamodel/dmattributevar.h"
#include "bitmap/imageformat.h"
#include "bitmap/floatbitmap.h"
//-----------------------------------------------------------------------------
// A class representing an image (2d or 3d bitmap)
//-----------------------------------------------------------------------------
class CDmeImage : public CDmElement
{
DEFINE_ELEMENT( CDmeImage, CDmElement );
public:
virtual void OnAttributeChanged( CDmAttribute *pAttribute );
virtual void OnElementUnserialized();
virtual void OnElementSerialized();
public:
// Initializes the buffer, but doesn't allocate space
void Init( int nWidth, int nHeight, int nDepth, ImageFormat fmt, float flGamma );
// Gets dimensions
int Width() const;
int Height() const;
int Depth() const;
// Methods related to image format
ImageFormat Format() const;
const char *FormatName() const;
// Methods related to gamma
float Gamma() const;
// returns the size of one row
int RowSizeInBytes( ) const;
// returns the size of one z slice
int ZSliceSizeInBytes( ) const;
// returns the total size of the image
int SizeInBytes( ) const;
// Sets the storage mode. False = the bits are put in the attribute.
// True = the bits are put in the float bitmap
void SetFloatBitmapStorageMode( bool bFloatBitmap, bool bDiscardContents = false );
bool IsUsingFloatBitmapStorageMode() const;
bool HasImageData() const;
// Used for computation
// void BeginComputation();
// void EndComputation();
// Copies the image from the src in whatever storage form they are currently in
// Potentially color converting
void CopyFrom( CDmeImage *pSrcImage, ImageFormat fmt = IMAGE_FORMAT_UNKNOWN );
// Color converts the image into the destination format.
// Has no immediate effect if the image is in 'float bitmap' mode.
// Instead, it will cause it to use this format when it eventually
// reconverts back to 'attribute' mode.
// NOTE: Doesn't work to convert to a compressed format.
void ConvertFormat( ImageFormat fmt );
// Reinterprets the image as a new color format; no work is done
// The old + new color formats must be the same size in bytes
void ReinterpetFormat( ImageFormat fmt );
//
// NOTE: The following methods operate on the bits attribute
//
// Used for bit modification
CUtlBinaryBlock &BeginModification( );
void EndModification( );
// returns a pointer to the image bits buffer
const void *ImageBits();
// Copies bits into the image bits buffer
void SetImageBits( const void *pBits, int nSize );
// Compresses an image into this image
void CompressImage( CDmeImage *pSrcImage, ImageFormat fmt );
//
// NOTE: The following methods operate on the float-bitmap version of the bits attribute
//
// returns a pointer to the image bits buffer as a float bitmap
const FloatBitMap_t *FloatBitmap();
// Allows you to directly manipulate the float bitmap
FloatBitMap_t &BeginFloatBitmapModification( );
void EndFloatBitmapModification( );
// Creates an image 1/4 size of the source using a box filter
void QuarterSize( CDmeImage *pSrcImage );
// Downsample using nice filter (NOTE: Dest bitmap needs to have been initialized w/ final size)
void DownsampleNiceFiltered( const DownsampleInfo_t& info, CDmeImage *pSrcImage );
// Sets the color of every pixel
void Clear( float r, float g, float b, float a );
private:
enum StorageMode_t
{
DMEIMAGE_STORAGE_NONE = 0,
DMEIMAGE_STORAGE_FLOAT_BITMAP,
DMEIMAGE_STORAGE_ATTRIBUTE,
};
CDmaVar<int> m_nWidth;
CDmaVar<int> m_nHeight;
CDmaVar<int> m_nDepth;
CDmaVar<int> m_nFormat;
CDmaVar<float> m_flGamma;
CDmaBinaryBlock m_Bits;
// Used for computation
DmAttributeModifyHandle_t m_hModify;
StorageMode_t m_Mode;
bool m_bInModification;
bool m_bInFloatBitmapModification;
bool m_bIgnoreChangedBitsAttribute;
FloatBitMap_t m_ComputeBits;
};
//-----------------------------------------------------------------------------
// Gets dimensions
//-----------------------------------------------------------------------------
inline int CDmeImage::Width() const
{
return ( m_Mode != DMEIMAGE_STORAGE_FLOAT_BITMAP ) ? m_nWidth : m_ComputeBits.NumCols();
}
inline int CDmeImage::Height() const
{
return ( m_Mode != DMEIMAGE_STORAGE_FLOAT_BITMAP ) ? m_nHeight : m_ComputeBits.NumRows();
}
inline int CDmeImage::Depth() const
{
return ( m_Mode != DMEIMAGE_STORAGE_FLOAT_BITMAP ) ? m_nDepth : m_ComputeBits.NumSlices();
}
//-----------------------------------------------------------------------------
// Methods related to gamma
//-----------------------------------------------------------------------------
inline float CDmeImage::Gamma() const
{
return m_flGamma;
}
//-----------------------------------------------------------------------------
// returns a pointer to the image bits buffer
//-----------------------------------------------------------------------------
inline const void *CDmeImage::ImageBits()
{
SetFloatBitmapStorageMode( false );
return m_Bits.Get();
}
inline bool CDmeImage::IsUsingFloatBitmapStorageMode() const
{
return ( m_Mode == DMEIMAGE_STORAGE_FLOAT_BITMAP );
}
inline bool CDmeImage::HasImageData() const
{
return ( m_Mode != DMEIMAGE_STORAGE_NONE );
}
//-----------------------------------------------------------------------------
// An array of images (used for cubemaps or texture arrays)
//-----------------------------------------------------------------------------
class CDmeImageArray : public CDmElement
{
DEFINE_ELEMENT( CDmeImageArray, CDmElement );
public:
int ImageCount() const;
CDmeImage *GetImage( int nIndex ) const;
CDmeImage *AddImage( );
void AddImage( CDmeImage *pImage );
// Gets dimensions
int Width() const;
int Height() const;
int Depth() const;
ImageFormat Format() const;
bool IsConsistent( int nWidth, int nHeight, int nDepth, ImageFormat fmt ) const;
private:
CDmaElementArray< CDmeImage > m_Images;
};
#endif // DMEIMAGE_H