Chromium Code Reviews| Index: cc/texture_layer_impl.cc |
| diff --git a/cc/texture_layer_impl.cc b/cc/texture_layer_impl.cc |
| index e8a68741855891ef8d8e1317942c96484d7994bc..149f9ac17f02ec90b9d3a0b168e0ad49858893cd 100644 |
| --- a/cc/texture_layer_impl.cc |
| +++ b/cc/texture_layer_impl.cc |
| @@ -45,6 +45,61 @@ void TextureLayerImpl::appendQuads(QuadSink& quadSink, AppendQuadsData& appendQu |
| gfx::Rect opaqueRect(contentsOpaque() ? quadRect : gfx::Rect()); |
| scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create(); |
| quad->SetNew(sharedQuadState, quadRect, opaqueRect, m_externalTextureResource, m_premultipliedAlpha, m_uvRect, m_flipped); |
| + |
| + if (quad->quadTransform().IsScaleOrTranslation()) |
|
shawnsingh
2012/12/03 23:37:52
A few more thoughts:
(1) Don't we need an isClipp
whunt
2012/12/04 00:01:24
I added the isClipped check.
I can make it a help
|
| + { |
| + // Grab the corners of our boxes. |
| + float rect_min_x = quad->rect.x(); |
| + float rect_min_y = quad->rect.y(); |
| + float rect_max_x = rect_min_x + quad->rect.width(); |
| + float rect_max_y = rect_min_y + quad->rect.height(); |
| + |
| + // Grab the relevant values from our matrix. |
| + float x_scale = quad->quadTransform().matrix().getDouble(0,0); |
| + float y_scale = quad->quadTransform().matrix().getDouble(1,1); |
| + float x_offset = quad->quadTransform().matrix().getDouble(0,3); |
| + float y_offset = quad->quadTransform().matrix().getDouble(1,3); |
| + |
| + // Transform the rect to the same space as the clip. |
| + rect_min_x = x_scale * rect_min_x + x_offset; |
| + rect_min_y = y_scale * rect_min_y + y_offset; |
| + rect_max_x = x_scale * rect_max_x + x_offset; |
| + rect_max_y = y_scale * rect_max_y + y_offset; |
| + |
| + // Grab the clipped region. |
| + float clip_min_x = quad->clipRect().x(); |
| + float clip_min_y = quad->clipRect().y(); |
| + float clip_max_x = clip_min_x + quad->clipRect().width(); |
| + float clip_max_y = clip_min_y + quad->clipRect().height(); |
| + |
| + // Perform clipping on the rect. |
|
shawnsingh
2012/12/03 23:34:08
Unless there's some performance caveats, I think w
whunt
2012/12/04 00:01:24
There are certainly performance caveats to using g
jamesr
2012/12/04 00:15:42
Would you mind running cc_perftests on this with t
whunt
2012/12/04 19:35:04
Given that this code gets run ~8 times/frame in th
|
| + float min_x = std::max(rect_min_x, clip_min_x); |
| + float min_y = std::max(rect_min_y, clip_min_y); |
| + float max_x = std::min(rect_max_x, clip_max_x); |
| + float max_y = std::min(rect_max_y, clip_max_y); |
| + |
| + // Empty bounds mean that this is clipped completely away. |
| + if (min_x > max_x || min_y > max_y) |
| + return; |
| + |
| + // Create a new uv-rect by clipping the old one to the new bounds. |
| + quad->uv_rect = gfx::RectF( |
| + quad->uv_rect.x() + quad->uv_rect.width () * (1.0f / (rect_max_x - rect_min_x)) * (min_x - rect_min_x), |
|
shawnsingh
2012/12/03 23:34:08
how about (min_x - rect_min_x) / (rect_max_x - rec
whunt
2012/12/04 00:01:24
Ditto as previous comment.
On 2012/12/03 23:34:08
|
| + quad->uv_rect.y() + quad->uv_rect.height() * (1.0f / (rect_max_y - rect_min_y)) * (min_y - rect_min_y), |
| + quad->uv_rect.width () * (1.0f / (rect_max_x - rect_min_x)) * (max_x - min_x), |
| + quad->uv_rect.height() * (1.0f / (rect_max_y - rect_min_y)) * (max_y - min_y)); |
| + |
| + // Move the clipped rectangle back into its space. |
| + quad->rect = gfx::Rect( |
|
shawnsingh
2012/12/03 23:34:08
Its likely that scaling and translation are operat
whunt
2012/12/04 00:01:24
Ditto again.
On 2012/12/03 23:34:08, shawnsingh w
|
| + (int)((min_x - x_offset) * (1.0f / x_scale) + 0.5f), |
|
jamesr
2012/12/04 00:15:42
we prefer c++ style casts to c-style cases in chro
|
| + (int)((min_y - y_offset) * (1.0f / y_scale) + 0.5f), |
| + (int)((max_x - min_x) * (1.0f / x_scale) + 0.5f), |
| + (int)((max_y - min_y) * (1.0f / y_scale) + 0.5f)); |
| + |
| + // Disable hardware clipping |
| + sharedQuadState->is_clipped = false; |
| + } |
| + |
| quadSink.append(quad.PassAs<DrawQuad>(), appendQuadsData); |
| } |