TexConv/CMP_CompressonatorLib/Buffer/CodecBuffer_Block.cpp
2020-07-31 11:31:32 +08:00

121 lines
5.3 KiB
C++

//===============================================================================
// Copyright (c) 2007-2016 Advanced Micro Devices, Inc. All rights reserved.
// Copyright (c) 2004-2006 ATI Technologies Inc.
//===============================================================================
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files(the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions :
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
//
// File Name: CodecBuffer_Block.cpp
// Description: implementation of the CCodecBuffer_Block class
//
//////////////////////////////////////////////////////////////////////////////
#include "Common.h"
#include "CodecBuffer_Block.h"
//////////////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////////////
CCodecBuffer_Block::CCodecBuffer_Block(CodecBufferType nCodecBufferType,
CMP_BYTE nBlockWidth, CMP_BYTE nBlockHeight, CMP_BYTE nBlockDepth,
CMP_DWORD dwWidth, CMP_DWORD dwHeight, CMP_DWORD dwPitch, CMP_BYTE* pData,CMP_DWORD dwDataSize)
: CCodecBuffer(nBlockWidth, nBlockHeight, nBlockDepth, dwWidth, dwHeight, dwPitch, pData,dwDataSize), m_nCodecBufferType(nCodecBufferType)
{
// ToDo: All of these cases all need to be updated from default values
// to those passed down! for now we has asjusted the case
// of CBT_4x4Block_8BPP which is common for DXTn and BCn (defaults should be 4x4 however since the introduction of ASTC
// and GT Codec the sizes are now variable from 4x4 to 12x12 (for ASTC) and 4x4 to BlockW x BlockH for GT
// Should also investigate changing m_dwBlockBPP
switch(nCodecBufferType)
{
case CBT_4x4Block_2BPP:
m_dwBlockWidth = 4; m_dwBlockHeight = 4; m_dwBlockBPP = 2; break;
case CBT_4x4Block_4BPP:
m_dwBlockWidth = 4; m_dwBlockHeight = 4; m_dwBlockBPP = 4; break;
case CBT_4x4Block_8BPP:
m_dwBlockWidth = 4; m_dwBlockHeight = 4; m_dwBlockBPP = 8; break;
case CBT_4x4Block_16BPP:
m_dwBlockWidth = 4; m_dwBlockHeight = 4; m_dwBlockBPP = 16; break;
case CBT_4x4Block_32BPP:
m_dwBlockWidth = 4; m_dwBlockHeight = 4; m_dwBlockBPP = 32; break;
case CBT_8x8Block_2BPP:
m_dwBlockWidth = 8; m_dwBlockHeight = 8; m_dwBlockBPP = 2; break;
case CBT_8x8Block_4BPP:
m_dwBlockWidth = 8; m_dwBlockHeight = 8; m_dwBlockBPP = 4; break;
case CBT_8x8Block_8BPP:
m_dwBlockWidth = 8; m_dwBlockHeight = 8; m_dwBlockBPP = 8; break;
case CBT_8x8Block_16BPP:
m_dwBlockWidth = 8; m_dwBlockHeight = 8; m_dwBlockBPP = 16; break;
case CBT_8x8Block_32BPP:
m_dwBlockWidth = 8; m_dwBlockHeight = 8; m_dwBlockBPP = 32; break;
default:
m_dwBlockWidth = nBlockWidth; m_dwBlockHeight = nBlockHeight; m_dwBlockBPP = 8; break;
}
CMP_DWORD dwBlocksX = ((GetWidth() + m_dwBlockWidth - 1) / m_dwBlockWidth);
CMP_DWORD dwBlocksY = ((GetHeight() + m_dwBlockHeight - 1) / m_dwBlockHeight);
CMP_DWORD dwBlocks = dwBlocksX * dwBlocksY;
m_dwBlockSize = m_dwBlockWidth * m_dwBlockHeight * m_dwBlockBPP / 8;
m_dwPitch = dwBlocksX * m_dwBlockSize;
if(m_pData == NULL)
{
CMP_DWORD dwSize = dwBlocks * m_dwBlockSize;
m_pData = (CMP_BYTE*) malloc(dwSize);
}
}
CCodecBuffer_Block::~CCodecBuffer_Block()
{
}
bool CCodecBuffer_Block::ReadBlock(CMP_DWORD x, CMP_DWORD y, CMP_DWORD* pBlock, CMP_DWORD dwBlockSize)
{
assert(pBlock);
assert(x < GetWidth());
assert(y < GetHeight());
if(!pBlock || x >= GetWidth() || y >= GetHeight())
return false;
int offset = ((y / m_dwBlockHeight) * m_dwPitch) + ((x / m_dwBlockWidth) * dwBlockSize * sizeof(CMP_DWORD));
memcpy(pBlock, GetData() + offset, dwBlockSize * sizeof(CMP_DWORD));
return true;
}
bool CCodecBuffer_Block::WriteBlock(CMP_DWORD x, CMP_DWORD y, CMP_DWORD* pBlock, CMP_DWORD dwBlockSize)
{
assert(pBlock);
assert(x < GetWidth());
assert(y < GetHeight());
if(!pBlock || x >= GetWidth() || y >= GetHeight())
return false;
int offset = ((y / m_dwBlockHeight) * m_dwPitch) + ((x / m_dwBlockWidth) * dwBlockSize * sizeof(CMP_DWORD));
memcpy(GetData() + offset, pBlock, dwBlockSize * sizeof(CMP_DWORD));
return true;
}