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); |