2019-11-28 01:44:50 +08:00
|
|
|
|
#include"pixel_format.h"
|
2019-11-26 17:27:48 +08:00
|
|
|
|
#include<hgl/type/StrChar.h>
|
2019-11-27 19:45:08 +08:00
|
|
|
|
#include<iostream>
|
|
|
|
|
#include<iomanip>
|
2019-11-26 17:27:48 +08:00
|
|
|
|
|
|
|
|
|
namespace hgl
|
|
|
|
|
{
|
2019-11-27 19:45:08 +08:00
|
|
|
|
constexpr char *ColorDataName[]=
|
|
|
|
|
{
|
|
|
|
|
"NONE",
|
|
|
|
|
|
|
|
|
|
"UNORM",
|
|
|
|
|
"SNORM",
|
|
|
|
|
"USCALED",
|
|
|
|
|
"SSCALED",
|
|
|
|
|
"UINT",
|
|
|
|
|
"SINT",
|
|
|
|
|
"UFLOAT",
|
2019-12-03 20:49:25 +08:00
|
|
|
|
"SFLOAT",
|
|
|
|
|
"sRGB"
|
2019-11-27 19:45:08 +08:00
|
|
|
|
};
|
|
|
|
|
|
2019-11-26 17:27:48 +08:00
|
|
|
|
constexpr PixelFormat pf_list[]=
|
|
|
|
|
{
|
2019-12-02 22:10:49 +08:00
|
|
|
|
{ColorFormat::BGRA4, "BGRA4", 4,{'B','G','R','A'},{ 4, 4, 4, 4},ColorDataType::UNORM},
|
2019-12-03 15:31:51 +08:00
|
|
|
|
{ColorFormat::RGB565, "RGB565", 3,{'R','G','B', 0 },{ 5, 6, 5, 0},ColorDataType::UNORM},
|
2019-12-02 22:10:49 +08:00
|
|
|
|
{ColorFormat::A1RGB5, "A1RGB5", 4,{'A','R','G','B'},{ 1, 5, 5, 5},ColorDataType::UNORM},
|
2019-12-03 20:49:25 +08:00
|
|
|
|
{ColorFormat::R8, "R8", 1,{'R', 0 , 0 , 0 },{ 8, 0, 0, 0},ColorDataType::UNORM},
|
|
|
|
|
{ColorFormat::RG8, "RG8", 2,{'R','G', 0 , 0 },{ 8, 8, 0, 0},ColorDataType::UNORM},
|
|
|
|
|
{ColorFormat::RGBA8, "RGBA8", 4,{'R','G','B','A'},{ 8, 8, 8, 8},ColorDataType::UNORM},
|
|
|
|
|
{ColorFormat::A2BGR10, "A2BGR10", 4,{'A','B','G','R'},{ 2,10,10,10},ColorDataType::UNORM},
|
|
|
|
|
{ColorFormat::R16, "R16", 1,{'R', 0 , 0 , 0 },{16, 0, 0, 0},ColorDataType::UNORM},
|
2019-12-02 22:10:49 +08:00
|
|
|
|
{ColorFormat::R16F, "R16F", 1,{'R', 0 , 0 , 0 },{16, 0, 0, 0},ColorDataType::SFLOAT},
|
2019-12-03 20:49:25 +08:00
|
|
|
|
{ColorFormat::RG16, "RG16", 2,{'R','G', 0 , 0 },{16,16, 0, 0},ColorDataType::UNORM},
|
2019-12-02 22:10:49 +08:00
|
|
|
|
{ColorFormat::RG16F, "RG16F", 2,{'R','G', 0 , 0 },{16,16, 0, 0},ColorDataType::SFLOAT},
|
2019-12-03 20:49:25 +08:00
|
|
|
|
{ColorFormat::RGBA16, "RGBA16", 4,{'R','G','B','A'},{16,16,16,16},ColorDataType::UNORM},
|
2019-12-03 15:31:51 +08:00
|
|
|
|
{ColorFormat::RGBA16F, "RGBA16F", 4,{'R','G','B','A'},{16,16,16,16},ColorDataType::SFLOAT},
|
2019-12-02 22:10:49 +08:00
|
|
|
|
{ColorFormat::R32U, "R32U", 1,{'R', 0 , 0 , 0 },{32, 0, 0, 0},ColorDataType::UINT},
|
|
|
|
|
{ColorFormat::R32I, "R32I", 1,{'R', 0 , 0 , 0 },{32, 0, 0, 0},ColorDataType::SINT},
|
|
|
|
|
{ColorFormat::R32F, "R32F", 1,{'R', 0 , 0 , 0 },{32, 0, 0, 0},ColorDataType::SFLOAT},
|
|
|
|
|
{ColorFormat::RG32U, "RG32U", 2,{'R','G', 0 , 0 },{32,32, 0, 0},ColorDataType::UINT},
|
|
|
|
|
{ColorFormat::RG32I, "RG32I", 2,{'R','G', 0 , 0 },{32,32, 0, 0},ColorDataType::SINT},
|
|
|
|
|
{ColorFormat::RG32F, "RG32F", 2,{'R','G', 0 , 0 },{32,32, 0, 0},ColorDataType::SFLOAT},
|
|
|
|
|
{ColorFormat::RGB32U, "RGB32U", 3,{'R','G','B', 0 },{32,32,32, 0},ColorDataType::UINT},
|
|
|
|
|
{ColorFormat::RGB32I, "RGB32I", 3,{'R','G','B', 0 },{32,32,32, 0},ColorDataType::SINT},
|
|
|
|
|
{ColorFormat::RGB32F, "RGB32F", 3,{'R','G','B', 0 },{32,32,32, 0},ColorDataType::SFLOAT},
|
|
|
|
|
{ColorFormat::RGBA32U, "RGBA32U", 4,{'R','G','B','A'},{32,32,32,32},ColorDataType::UINT},
|
|
|
|
|
{ColorFormat::RGBA32I, "RGBA32I", 4,{'R','G','B','A'},{32,32,32,32},ColorDataType::SINT},
|
2019-12-04 20:47:58 +08:00
|
|
|
|
{ColorFormat::RGBA32F, "RGBA32F", 4,{'R','G','B','A'},{32,32,32,32},ColorDataType::SFLOAT},
|
2019-12-04 21:05:56 +08:00
|
|
|
|
{ColorFormat::B10GR11UF, "B10GR11UF", 3,{'B','G','R', 0 },{10,11,11, 0},ColorDataType::UFLOAT}
|
2019-11-26 17:27:48 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
constexpr uint PixelFormatCount=sizeof(pf_list)/sizeof(PixelFormat);
|
|
|
|
|
}//namespace
|
|
|
|
|
|
2019-11-27 19:45:08 +08:00
|
|
|
|
void PrintFormatList()
|
|
|
|
|
{
|
|
|
|
|
const PixelFormat *pf=pf_list;
|
|
|
|
|
|
|
|
|
|
for(uint i=0;i<PixelFormatCount;i++)
|
|
|
|
|
{
|
2019-12-02 22:10:49 +08:00
|
|
|
|
std::cout<<pf->channels<<": "<<std::setw(10)<<pf->name<<" "<<std::setw(3)<<pf->GetPixelBytes()<<" bits "<<ColorDataName[(uint)(pf->type)]<<std::endl;
|
2019-11-27 19:45:08 +08:00
|
|
|
|
|
|
|
|
|
++pf;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-11-26 17:54:02 +08:00
|
|
|
|
const PixelFormat *GetPixelFormat(ColorFormat fmt)
|
|
|
|
|
{
|
|
|
|
|
if(fmt<=ColorFormat::NONE
|
|
|
|
|
||fmt>=ColorFormat::END)return(nullptr);
|
|
|
|
|
|
|
|
|
|
const PixelFormat *pf=pf_list;
|
|
|
|
|
|
|
|
|
|
for(uint i=0;i<PixelFormatCount;i++)
|
|
|
|
|
{
|
|
|
|
|
if(pf->format==fmt)
|
|
|
|
|
return pf;
|
|
|
|
|
|
|
|
|
|
++pf;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
2019-12-02 13:15:42 +08:00
|
|
|
|
const PixelFormat *GetPixelFormat(const os_char *name)
|
2019-11-26 17:27:48 +08:00
|
|
|
|
{
|
|
|
|
|
if(!name||!*name)return(nullptr);
|
|
|
|
|
|
|
|
|
|
const PixelFormat *pf=pf_list;
|
|
|
|
|
|
|
|
|
|
for(uint i=0;i<PixelFormatCount;i++)
|
|
|
|
|
{
|
|
|
|
|
if(hgl::stricmp(name,pf->name)==0)
|
|
|
|
|
return pf;
|
|
|
|
|
|
|
|
|
|
++pf;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nullptr;
|
2019-11-27 19:45:08 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 检测是否所有ALPHA一致
|
|
|
|
|
*/
|
|
|
|
|
bool CheckSameAlpha(uint8 *data,uint count)
|
|
|
|
|
{
|
|
|
|
|
uint8 *p=data;
|
|
|
|
|
|
|
|
|
|
while(count--)
|
|
|
|
|
{
|
|
|
|
|
if(*p!=*data)return(false);
|
|
|
|
|
|
|
|
|
|
p++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 检测RGB数据是否一致
|
|
|
|
|
*/
|
|
|
|
|
bool CheckSameRGB(uint8 *data,int color,uint count)
|
|
|
|
|
{
|
|
|
|
|
uint8 *p=data;
|
|
|
|
|
|
|
|
|
|
while(count--)
|
|
|
|
|
{
|
|
|
|
|
if(memcmp(data,p,color-1))
|
|
|
|
|
return(false);
|
|
|
|
|
|
|
|
|
|
p+=color;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MixLA(uint8 *lum,uint8 *alpha,int size)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
for(i=0;i<size;i++)
|
|
|
|
|
{
|
|
|
|
|
lum++;
|
|
|
|
|
*lum++=*alpha++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MixRGBA(uint8 *rgba,uint8 *alpha,int size)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
for(i=0;i<size;i++)
|
|
|
|
|
{
|
|
|
|
|
rgba+=3;
|
|
|
|
|
*rgba++=*alpha++;
|
|
|
|
|
}
|
2019-12-04 21:05:56 +08:00
|
|
|
|
}
|