📄 mgcsoftimage.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 + -