Author: Carlos Lopez <[email protected]>
Date: Wed Feb 27 18:32:27 2013 +0100
New target2cairo_image class to render to render to image buffer (ARGB32)
---
synfig-core/src/synfig/surface.cpp | 50 ++++++++++++++++++++++++++++++++++++
synfig-core/src/synfig/surface.h | 2 +
2 files changed, 52 insertions(+), 0 deletions(-)
diff --git a/synfig-core/src/synfig/surface.cpp
b/synfig-core/src/synfig/surface.cpp
index b24fc96..9d1ff92 100644
--- a/synfig-core/src/synfig/surface.cpp
+++ b/synfig-core/src/synfig/surface.cpp
@@ -50,7 +50,49 @@ using namespace etl;
/* === M A C R O S ========================================================= */
/* === G L O B A L S ======================================================= */
+class target2cairo_image: public synfig::Target_Cairo
+{
+public:
+ cairo_surface_t** image;
+ target2cairo_image(cairo_surface_t ** s);
+ virtual ~target2cairo_image();
+ virtual bool set_rend_desc(synfig::RendDesc *newdesc);
+ virtual bool obtain_surface(cairo_surface_t*& s);
+};
+
+target2cairo_image::target2cairo_image(cairo_surface_t ** s):image(s)
+{
+}
+
+target2cairo_image::~target2cairo_image()
+{
+}
+
+bool
+target2cairo_image::set_rend_desc(synfig::RendDesc *newdesc)
+{
+ assert(newdesc);
+ desc=*newdesc;
+ return synfig::Target_Cairo::set_rend_desc(newdesc);
+}
+
+bool
+target2cairo_image::obtain_surface(cairo_surface_t*& s)
+{
+ int sw=cairo_image_surface_get_width(*image);
+ int sh=cairo_image_surface_get_height(*image);
+ int w=desc.get_w(), h=desc.get_h();
+
+ if(sw!=w || sh!=w)
+ {
+ cairo_surface_destroy(*image);
+ *image = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w, h);
+ }
+ s=cairo_surface_reference(*image);
+ return true;
+}
+////
class target2surface : public synfig::Target_Scanline
{
public:
@@ -126,6 +168,14 @@ synfig::surface_target(Surface *surface)
return Target_Scanline::Handle(new target2surface(surface));
}
+
+Target_Cairo::Handle
+synfig::cairo_image_target(cairo_surface_t **surface)
+{
+ return Target_Cairo::Handle(new target2cairo_image(surface));
+}
+
+
void
synfig::Surface::clear()
{
diff --git a/synfig-core/src/synfig/surface.h b/synfig-core/src/synfig/surface.h
index 70b38a0..66800f0 100644
--- a/synfig-core/src/synfig/surface.h
+++ b/synfig-core/src/synfig/surface.h
@@ -266,6 +266,8 @@ public:
//! Creates a target that will render to \a surface
etl::handle<Target_Scanline> surface_target(Surface *surface);
+//!Creates a target that will render to a cairo_surface_t image surface
+etl::handle<Target_Cairo> cairo_image_target(cairo_surface_t** surface);
}; // END of namespace synfig
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________
Synfig-devl mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/synfig-devl