used single Blend class in Bitmap<>
This commit is contained in:
parent
713a9f98b3
commit
c41cd9283d
@ -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
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user