used single Blend class in Bitmap<>

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-07-11 19:36:48 +08:00
parent 713a9f98b3
commit c41cd9283d
2 changed files with 11 additions and 49 deletions

View File

@ -6,52 +6,17 @@ namespace hgl
{
namespace bitmap
{
enum class BlendMode
{
NoBlend, ///<不混合
Alpha, ///<Alpha混合
Add, ///<加法混合
Sub, ///<减法混合
};//enum class BlendMode
template<typename T> struct BlendColor
{
BlendMode mode=BlendMode::NoBlend;
public:
virtual const T &BlendNoBlend(const T &src,const T &dst,const float alpha)
virtual const T operator()(const T &src,const T &)const
{
return src;
}
virtual const T &BlendAlpha(const T &src,const T &dst,const float alpha)
virtual const T operator()(const T &src,const T &,const float &)const
{
return src*alpha+dst*(1-alpha);
}
virtual const T &BlendAdd(const T &src,const T &dst,const float alpha)
{
return src*alpha+dst;
}
virtual const T &BlendSub(const T &src,const T &dst,const float alpha)
{
return src*alpha-dst;
}
virtual const T &Blend(const T &src,const T &dst,const float alpha)
{
switch(mode)
{
case BlendMode::NoBlend: return BlendNoBlend(src,dst,alpha);
case BlendMode::Alpha: return BlendAlpha(src,dst,alpha);
case BlendMode::Add: return BlendAdd(src,dst,alpha);
case BlendMode::Sub: return BlendSub(src,dst,alpha);
}
return src;
}
};//template<typename T> class BlendColor
};//template<typename T> struct BlendColor
}//namespace bitmap
}//namespace hgl

View File

@ -21,6 +21,7 @@ namespace hgl
T draw_color;
float alpha;
BlendColor<T> no_blend;
BlendColor<T> *blend;
public:
@ -28,8 +29,9 @@ namespace hgl
DrawGeometry(FormatBitmap *fb)
{
bitmap=fb;
draw_color=0;
hgl_zero(draw_color);
alpha=1;
blend=&no_blend;
}
virtual ~DrawGeometry()=default;
@ -44,14 +46,9 @@ namespace hgl
blend=bc;
}
virtual void SetBlend(const BlendMode &mode)
{
blend->mode=mode;
}
void CloseBlend()
{
blend->mode=BlendMode.NoBlend;
blend=&no_blend;
}
void SetAlpha(const float &a)
@ -80,7 +77,7 @@ namespace hgl
if(!p)return(false);
*p=blend->Blend(draw_color,*p,alpha);
*p=(*blend)(draw_color,*p,alpha);
return(true);
}
@ -102,7 +99,7 @@ namespace hgl
T *p=bitmap->GetData(x,y);
for(int i=0;i<length;i++)
*p++=blend->Blend(draw_color,*p,alpha);
*p++=(*blend)(draw_color,*p,alpha);
return(true);
}
@ -129,7 +126,7 @@ namespace hgl
for(int y=t;y<t+h;y++)
{
for(int i=0;i<length;i++)
*p++=blend->Blend(draw_color,*p,alpha);
*p++=(*blend)Blend(draw_color,*p,alpha);
p+=width-w;
}
@ -156,7 +153,7 @@ namespace hgl
for(int i=0;i<length;i++)
{
*p=blend->Blend(draw_color,*p,alpha);
*p=(*blend)Blend(draw_color,*p,alpha);
p+=line_bytes;
}