Author: Nikita Kitaev <[email protected]>
Date:   Wed Mar 23 16:37:11 2011 -0700

Fix problems with cairo data formats

---

 synfig-core/src/synfig/layer.cpp           |    4 ++--
 synfig-core/src/synfig/target_scanline.cpp |   21 +++++++++++++++------
 2 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/synfig-core/src/synfig/layer.cpp b/synfig-core/src/synfig/layer.cpp
index fbc4c92..f0b43cc 100644
--- a/synfig-core/src/synfig/layer.cpp
+++ b/synfig-core/src/synfig/layer.cpp
@@ -577,7 +577,7 @@ Layer::cairo_render(Context 
context,Cairo::RefPtr<Cairo::Context> cr,int quality
        }
 
        // Create a new cairo image surface
-       Cairo::RefPtr< Cairo::ImageSurface > img_surface = 
Cairo::ImageSurface::create(Cairo::FORMAT_RGB24, renddesc.get_w(), 
renddesc.get_h());
+       Cairo::RefPtr< Cairo::ImageSurface > img_surface = 
Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, renddesc.get_w(), 
renddesc.get_h());
        int stride = img_surface->get_stride();
 
        // Copy the rendered image onto the cairo surface
@@ -591,7 +591,7 @@ Layer::cairo_render(Context 
context,Cairo::RefPtr<Cairo::Context> cr,int quality
                convert_color_format(
                        data+y*stride,surface[y],
                        renddesc.get_w(),
-                       PF_RGB|PF_A,
+                       PF_BGR|PF_A|PF_8BITS,
                        1.0/2.2 // Gamma \todo: use actual gamma
                        );
        }
diff --git a/synfig-core/src/synfig/target_scanline.cpp 
b/synfig-core/src/synfig/target_scanline.cpp
index 1d36352..9f076ca 100644
--- a/synfig-core/src/synfig/target_scanline.cpp
+++ b/synfig-core/src/synfig/target_scanline.cpp
@@ -286,10 +286,20 @@ synfig::Target_Scanline::render_frame_(int quality, 
ProgressCallback *cb, Render
                                return false;
                                break;
                        case CAIRO:
-                               Cairo::RefPtr< Cairo::ImageSurface > cr_surface 
= Cairo::ImageSurface::create(Cairo::FORMAT_RGB24, desc.get_w(), desc.get_h());
+                               Cairo::RefPtr< Cairo::ImageSurface > cr_surface 
= Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, desc.get_w(), desc.get_h());
 
                                Cairo::RefPtr<Cairo::Context> cr = 
Cairo::Context::create(cr_surface);
 
+                               if (get_remove_alpha())
+                               {
+                                       // If no alpha channel, draw a white 
background
+                                       cr->save();
+                                       cr->set_source_rgb(1,1,1);
+                                       
cr->set_operator(Cairo::OPERATOR_SOURCE);
+                                       cr->paint();
+                                       cr->restore();
+                               }
+
                                if(!context.cairo_render(cr,quality,desc,cb))
                                {
                                        // For some reason, the accelerated 
renderer failed.
@@ -466,12 +476,12 @@ Target_Scanline::add_frame(const unsigned char *data, 
const unsigned int width,
                return false;
        }
 
-    PixelFormat cairo_data_format = (PF_RGB | PF_A | PF_8BITS);
+    PixelFormat cairo_data_format = (PF_BGR | PF_A | PF_8BITS);
     int cairo_pixel_size = 4;
 
     int pixel_size = channels(target_format_);
-    if ( target_format_ && PF_16BITS) pixel_size *= 2;
-    if ( target_format_ && PF_32BITS) pixel_size *= 4;
+    //if ( target_format_ & PF_16BITS) pixel_size *= 2;
+    //if ( target_format_ & PF_32BITS) pixel_size *= 4;
 
        for (unsigned int y = 0; y < height; y++)
        {
@@ -482,7 +492,7 @@ Target_Scanline::add_frame(const unsigned char *data, const 
unsigned int width,
                        return false;
                }
 
-               if ( target_format_ == cairo_data_format )
+               if ( false && target_format_ == cairo_data_format )
                {
                        // Same format as cairo data
                        memcpy(colordata, data + (stride * y), width * 
cairo_pixel_size);
@@ -498,7 +508,6 @@ Target_Scanline::add_frame(const unsigned char *data, const 
unsigned int width,
                                   cairo_data_format,
                                   data + y * stride + x * cairo_pixel_size
                     );
-
                                Color2PixelFormat(c,
                                                                  
target_format_,
                                                                  colordata + x 
* pixel_size,


------------------------------------------------------------------------------
Enable your software for Intel(R) Active Management Technology to meet the
growing manageability and security demands of your customers. Businesses
are taking advantage of Intel(R) vPro (TM) technology - will your software 
be a part of the solution? Download the Intel(R) Manageability Checker 
today! http://p.sf.net/sfu/intel-dev2devmar
_______________________________________________
Synfig-devl mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/synfig-devl

Reply via email to