在0.2.2版本中,Nana C++ Library提供了一个灵活配置图像处理算法的机制。对于一个抽象的算法,可能会有多种实现。例如,Nana C++ Library提供了两个图像缩放算法,他们分别是双线性插值算法(bilinear interoplation)和最邻近插值(proximal interoplation),用户可以根据不同的需求来切换算法。
参考例子:
http://stdex.sourceforge.net/help/paint/image_process_selector.htm
由于跨平台的特性,Nana并没有使用特定的平台指令来实现内部提供的算法,这些代码应该很好地工作在不同的编译器环境中。在需要考虑算法效率的特定情况下,尽管 Nana C++ Library没有提供使用平台指令的算法,但是程序员可以自己实现这样的算法,并配置以供Nana库调用。
现在我们使用MMX指令实现一个图像混合算法。
实现一个可以被Nana库使用的图像混合算法,我们必须使用class blend_interface, 这个类定义在Nana头文件<nana/paint/image_process_interface.hpp>中。
class blend_interface
{
public:
virtual ~blend_interface() = 0;
virtual void process(nana::paint::drawable_type dw_dst, const nana::rectangle& r_dst,
const paint::pixel_buffer& s_pixbuf, const nana::point& s_pos, double fade_rate) const = 0;
};
dw_dst: 目标对象.
r_dst: 目标混合区域.
s_pixbuf: 源像素缓存.
s_pos: 源坐标.
fade_rate: 混合比率.
目标混合区域总是有效的,由Nana库在计算并验证之后传入到该函数中。因此我们在使用这些数据时不必检测它们是否有效。
该算法的语义:
dw_dst = dw_dst * fade_rate + s_pixbuf *(1 - fade_rate)
class blend_mmx
: public nana::paint::image_process::blend_interface
{
virtual void process(nana::paint::drawable_type dw_dst, const nana::rectangle& r_dst,
const paint::pixel_buffer& s_pixbuf, const nana::point& s_pos, double fade_rate) const
{
nana::paint::pixel_buffer d_pixbuf(dw_dst, r_dst.y, r_dst.height);
nana::pixel_rgb_t * d_rgb = d_pixbuf.raw_ptr();
if(d_rgb)
{
d_rgb += r_dst.x;
nana::pixel_rgb_t * s_rgb = s_pixbuf.raw_ptr(s_pos.y) + s_pos.x;
const unsigned rest = r_dst.width &
参考例子:
http://stdex.sourceforge.net/help/paint/image_process_selector.htm
由于跨平台的特性,Nana并没有使用特定的平台指令来实现内部提供的算法,这些代码应该很好地工作在不同的编译器环境中。在需要考虑算法效率的特定情况下,尽管 Nana C++ Library没有提供使用平台指令的算法,但是程序员可以自己实现这样的算法,并配置以供Nana库调用。
现在我们使用MMX指令实现一个图像混合算法。
实现一个可以被Nana库使用的图像混合算法,我们必须使用class blend_interface, 这个类定义在Nana头文件<nana/paint/image_process_interface.hpp>中。
class blend_interface
{
public:
virtual ~blend_interface() = 0;
virtual void process(nana::paint::drawable_type dw_dst, const nana::rectangle& r_dst,
const paint::pixel_buffer& s_pixbuf, const nana::point& s_pos, double fade_rate) const = 0;
};
dw_dst: 目标对象.
r_dst: 目标混合区域.
s_pixbuf: 源像素缓存.
s_pos: 源坐标.
fade_rate: 混合比率.
目标混合区域总是有效的,由Nana库在计算并验证之后传入到该函数中。因此我们在使用这些数据时不必检测它们是否有效。
该算法的语义:
dw_dst = dw_dst * fade_rate + s_pixbuf *(1 - fade_rate)
现在开始!
class blend_mmx
: public nana::paint::image_process::blend_interface
{
virtual void process(nana::paint::drawable_type dw_dst, const nana::rectangle& r_dst,
const paint::pixel_buffer& s_pixbuf, const nana::point& s_pos, double fade_rate) const
{
nana::paint::pixel_buffer d_pixbuf(dw_dst, r_dst.y, r_dst.height);
nana::pixel_rgb_t * d_rgb = d_pixbuf.raw_ptr();
if(d_rgb)
{
d_rgb += r_dst.x;
nana::pixel_rgb_t * s_rgb = s_pixbuf.raw_ptr(s_pos.y) + s_pos.x;
const unsigned rest = r_dst.width &