used single Blend class in Bitmap<>
This commit is contained in:
parent
713a9f98b3
commit
c41cd9283d
@ -6,52 +6,17 @@ namespace hgl
|
|||||||
{
|
{
|
||||||
namespace bitmap
|
namespace bitmap
|
||||||
{
|
{
|
||||||
enum class BlendMode
|
|
||||||
{
|
|
||||||
NoBlend, ///<不混合
|
|
||||||
Alpha, ///<Alpha混合
|
|
||||||
Add, ///<加法混合
|
|
||||||
Sub, ///<减法混合
|
|
||||||
};//enum class BlendMode
|
|
||||||
|
|
||||||
template<typename T> struct BlendColor
|
template<typename T> struct BlendColor
|
||||||
{
|
{
|
||||||
BlendMode mode=BlendMode::NoBlend;
|
virtual const T operator()(const T &src,const T &)const
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
virtual const T &BlendNoBlend(const T &src,const T &dst,const float alpha)
|
|
||||||
{
|
{
|
||||||
return src;
|
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;
|
return src;
|
||||||
}
|
}
|
||||||
};//template<typename T> class BlendColor
|
};//template<typename T> struct BlendColor
|
||||||
}//namespace bitmap
|
}//namespace bitmap
|
||||||
}//namespace hgl
|
}//namespace hgl
|
@ -21,6 +21,7 @@ namespace hgl
|
|||||||
T draw_color;
|
T draw_color;
|
||||||
float alpha;
|
float alpha;
|
||||||
|
|
||||||
|
BlendColor<T> no_blend;
|
||||||
BlendColor<T> *blend;
|
BlendColor<T> *blend;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -28,8 +29,9 @@ namespace hgl
|
|||||||
DrawGeometry(FormatBitmap *fb)
|
DrawGeometry(FormatBitmap *fb)
|
||||||
{
|
{
|
||||||
bitmap=fb;
|
bitmap=fb;
|
||||||
draw_color=0;
|
hgl_zero(draw_color);
|
||||||
alpha=1;
|
alpha=1;
|
||||||
|
blend=&no_blend;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~DrawGeometry()=default;
|
virtual ~DrawGeometry()=default;
|
||||||
@ -44,14 +46,9 @@ namespace hgl
|
|||||||
blend=bc;
|
blend=bc;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void SetBlend(const BlendMode &mode)
|
|
||||||
{
|
|
||||||
blend->mode=mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CloseBlend()
|
void CloseBlend()
|
||||||
{
|
{
|
||||||
blend->mode=BlendMode.NoBlend;
|
blend=&no_blend;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetAlpha(const float &a)
|
void SetAlpha(const float &a)
|
||||||
@ -80,7 +77,7 @@ namespace hgl
|
|||||||
|
|
||||||
if(!p)return(false);
|
if(!p)return(false);
|
||||||
|
|
||||||
*p=blend->Blend(draw_color,*p,alpha);
|
*p=(*blend)(draw_color,*p,alpha);
|
||||||
|
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
@ -102,7 +99,7 @@ namespace hgl
|
|||||||
T *p=bitmap->GetData(x,y);
|
T *p=bitmap->GetData(x,y);
|
||||||
|
|
||||||
for(int i=0;i<length;i++)
|
for(int i=0;i<length;i++)
|
||||||
*p++=blend->Blend(draw_color,*p,alpha);
|
*p++=(*blend)(draw_color,*p,alpha);
|
||||||
|
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
@ -129,7 +126,7 @@ namespace hgl
|
|||||||
for(int y=t;y<t+h;y++)
|
for(int y=t;y<t+h;y++)
|
||||||
{
|
{
|
||||||
for(int i=0;i<length;i++)
|
for(int i=0;i<length;i++)
|
||||||
*p++=blend->Blend(draw_color,*p,alpha);
|
*p++=(*blend)Blend(draw_color,*p,alpha);
|
||||||
|
|
||||||
p+=width-w;
|
p+=width-w;
|
||||||
}
|
}
|
||||||
@ -156,7 +153,7 @@ namespace hgl
|
|||||||
|
|
||||||
for(int i=0;i<length;i++)
|
for(int i=0;i<length;i++)
|
||||||
{
|
{
|
||||||
*p=blend->Blend(draw_color,*p,alpha);
|
*p=(*blend)Blend(draw_color,*p,alpha);
|
||||||
p+=line_bytes;
|
p+=line_bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user