Chromium Code Reviews| Index: ui/accelerated_widget_mac/ca_renderer_layer_tree.mm |
| diff --git a/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm b/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm |
| index c13cb5d25ceafb0a46aef3d7abd0877ae48f01dc..6900508b45b857a06944d74fb756e9462f03f005 100644 |
| --- a/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm |
| +++ b/ui/accelerated_widget_mac/ca_renderer_layer_tree.mm |
| @@ -141,7 +141,8 @@ bool CARendererLayerTree::ScheduleCALayer( |
| const gfx::Rect& rect, |
| unsigned background_color, |
| unsigned edge_aa_mask, |
| - float opacity) { |
| + float opacity, |
| + unsigned filter) { |
| // Excessive logging to debug white screens (crbug.com/583805). |
| // TODO(ccameron): change this back to a DLOG. |
| if (has_committed_) { |
| @@ -151,7 +152,7 @@ bool CARendererLayerTree::ScheduleCALayer( |
| return root_layer_.AddContentLayer(is_clipped, clip_rect, sorting_context_id, |
| transform, io_surface, cv_pixel_buffer, |
| contents_rect, rect, background_color, |
| - edge_aa_mask, opacity); |
| + edge_aa_mask, opacity, filter); |
| } |
| void CARendererLayerTree::CommitScheduledCALayers( |
| @@ -285,7 +286,8 @@ CARendererLayerTree::ContentLayer::ContentLayer( |
| const gfx::Rect& rect, |
| unsigned background_color, |
| unsigned edge_aa_mask, |
| - float opacity) |
| + float opacity, |
| + unsigned filter) |
| : io_surface(io_surface), |
| cv_pixel_buffer(cv_pixel_buffer), |
| contents_rect(contents_rect), |
| @@ -293,6 +295,13 @@ CARendererLayerTree::ContentLayer::ContentLayer( |
| background_color(background_color), |
| ca_edge_aa_mask(0), |
| opacity(opacity) { |
| + DCHECK(filter == GL_LINEAR || filter == GL_NEAREST); |
| + if (filter == GL_LINEAR) { |
| + ca_filter.reset([kCAFilterLinear retain]); |
| + } else { |
| + ca_filter.reset([kCAFilterNearest retain]); |
| + } |
| + |
| // Because the root layer has setGeometryFlipped:YES, there is some ambiguity |
| // about what exactly top and bottom mean. This ambiguity is resolved in |
| // different ways for solid color CALayers and for CALayers that have content |
| @@ -338,6 +347,7 @@ CARendererLayerTree::ContentLayer::ContentLayer(ContentLayer&& layer) |
| background_color(layer.background_color), |
| ca_edge_aa_mask(layer.ca_edge_aa_mask), |
| opacity(layer.opacity), |
| + ca_filter(std::move(layer.ca_filter)), |
|
ccameron
2016/04/27 22:45:48
Cause then we don't have to do the move here.
erikchen
2016/04/28 01:18:21
Done.
|
| ca_layer(std::move(layer.ca_layer)), |
| av_layer(std::move(layer.av_layer)), |
| use_av_layer(layer.use_av_layer) { |
| @@ -360,7 +370,8 @@ bool CARendererLayerTree::RootLayer::AddContentLayer( |
| const gfx::Rect& rect, |
| unsigned background_color, |
| unsigned edge_aa_mask, |
| - float opacity) { |
| + float opacity, |
| + unsigned filter) { |
| bool needs_new_clip_and_sorting_layer = true; |
| // In sorting_context_id 0, all quads are listed in back-to-front order. |
| @@ -398,7 +409,7 @@ bool CARendererLayerTree::RootLayer::AddContentLayer( |
| } |
| clip_and_sorting_layers.back().AddContentLayer( |
| transform, io_surface, cv_pixel_buffer, contents_rect, rect, |
| - background_color, edge_aa_mask, opacity); |
| + background_color, edge_aa_mask, opacity, filter); |
| return true; |
| } |
| @@ -410,7 +421,8 @@ void CARendererLayerTree::ClipAndSortingLayer::AddContentLayer( |
| const gfx::Rect& rect, |
| unsigned background_color, |
| unsigned edge_aa_mask, |
| - float opacity) { |
| + float opacity, |
| + unsigned filter) { |
| bool needs_new_transform_layer = true; |
| if (!transform_layers.empty()) { |
| const TransformLayer& current_layer = transform_layers.back(); |
| @@ -421,7 +433,7 @@ void CARendererLayerTree::ClipAndSortingLayer::AddContentLayer( |
| transform_layers.push_back(TransformLayer(transform)); |
| transform_layers.back().AddContentLayer(io_surface, cv_pixel_buffer, |
| contents_rect, rect, background_color, |
| - edge_aa_mask, opacity); |
| + edge_aa_mask, opacity, filter); |
| } |
| void CARendererLayerTree::TransformLayer::AddContentLayer( |
| @@ -431,10 +443,11 @@ void CARendererLayerTree::TransformLayer::AddContentLayer( |
| const gfx::Rect& rect, |
| unsigned background_color, |
| unsigned edge_aa_mask, |
| - float opacity) { |
| + float opacity, |
| + unsigned filter) { |
| content_layers.push_back(ContentLayer(io_surface, cv_pixel_buffer, |
| contents_rect, rect, background_color, |
| - edge_aa_mask, opacity)); |
| + edge_aa_mask, opacity, filter)); |
| } |
| void CARendererLayerTree::RootLayer::CommitToCA(CALayer* superlayer, |
| @@ -561,6 +574,7 @@ void CARendererLayerTree::ContentLayer::CommitToCA(CALayer* superlayer, |
| bool update_background_color = true; |
| bool update_ca_edge_aa_mask = true; |
| bool update_opacity = true; |
| + bool update_ca_filter = true; |
| if (old_layer && old_layer->use_av_layer == use_av_layer) { |
| DCHECK(old_layer->ca_layer); |
| std::swap(ca_layer, old_layer->ca_layer); |
| @@ -572,6 +586,7 @@ void CARendererLayerTree::ContentLayer::CommitToCA(CALayer* superlayer, |
| update_background_color = old_layer->background_color != background_color; |
| update_ca_edge_aa_mask = old_layer->ca_edge_aa_mask != ca_edge_aa_mask; |
| update_opacity = old_layer->opacity != opacity; |
| + update_ca_filter = ![old_layer->ca_filter isEqualToString:ca_filter]; |
|
ccameron
2016/04/27 22:45:48
And we can just do a ptr compare.
erikchen
2016/04/28 01:18:21
Done.
|
| } else { |
| if (use_av_layer) { |
| av_layer.reset([[AVSampleBufferDisplayLayer alloc] init]); |
| @@ -586,7 +601,8 @@ void CARendererLayerTree::ContentLayer::CommitToCA(CALayer* superlayer, |
| DCHECK_EQ([ca_layer superlayer], superlayer); |
| bool update_anything = update_contents || update_contents_rect || |
| update_rect || update_background_color || |
| - update_ca_edge_aa_mask || update_opacity; |
| + update_ca_edge_aa_mask || update_opacity || |
| + update_ca_filter; |
| if (use_av_layer) { |
| if (update_contents) { |
| if (cv_pixel_buffer) { |
| @@ -626,6 +642,10 @@ void CARendererLayerTree::ContentLayer::CommitToCA(CALayer* superlayer, |
| [ca_layer setEdgeAntialiasingMask:ca_edge_aa_mask]; |
| if (update_opacity) |
| [ca_layer setOpacity:opacity]; |
| + if (update_ca_filter) { |
| + [ca_layer setMagnificationFilter:ca_filter]; |
| + [ca_layer setMinificationFilter:ca_filter]; |
| + } |
| static bool show_borders = base::CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kShowMacOverlayBorders); |