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