wmltimage.inl

来自「3D Game Engine Design Source Code非常棒」· INL 代码 · 共 202 行

INL
202
字号
// Magic Software, Inc.
// http://www.magic-software.com
// http://www.wild-magic.com
// Copyright (c) 2003.  All Rights Reserved
//
// The Wild Magic Library (WML) source code is supplied under the terms of
// the license agreement http://www.magic-software.com/License/WildMagic.pdf
// and may not be copied or disclosed except in accordance with the terms of
// that agreement.

//----------------------------------------------------------------------------
template <class T>
TImage<T>::TImage (int iDimensions, int* aiBound, T* atData)
    :
    Lattice(iDimensions,aiBound)
{
    SetData(atData);
}
//----------------------------------------------------------------------------
template <class T>
TImage<T>::TImage (const TImage& rkImage)
    :
    Lattice(rkImage)
{
    m_atData = new T[m_iQuantity];
    memcpy(m_atData,rkImage.m_atData,m_iQuantity*sizeof(T));
}
//----------------------------------------------------------------------------
template <class T>
TImage<T>::TImage (const char* acFilename)
{
    Load(acFilename);
}
//----------------------------------------------------------------------------
template <class T>
TImage<T>::TImage (int iDimensions)
    :
    Lattice(iDimensions)
{
}
//----------------------------------------------------------------------------
template <class T>
TImage<T>::~TImage ()
{
    delete[] m_atData;
}
//----------------------------------------------------------------------------
template <class T>
void TImage<T>::SetData (T* atData)
{
    if ( atData )
    {
        m_atData = atData;
    }
    else
    {
        assert( m_iQuantity > 0 );
        m_atData = new T[m_iQuantity];
        memset(m_atData,0,m_iQuantity*sizeof(T));
    }
}
//----------------------------------------------------------------------------
template <class T>
T* TImage<T>::GetData () const
{
    return m_atData;
}
//----------------------------------------------------------------------------
template <class T>
T& TImage<T>::operator[] (int i) const
{
    // assert:  i < m_iQuantity
    return m_atData[i];
}
//----------------------------------------------------------------------------
template <class T>
TImage<T>& TImage<T>::operator= (const TImage& rkImage)
{
    Lattice::operator=(rkImage);

    delete[] m_atData;
    m_atData = new T[m_iQuantity];
    memcpy(m_atData,rkImage.m_atData,m_iQuantity*sizeof(T));

    return *this;
}
//----------------------------------------------------------------------------
template <class T>
TImage<T>& TImage<T>::operator= (T tValue)
{
    for (int i = 0; i < m_iQuantity; i++)
        m_atData[i] = tValue;

    return *this;
}
//----------------------------------------------------------------------------
template <class T>
bool TImage<T>::operator== (const TImage& rkImage) const
{
    if ( Lattice::operator!=(rkImage) )
        return false;

    return memcmp(m_atData,rkImage.m_atData,m_iQuantity*sizeof(T)) == 0;
}
//----------------------------------------------------------------------------
template <class T>
bool TImage<T>::operator!= (const TImage& rkImage) const
{
    return !operator==(rkImage);
}
//----------------------------------------------------------------------------
template <class T>
bool TImage<T>::Load (const char* acFilename)
{
    std::ifstream kIStr(acFilename,std::ios::in|std::ios::binary);
    if ( !kIStr )
    {
        m_iDimensions = 0;
        m_iQuantity = 0;
        m_aiBound = NULL;
        m_aiOffset = NULL;
        m_atData = NULL;
        return false;
    }

    if ( !Lattice::Load(kIStr) )
    {
        m_atData = NULL;
        return false;
    }

    int iRTTI;
    kIStr.read((char*)&iRTTI,sizeof(int));
#ifdef WML_BIG_ENDIAN
    System::SwapBytes(sizeof(int),&iRTTI);
#endif

    int iSizeOf;
    kIStr.read((char*)&iSizeOf,sizeof(int));
#ifdef WML_BIG_ENDIAN
    System::SwapBytes(sizeof(int),&iSizeOf);
#endif

    m_atData = new T[m_iQuantity];
    if ( iRTTI == T::GetRTTI() )
    {
        kIStr.read((char*)m_atData,m_iQuantity*sizeof(T));
#ifdef WML_BIG_ENDIAN
        System::SwapBytes(sizeof(T),m_iQuantity,m_atData);
#endif
    }
    else
    {
        char* acFileData = new char[m_iQuantity*iSizeOf];
        kIStr.read(acFileData,m_iQuantity*iSizeOf);
#ifdef WML_BIG_ENDIAN
        System::SwapBytes(iSizeOf,m_iQuantity,acFileData);
#endif
        ImageConvert(m_iQuantity,iRTTI,acFileData,T::GetRTTI(),m_atData);
        delete[] acFileData;
    }

    return true;
}
//----------------------------------------------------------------------------
template <class T>
bool TImage<T>::Save (const char* acFilename) const
{
    std::ofstream kOStr(acFilename,std::ios::out|std::ios::binary);
    if ( !kOStr )
        return false;

    if ( !Lattice::Save(kOStr) )
        return false;

    int iRTTI = T::GetRTTI();
#ifdef WML_BIG_ENDIAN
    System::SwapBytes(sizeof(int),&iRTTI);
#endif
    kOStr.write((const char*)&iRTTI,sizeof(int));

    int iSizeOf = (int)(sizeof(T));
#ifdef WML_BIG_ENDIAN
    System::SwapBytes(sizeof(int),&iSizeOf);
#endif
    kOStr.write((const char*)&iSizeOf,sizeof(int));

#ifdef WML_BIG_ENDIAN
    for (int i = 0; i < m_iQuantity; i++)
    {
        T tDummy = m_atData[i];
        System::SwapBytes(sizeof(T),&tDummy);
        kOStr.write((const char*)&tDummy,sizeof(T));
    }
#else
    kOStr.write((const char*)m_atData,m_iQuantity*sizeof(T));
#endif

    return true;
}
//----------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?