Cairo now renders layers properly (colors are not saturated after layer composition), but slower.
This commit is contained in:
parent
062fc2d200
commit
ad4a72ff11
|
@ -612,6 +612,21 @@ void CAIRO_GAL::Restore()
|
|||
}
|
||||
|
||||
|
||||
void CAIRO_GAL::BeginLayer()
|
||||
{
|
||||
cairo_push_group( cairoImage );
|
||||
}
|
||||
|
||||
|
||||
void CAIRO_GAL::EndLayer()
|
||||
{
|
||||
storePath();
|
||||
|
||||
cairo_pop_group_to_source( cairoImage );
|
||||
cairo_paint_with_alpha( cairoImage, fillColor.a );
|
||||
}
|
||||
|
||||
|
||||
int CAIRO_GAL::BeginGroup()
|
||||
{
|
||||
// If the grouping is started: the actual path is stored in the group, when
|
||||
|
@ -693,15 +708,13 @@ void CAIRO_GAL::DrawGroup( int aGroupNumber )
|
|||
break;
|
||||
|
||||
case CMD_STROKE_PATH:
|
||||
cairo_set_source_rgba( cairoImage, strokeColor.r, strokeColor.g, strokeColor.b,
|
||||
strokeColor.a );
|
||||
cairo_set_source_rgb( cairoImage, strokeColor.r, strokeColor.g, strokeColor.b );
|
||||
cairo_append_path( cairoImage, it->cairoPath );
|
||||
cairo_stroke( cairoImage );
|
||||
break;
|
||||
|
||||
case CMD_FILL_PATH:
|
||||
cairo_set_source_rgba( cairoImage, fillColor.r, fillColor.g, fillColor.b,
|
||||
fillColor.a );
|
||||
cairo_set_source_rgb( cairoImage, fillColor.r, fillColor.g, fillColor.b );
|
||||
cairo_append_path( cairoImage, it->cairoPath );
|
||||
cairo_fill( cairoImage );
|
||||
break;
|
||||
|
@ -779,15 +792,13 @@ void CAIRO_GAL::storePath()
|
|||
{
|
||||
if( isFillEnabled )
|
||||
{
|
||||
cairo_set_source_rgba( cairoImage, fillColor.r, fillColor.g, fillColor.b,
|
||||
fillColor.a );
|
||||
cairo_set_source_rgb( cairoImage, fillColor.r, fillColor.g, fillColor.b );
|
||||
cairo_fill_preserve( cairoImage );
|
||||
}
|
||||
|
||||
if( isStrokeEnabled )
|
||||
{
|
||||
cairo_set_source_rgba( cairoImage, strokeColor.r, strokeColor.g, strokeColor.b,
|
||||
strokeColor.a );
|
||||
cairo_set_source_rgb( cairoImage, strokeColor.r, strokeColor.g, strokeColor.b );
|
||||
cairo_stroke_preserve( cairoImage );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1283,6 +1283,15 @@ void OPENGL_GAL::Restore()
|
|||
}
|
||||
|
||||
|
||||
void OPENGL_GAL::BeginLayer()
|
||||
{
|
||||
}
|
||||
|
||||
void OPENGL_GAL::EndLayer()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
// TODO Error handling
|
||||
int OPENGL_GAL::BeginGroup()
|
||||
{
|
||||
|
|
|
@ -419,9 +419,11 @@ void VIEW::redrawRect( const BOX2I& aRect )
|
|||
{
|
||||
drawItem drawFunc( this, l->id );
|
||||
|
||||
m_gal->BeginLayer();
|
||||
m_gal->SetLayerDepth( (double) l->renderingOrder );
|
||||
l->items->Query( aRect, drawFunc );
|
||||
l->isDirty = false;
|
||||
m_gal->EndLayer();
|
||||
|
||||
totalItems += drawFunc.count;
|
||||
totalDrawTime += drawFunc.time;
|
||||
|
|
|
@ -95,6 +95,12 @@ public:
|
|||
/// @copydoc GAL::EndDrawing()
|
||||
virtual void EndDrawing();
|
||||
|
||||
/// @copydoc GAL::BeginLayer()
|
||||
virtual void BeginLayer();
|
||||
|
||||
/// @copydoc GAL::EndLayer()
|
||||
virtual void EndLayer();
|
||||
|
||||
/// @copydoc GAL::DrawLine()
|
||||
virtual void DrawLine( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint );
|
||||
|
||||
|
|
|
@ -95,6 +95,12 @@ public:
|
|||
/// @brief End the drawing, needs to be called for every new frame.
|
||||
virtual void EndDrawing() = 0;
|
||||
|
||||
/// @brief Begin the layer drawing, needs to be called for every new layer.
|
||||
virtual void BeginLayer() = 0;
|
||||
|
||||
/// @brief Finish the layer drawing, needs to be called for every new layer.
|
||||
virtual void EndLayer() = 0;
|
||||
|
||||
/**
|
||||
* @brief Draw a line.
|
||||
*
|
||||
|
|
|
@ -102,6 +102,12 @@ public:
|
|||
/// @copydoc GAL::EndDrawing()
|
||||
virtual void EndDrawing();
|
||||
|
||||
/// @copydoc GAL::BeginLayer()
|
||||
virtual void BeginLayer();
|
||||
|
||||
/// @copydoc GAL::EndLayer()
|
||||
virtual void EndLayer();
|
||||
|
||||
/// @copydoc GAL::DrawLine()
|
||||
virtual void DrawLine( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint );
|
||||
|
||||
|
|
Loading…
Reference in New Issue