Index: cc/surfaces/surface_aggregator.cc |
diff --git a/cc/surfaces/surface_aggregator.cc b/cc/surfaces/surface_aggregator.cc |
index 588d624b4a12851e77e83384ed8028a226f58a9b..f5689c5b4cb4ace1f4afb2bb4d85f4d91e3e6f10 100644 |
--- a/cc/surfaces/surface_aggregator.cc |
+++ b/cc/surfaces/surface_aggregator.cc |
@@ -163,6 +163,7 @@ gfx::Rect SurfaceAggregator::DamageRectForSurface(const Surface* surface, |
} |
void SurfaceAggregator::HandleSurfaceQuad(const SurfaceDrawQuad* surface_quad, |
+ float opacity, |
RenderPass* dest_pass) { |
SurfaceId surface_id = surface_quad->surface_id; |
// If this surface's id is already in our referenced set then it creates |
@@ -227,11 +228,8 @@ void SurfaceAggregator::HandleSurfaceQuad(const SurfaceDrawQuad* surface_quad, |
copy_pass->transform_to_root_target.ConcatTransform( |
surface_quad->quadTransform()); |
- CopyQuadsToPass(source.quad_list, |
- source.shared_quad_state_list, |
- gfx::Transform(), |
- copy_pass.get(), |
- surface_id); |
+ CopyQuadsToPass(source.quad_list, source.shared_quad_state_list, |
+ gfx::Transform(), 1.f, copy_pass.get(), surface_id); |
dest_pass_list_->push_back(copy_pass.Pass()); |
} |
@@ -242,17 +240,16 @@ void SurfaceAggregator::HandleSurfaceQuad(const SurfaceDrawQuad* surface_quad, |
const QuadList& quads = last_pass.quad_list; |
// TODO(jamesr): Make sure clipping is enforced. |
- CopyQuadsToPass(quads, |
- last_pass.shared_quad_state_list, |
+ CopyQuadsToPass(quads, last_pass.shared_quad_state_list, |
surface_quad->quadTransform(), |
- dest_pass, |
- surface_id); |
+ surface_quad->opacity() * opacity, dest_pass, surface_id); |
} else { |
RenderPassId remapped_pass_id = RemapPassId(last_pass.id, surface_id); |
SharedQuadState* shared_quad_state = |
dest_pass->CreateAndAppendSharedQuadState(); |
shared_quad_state->CopyFrom(surface_quad->shared_quad_state); |
+ shared_quad_state->opacity *= opacity; |
RenderPassDrawQuad* quad = |
dest_pass->CreateAndAppendDrawQuad<RenderPassDrawQuad>(); |
quad->SetNew(shared_quad_state, |
@@ -300,6 +297,7 @@ void SurfaceAggregator::CopyQuadsToPass( |
const QuadList& source_quad_list, |
const SharedQuadStateList& source_shared_quad_state_list, |
const gfx::Transform& content_to_target_transform, |
+ float opacity, |
RenderPass* dest_pass, |
SurfaceId surface_id) { |
const SharedQuadState* last_copied_source_shared_quad_state = NULL; |
@@ -315,11 +313,12 @@ void SurfaceAggregator::CopyQuadsToPass( |
if (quad->material == DrawQuad::SURFACE_CONTENT) { |
const SurfaceDrawQuad* surface_quad = SurfaceDrawQuad::MaterialCast(quad); |
- HandleSurfaceQuad(surface_quad, dest_pass); |
+ HandleSurfaceQuad(surface_quad, opacity, dest_pass); |
} else { |
if (quad->shared_quad_state != last_copied_source_shared_quad_state) { |
CopySharedQuadState( |
quad->shared_quad_state, content_to_target_transform, dest_pass); |
+ dest_pass->shared_quad_state_list.back()->opacity *= opacity; |
last_copied_source_shared_quad_state = quad->shared_quad_state; |
} |
if (quad->material == DrawQuad::RENDER_PASS) { |
@@ -371,10 +370,8 @@ void SurfaceAggregator::CopyPasses(const DelegatedFrameData* frame_data, |
source.transform_to_root_target, |
source.has_transparent_background); |
- CopyQuadsToPass(source.quad_list, |
- source.shared_quad_state_list, |
- gfx::Transform(), |
- copy_pass.get(), |
+ CopyQuadsToPass(source.quad_list, source.shared_quad_state_list, |
+ gfx::Transform(), 1.f, copy_pass.get(), |
surface->surface_id()); |
dest_pass_list_->push_back(copy_pass.Pass()); |