#include"TextureFileCreater.h" #include"ILImage.h" #include class TextureFileCreaterRGBA:public TextureFileCreater { public: using TextureFileCreater::TextureFileCreater; void RGBA8toRGBA4(uint16 *target,uint8 *src,uint size) { for(uint i=0;i>4); ++target; src+=4; } } void RGBA8toA1RGB5(uint16 *target,uint8 *src,uint size) { for(uint i=0;i>3); ++target; src+=4; } } void RGBA16toA2BGR10(uint32 *target,uint16 *src,uint size) { for(uint i=0;i> 6); ++target; src+=4; } } public: bool Write() override { if(fmt->format==ColorFormat::RGBA8UN ||fmt->format==ColorFormat::RGBA16UN ||fmt->format==ColorFormat::RGBA16F ||fmt->format==ColorFormat::RGBA32U ||fmt->format==ColorFormat::RGBA32I ||fmt->format==ColorFormat::RGBA32F) { ILuint type; if(!ToILType(type,fmt->bits[0],fmt->type)) return(nullptr); void *origin_rgba=image->GetRGBA(type); return TextureFileCreater::Write(origin_rgba); } else if(fmt->format==ColorFormat::BGRA4) { void *origin_rgba=image->GetRGBA(IL_UNSIGNED_BYTE); AutoDelete bgra4=new uint16[image->pixel_total()]; RGBA8toRGBA4(bgra4,(uint8 *)origin_rgba,image->pixel_total()); return TextureFileCreater::Write(bgra4); } else if(fmt->format==ColorFormat::A1RGB5) { void *origin_rgba=image->GetRGBA(IL_UNSIGNED_BYTE); AutoDelete a1_rgb5=new uint16[image->pixel_total()]; RGBA8toA1RGB5(a1_rgb5,(uint8 *)origin_rgba,image->pixel_total()); return TextureFileCreater::Write(a1_rgb5); } else if(fmt->format==ColorFormat::A2BGR10UN) { void *origin_rgba=image->GetRGBA(IL_UNSIGNED_SHORT); AutoDelete a2_bgr10=new uint32[image->pixel_total()]; RGBA16toA2BGR10(a2_bgr10,(uint16 *)origin_rgba,image->pixel_total()); return TextureFileCreater::Write(a2_bgr10); } else { LOG_ERROR(OS_TEXT("Don't support this RGBA format")); return(false); } } };//class TextureFileCreaterRGB:public TextureFileCreater TextureFileCreater *CreateTextureFileCreaterRGBA(const PixelFormat *pf,ILImage *image) { return(new TextureFileCreaterRGBA(pf,image)); }