Chromium Code Reviews| Index: core/cross/cairo/renderer_cairo.cc |
| =================================================================== |
| --- core/cross/cairo/renderer_cairo.cc (revision 72006) |
| +++ core/cross/cairo/renderer_cairo.cc (working copy) |
| @@ -85,6 +85,9 @@ |
| // without an alpha channel). |
| cairo_push_group_with_content(current_drawing, CAIRO_CONTENT_COLOR); |
| + // Set fill (and clip) rule. |
| + cairo_set_fill_rule(current_drawing, CAIRO_FILL_RULE_EVEN_ODD); |
| + |
| // Sort layers by z value. |
| // TODO(tschmelcher): Only sort when changes are made. |
| layer_list_.sort(LayerZValueLessThan); |
| @@ -103,19 +106,20 @@ |
| // Save the current drawing state. |
| cairo_save(current_drawing); |
| - // Clip areas that will be obscured anyway. |
| - LayerList::iterator start_mask_it = i; |
| - start_mask_it++; |
| - ClipArea(current_drawing, start_mask_it); |
| - |
| - // Define the region to fill. |
| + // Clip the region outside the current Layer. |
| cairo_rectangle(current_drawing, |
| cur->x(), |
| cur->y(), |
| cur->width(), |
| cur->height()); |
| + cairo_clip(current_drawing); |
| - // Transform the pattern to fit into the fill region. |
| + // Clip the regions within other Layers that will obscure this one. |
| + LayerList::iterator start_mask_it = i; |
| + start_mask_it++; |
| + ClipArea(current_drawing, start_mask_it); |
| + |
| + // Transform the pattern to fit into the Layer's region. |
| cairo_translate(current_drawing, cur->x(), cur->y()); |
| cairo_scale(current_drawing, cur->scale_x(), cur->scale_y()); |
| @@ -125,29 +129,32 @@ |
| // Paint the pattern to the off-screen surface. |
| switch (cur->paint_operator()) { |
| case Layer::BLEND: |
| - cairo_fill(current_drawing); |
| + cairo_paint(current_drawing); |
| break; |
| case Layer::BLEND_WITH_TRANSPARENCY: |
| - { |
| - cairo_pattern_t* mask = cairo_pattern_create_rgba(0.0, |
| - 0.0, |
| - 0.0, |
| - cur->alpha()); |
| - cairo_mask(current_drawing, mask); |
| - cairo_pattern_destroy(mask); |
| - } |
| + cairo_paint_with_alpha(current_drawing, cur->alpha()); |
| break; |
| - // TODO(tschmelcher): COPY_WITH_FADING is not implemented yet. For now |
| - // we treat it the same as COPY. |
| - case Layer::COPY_WITH_FADING: |
| case Layer::COPY: |
| // Set Cairo to copy the pattern's alpha content instead of blending. |
| cairo_set_operator(current_drawing, CAIRO_OPERATOR_SOURCE); |
| - cairo_fill(current_drawing); |
| + cairo_paint(current_drawing); |
| break; |
| + case Layer::COPY_WITH_FADING: |
| + // This can also be done in a single operation with: |
| + // |
| + // cairo_set_operator(current_drawing, CAIRO_OPERATOR_IN); |
| + // cairo_paint_with_alpha(current_drawing, cur->alpha()); |
| + // |
| + // but surprisingly that is slightly slower for me ... |
|
fbarchard
2011/01/21 02:26:00
comment should not say 'me' or people will wonder
Tristan Schmelcher 2
2011/01/21 18:31:29
Done.
|
| + cairo_set_operator(current_drawing, CAIRO_OPERATOR_CLEAR); |
| + cairo_paint(current_drawing); |
| + cairo_set_operator(current_drawing, CAIRO_OPERATOR_OVER); |
| + cairo_paint_with_alpha(current_drawing, cur->alpha()); |
| + break; |
| + |
| default: |
| DCHECK(false); |
| } |
| @@ -177,8 +184,6 @@ |
| } |
| void RendererCairo::ClipArea(cairo_t* cr, LayerList::iterator it) { |
| - cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD); |
| - |
| for (LayerList::iterator i = it; i != layer_list_.end(); i++) { |
| // Preparing and updating the Layer. |
| Layer* cur = *i; |