00001
00021
00022
00023
00024
00025 #ifndef __SYNFIG_SURFACE_H
00026 #define __SYNFIG_SURFACE_H
00027
00028
00029
00030 #include "color.h"
00031 #include "renddesc.h"
00032 #include <ETL/pen>
00033 #include <ETL/surface>
00034 #include <ETL/handle>
00035
00036
00037
00038
00039
00040
00041
00042 namespace synfig {
00043
00044 class Target;
00045 class Target_Scanline;
00046
00047 class ColorPrep
00048 {
00049 public:
00050 ColorAccumulator cook(Color x)const
00051 {
00052 x.set_r(x.get_r()*x.get_a());
00053 x.set_g(x.get_g()*x.get_a());
00054 x.set_b(x.get_b()*x.get_a());
00055 return x;
00056 }
00057 Color uncook(ColorAccumulator x)const
00058 {
00059 if(!x.get_a())
00060 return Color::alpha();
00061
00062 const float a(1.0f/x.get_a());
00063
00064 x.set_r(x.get_r()*a);
00065 x.set_g(x.get_g()*a);
00066 x.set_b(x.get_b()*a);
00067 return x;
00068 }
00069 };
00070
00075 class Surface : public etl::surface<Color, ColorAccumulator, ColorPrep>
00076 {
00077 public:
00078 typedef Color value_type;
00079 class alpha_pen;
00080
00081 Surface() { }
00082
00083 Surface(const size_type::value_type &w, const size_type::value_type &h):
00084 etl::surface<Color, ColorAccumulator,ColorPrep>(w,h) { }
00085
00086 Surface(const size_type &s):
00087 etl::surface<Color, ColorAccumulator,ColorPrep>(s) { }
00088
00089 template <typename _pen>
00090 Surface(const _pen &_begin, const _pen &_end):
00091 etl::surface<Color, ColorAccumulator,ColorPrep>(_begin,_end) { }
00092
00093 template <class _pen> void blit_to(_pen &pen)
00094 { return blit_to(pen,0,0, get_w(),get_h()); }
00095
00096 template <class _pen> void
00097 blit_to(_pen& DEST_PEN, int x, int y, int w, int h)
00098 {
00099 etl::surface<Color, ColorAccumulator, ColorPrep>::blit_to(DEST_PEN,x,y,w,h);
00100 }
00101
00102 void clear();
00103
00104 void blit_to(alpha_pen& DEST_PEN, int x, int y, int w, int h);
00105 };
00106
00107 #ifndef DOXYGEN_SKIP
00108
00110 struct _BlendFunc
00111 {
00112 Color::BlendMethod blend_method;
00113
00114 _BlendFunc(Color::BlendMethod b= Color::BLEND_COMPOSITE):blend_method(b) { }
00115
00116 Color operator()(const Color &a,const Color &b,const Color::value_type &t)const
00117 {
00118 return Color::blend(b,a,t,blend_method);
00119 }
00120 };
00121
00122 #endif
00123
00133 class Surface::alpha_pen : public etl::alpha_pen< etl::generic_pen<Color, ColorAccumulator>, Color::value_type, _BlendFunc >
00134 {
00135 public:
00136 alpha_pen() { }
00137 alpha_pen(const etl::alpha_pen< etl::generic_pen<Color, ColorAccumulator>, Color::value_type, _BlendFunc > &x):
00138 etl::alpha_pen< etl::generic_pen<Color, ColorAccumulator>, Color::value_type, _BlendFunc >(x)
00139 { }
00140
00141 alpha_pen(const etl::generic_pen<Color, ColorAccumulator>& pen, const Color::value_type &a = 1, const _BlendFunc &func = _BlendFunc()):
00142 etl::alpha_pen< etl::generic_pen<Color, ColorAccumulator>, Color::value_type, _BlendFunc >(pen,a,func)
00143 { }
00144
00146 void set_blend_method(Color::BlendMethod method) { affine_func_.blend_method=method; }
00147
00149 Color::BlendMethod get_blend_method()const { return affine_func_.blend_method; }
00150 };
00151
00153 etl::handle<Target_Scanline> surface_target(Surface *surface);
00154
00155 };
00156
00157
00158
00159 #endif