⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mgcsoftimage.cpp

📁 3D Game Engine Design Source Code非常棒
💻 CPP
字号:
// Magic Software, Inc.
// http://www.magic-software.com
// Copyright (c) 2000, All Rights Reserved
//
// Source code from Magic Software is supplied under the terms of a license
// agreement and may not be copied or disclosed except in accordance with the
// terms of that agreement.  The various license agreements may be found at
// the Magic Software web site.  This file is subject to the license
//
// RESTRICTED USE SOURCE CODE
// http://www.magic-software.com/License/restricted.pdf

#include "MgcSoftImage.h"

//----------------------------------------------------------------------------
MgcSoftImage::MgcSoftImage ()
{
    m_iXSize = 0;
    m_iYSize = 0;
    m_akColor = 0;
    m_bXClamp = true;
    m_bYClamp = true;

    m_iXSizeM1 = -1;
    m_iYSizeM1 = -1;
    m_fXSizeM1 = -1.0;
    m_fYSizeM1 = -1.0;

    m_iLogXSize = -1;
    m_iLogYSize = -1;
}
//----------------------------------------------------------------------------
void MgcSoftImage::Set (int iXSize, int iYSize, MgcSoftColor* akColor,
    bool bXClamp, bool bYClamp)
{
    // assert:  iXSize > 1 and iYSize > 1 and are both powers of two
    m_iXSize = iXSize;
    m_iYSize = iYSize;
    m_akColor = akColor;
    m_bXClamp = bXClamp;
    m_bYClamp = bYClamp;

    m_iXSizeM1 = iXSize - 1;
    m_iYSizeM1 = iYSize - 1;
    m_fXSizeM1 = MgcReal(m_iXSizeM1);
    m_fYSizeM1 = MgcReal(m_iYSizeM1);

    m_iLogXSize = 0;
    while ( iXSize > 1 )
    {
        m_iLogXSize++;
        iXSize >>= 1;
    }

    m_iLogYSize = 0;
    while ( iYSize > 1 )
    {
        m_iLogYSize++;
        iYSize >>= 1;
    }
}
//----------------------------------------------------------------------------
MgcSoftColor MgcSoftImage::GetColor (int iX, int iY)
{
    if ( iX < 0 )
    {
        if ( m_bXClamp )
        {
            iX = 0;
        }
        else
        {
            iX = -iX;
            iX &= m_iXSizeM1;
            iX = m_iXSize - iX;
        }
    }
    else if ( iX >= m_iXSize )
    {
        if ( m_bXClamp )
            iX = m_iXSizeM1;
        else
            iX &= m_iXSizeM1;
    }

    if ( iY < 0 )
    {
        if ( m_bYClamp )
        {
            iY = 0;
        }
        else
        {
            iY = -iY;
            iY &= m_iYSizeM1;
            iY = m_iYSize - iY;
        }
    }
    else if ( iY >= m_iYSize )
    {
        if ( m_bYClamp )
            iY = m_iYSizeM1;
        else
            iY &= m_iYSizeM1;
    }

    return m_akColor[iX + (iY << m_iLogXSize)];
}
//----------------------------------------------------------------------------
MgcSoftColor MgcSoftImage::GetColor (MgcReal fX, MgcReal fY)
{
    int iShift;

    int iX = 0;
    int iXPattern = *(int*)&fX;
    if ( iXPattern & 0x80000000 == 0 )
    {
        // fX > 0
        if ( iXPattern >= 0x3F800000 )
        {
            // fX > 1
            if ( m_bXClamp )
            {
                iX = m_iXSizeM1;
            }
            else
            {
                iShift = 150 - m_iLogXSize - ((iXPattern >> 23) & 0xFF);
                if ( iShift < 24 )
                {
                    iX = (iXPattern & 0x007FFFFF) | 0x00800000;
                    if ( iShift > 0 )
                        iX >>= iShift;
                    iX &= m_iXSizeM1;
                }
            }
        }
        else
        {
            iShift = 150 - m_iLogXSize - ((iXPattern >> 23) & 0xFF);
            if ( iShift < 24 )
                iX = ((iXPattern & 0x007FFFFF) | 0x00800000) >> iShift;
        }
    }
    else
    {
        // fX < 0
        if ( !m_bXClamp )
        {
            // compute |fX|
            iXPattern &= 0x7FFFFFFF;
            iShift = 150 - m_iLogXSize - ((iXPattern >> 23) & 0xFF);
            if ( iShift < 24 )
            {
                iX = (iXPattern & 0x007FFFFF) | 0x00800000;
                if ( iShift > 0 )
                    iX >>= iShift;
                iX &= m_iXSizeM1;
            }
            iX = m_iXSizeM1 - iX;
        }
    }

    int iY = 0;
    int iYPattern = *(int*)&fY;
    if ( iYPattern & 0x80000000 == 0 )
    {
        // fY > 0
        if ( iYPattern >= 0x3F800000 )
        {
            // fY > 1
            if ( m_bYClamp )
            {
                iY = m_iYSizeM1;
            }
            else
            {
                iShift = 150 - m_iLogYSize - ((iYPattern >> 23) & 0xFF);
                if ( iShift < 24 )
                {
                    iY = (iYPattern & 0x007FFFFF) | 0x00800000;
                    if ( iShift > 0 )
                        iY >>= iShift;
                    iY &= m_iYSizeM1;
                }
            }
        }
        else
        {
            iShift = 150 - m_iLogYSize - ((iYPattern >> 23) & 0xFF);
            if ( iShift < 24 )
                iY = ((iYPattern & 0x007FFFFF) | 0x00800000) >> iShift;
        }
    }
    else
    {
        // fY < 0
        if ( !m_bYClamp )
        {
            // compute |fY|
            iYPattern &= 0x7FFFFFFF;
            iShift = 150 - m_iLogYSize - ((iYPattern >> 23) & 0xFF);
            if ( iShift < 24 )
            {
                iY = (iYPattern & 0x007FFFFF) | 0x00800000;
                if ( iShift > 0 )
                    iY >>= iShift;
                iY &= m_iYSizeM1;
            }
            iY = m_iYSizeM1 - iY;
        }
    }

    return m_akColor[iX + (iY << m_iLogXSize)];
}
//----------------------------------------------------------------------------

⌨️ 快捷键说明

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