Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(220)

Side by Side Diff: cc/occlusion_tracker.cc

Issue 11644008: Migrate from MathUtil::inverse() to gfx::Transform::GetInverse() (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Partially addressed uninvertible cases Created 7 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/occlusion_tracker.h" 5 #include "cc/occlusion_tracker.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "cc/layer.h" 9 #include "cc/layer.h"
10 #include "cc/layer_impl.h" 10 #include "cc/layer_impl.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 49
50 if (layerIterator.representsItself) 50 if (layerIterator.representsItself)
51 markOccludedBehindLayer(layerIterator.currentLayer); 51 markOccludedBehindLayer(layerIterator.currentLayer);
52 else if (layerIterator.representsContributingRenderSurface) 52 else if (layerIterator.representsContributingRenderSurface)
53 leaveToRenderTarget(renderTarget); 53 leaveToRenderTarget(renderTarget);
54 } 54 }
55 55
56 template<typename RenderSurfaceType> 56 template<typename RenderSurfaceType>
57 static gfx::Rect screenSpaceClipRectInTargetSurface(const RenderSurfaceType* tar getSurface, gfx::Rect screenSpaceClipRect) 57 static gfx::Rect screenSpaceClipRectInTargetSurface(const RenderSurfaceType* tar getSurface, gfx::Rect screenSpaceClipRect)
58 { 58 {
59 gfx::Transform inverseScreenSpaceTransform; 59 gfx::Transform inverseScreenSpaceTransform(gfx::Transform::kSkipInitializati on);
60 if (!targetSurface->screenSpaceTransform().GetInverse(&inverseScreenSpaceTra nsform)) 60 if (!targetSurface->screenSpaceTransform().GetInverse(&inverseScreenSpaceTra nsform))
61 return targetSurface->contentRect(); 61 return targetSurface->contentRect();
62 62
63 return gfx::ToEnclosingRect(MathUtil::projectClippedRect(inverseScreenSpaceT ransform, screenSpaceClipRect)); 63 return gfx::ToEnclosingRect(MathUtil::projectClippedRect(inverseScreenSpaceT ransform, screenSpaceClipRect));
64 } 64 }
65 65
66 template<typename RenderSurfaceType> 66 template<typename RenderSurfaceType>
67 static Region transformSurfaceOpaqueRegion(const Region& region, bool haveClipRe ct, gfx::Rect clipRectInNewTarget, const gfx::Transform& transform) 67 static Region transformSurfaceOpaqueRegion(const Region& region, bool haveClipRe ct, gfx::Rect clipRectInNewTarget, const gfx::Transform& transform)
68 { 68 {
69 if (region.IsEmpty()) 69 if (region.IsEmpty())
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 119
120 // We copy the screen occlusion into the new RenderSurface subtree, but we n ever copy in the 120 // We copy the screen occlusion into the new RenderSurface subtree, but we n ever copy in the
121 // occlusion from inside the target, since we are looking at a new RenderSur face target. 121 // occlusion from inside the target, since we are looking at a new RenderSur face target.
122 122
123 // If we are entering a subtree that is going to move pixels around, then th e occlusion we've computed 123 // If we are entering a subtree that is going to move pixels around, then th e occlusion we've computed
124 // so far won't apply to the pixels we're drawing here in the same way. We d iscard the occlusion thus 124 // so far won't apply to the pixels we're drawing here in the same way. We d iscard the occlusion thus
125 // far to be safe, and ensure we don't cull any pixels that are moved such t hat they become visible. 125 // far to be safe, and ensure we don't cull any pixels that are moved such t hat they become visible.
126 bool enteringSubtreeThatMovesPixels = newAncestorThatMovesPixels && newAnces torThatMovesPixels != oldAncestorThatMovesPixels; 126 bool enteringSubtreeThatMovesPixels = newAncestorThatMovesPixels && newAnces torThatMovesPixels != oldAncestorThatMovesPixels;
127 127
128 bool haveTransformFromScreenToNewTarget = false; 128 bool haveTransformFromScreenToNewTarget = false;
129 gfx::Transform inverseNewTargetScreenSpaceTransform; 129 gfx::Transform inverseNewTargetScreenSpaceTransform(gfx::Transform::kSkipIni tialization); // Note carefully, not used if screen space transform is uninverti ble.
130 if (surfaceTransformsToScreenKnown(newTarget->renderSurface())) 130 if (surfaceTransformsToScreenKnown(newTarget->renderSurface()))
131 haveTransformFromScreenToNewTarget = newTarget->renderSurface()->screenS paceTransform().GetInverse(&inverseNewTargetScreenSpaceTransform); 131 haveTransformFromScreenToNewTarget = newTarget->renderSurface()->screenS paceTransform().GetInverse(&inverseNewTargetScreenSpaceTransform);
132 132
133 bool enteringRootTarget = newTarget->parent() == NULL; 133 bool enteringRootTarget = newTarget->parent() == NULL;
134 134
135 bool copyOutsideOcclusionForward = m_stack.size() > 1 && !enteringSubtreeTha tMovesPixels && haveTransformFromScreenToNewTarget && !enteringRootTarget; 135 bool copyOutsideOcclusionForward = m_stack.size() > 1 && !enteringSubtreeTha tMovesPixels && haveTransformFromScreenToNewTarget && !enteringRootTarget;
136 if (!copyOutsideOcclusionForward) 136 if (!copyOutsideOcclusionForward)
137 return; 137 return;
138 138
139 int lastIndex = m_stack.size() - 1; 139 int lastIndex = m_stack.size() - 1;
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
348 return false; 348 return false;
349 349
350 // For tests with no render target. 350 // For tests with no render target.
351 if (!renderTarget) 351 if (!renderTarget)
352 return false; 352 return false;
353 353
354 DCHECK(renderTarget->renderTarget() == renderTarget); 354 DCHECK(renderTarget->renderTarget() == renderTarget);
355 DCHECK(renderTarget->renderSurface()); 355 DCHECK(renderTarget->renderSurface());
356 DCHECK(renderTarget == m_stack.back().target); 356 DCHECK(renderTarget == m_stack.back().target);
357 357
358 gfx::Transform inverseDrawTransform; 358 gfx::Transform inverseDrawTransform(gfx::Transform::kSkipInitialization);
359 if (!drawTransform.GetInverse(&inverseDrawTransform)) 359 if (!drawTransform.GetInverse(&inverseDrawTransform))
360 return false; 360 return false;
361 361
362 // Take the ToEnclosingRect at each step, as we want to contain any unocclud ed partial pixels in the resulting Rect. 362 // Take the ToEnclosingRect at each step, as we want to contain any unocclud ed partial pixels in the resulting Rect.
363 gfx::Rect contentRectInTargetSurface = gfx::ToEnclosingRect(MathUtil::mapCli ppedRect(drawTransform, gfx::RectF(contentRect))); 363 gfx::Rect contentRectInTargetSurface = gfx::ToEnclosingRect(MathUtil::mapCli ppedRect(drawTransform, gfx::RectF(contentRect)));
364 contentRectInTargetSurface.Intersect(clippedRectInTarget); 364 contentRectInTargetSurface.Intersect(clippedRectInTarget);
365 contentRectInTargetSurface.Intersect(screenSpaceClipRectInTargetSurface(rend erTarget->renderSurface(), m_screenSpaceClipRect)); 365 contentRectInTargetSurface.Intersect(screenSpaceClipRectInTargetSurface(rend erTarget->renderSurface(), m_screenSpaceClipRect));
366 366
367 Region unoccludedRegionInTargetSurface = contentRectInTargetSurface; 367 Region unoccludedRegionInTargetSurface = contentRectInTargetSurface;
368 unoccludedRegionInTargetSurface.Subtract(m_stack.back().occlusionFromInsideT arget); 368 unoccludedRegionInTargetSurface.Subtract(m_stack.back().occlusionFromInsideT arget);
(...skipping 22 matching lines...) Expand all
391 return contentRect; 391 return contentRect;
392 392
393 // For tests with no render target. 393 // For tests with no render target.
394 if (!renderTarget) 394 if (!renderTarget)
395 return contentRect; 395 return contentRect;
396 396
397 DCHECK(renderTarget->renderTarget() == renderTarget); 397 DCHECK(renderTarget->renderTarget() == renderTarget);
398 DCHECK(renderTarget->renderSurface()); 398 DCHECK(renderTarget->renderSurface());
399 DCHECK(renderTarget == m_stack.back().target); 399 DCHECK(renderTarget == m_stack.back().target);
400 400
401 gfx::Transform inverseDrawTransform; 401 gfx::Transform inverseDrawTransform(gfx::Transform::kSkipInitialization);
402 if (!drawTransform.GetInverse(&inverseDrawTransform)) 402 if (!drawTransform.GetInverse(&inverseDrawTransform))
403 return contentRect; 403 return contentRect;
404 404
405 // Take the ToEnclosingRect at each step, as we want to contain any unocclud ed partial pixels in the resulting Rect. 405 // Take the ToEnclosingRect at each step, as we want to contain any unocclud ed partial pixels in the resulting Rect.
406 gfx::Rect contentRectInTargetSurface = gfx::ToEnclosingRect(MathUtil::mapCli ppedRect(drawTransform, gfx::RectF(contentRect))); 406 gfx::Rect contentRectInTargetSurface = gfx::ToEnclosingRect(MathUtil::mapCli ppedRect(drawTransform, gfx::RectF(contentRect)));
407 contentRectInTargetSurface.Intersect(clippedRectInTarget); 407 contentRectInTargetSurface.Intersect(clippedRectInTarget);
408 contentRectInTargetSurface.Intersect(screenSpaceClipRectInTargetSurface(rend erTarget->renderSurface(), m_screenSpaceClipRect)); 408 contentRectInTargetSurface.Intersect(screenSpaceClipRectInTargetSurface(rend erTarget->renderSurface(), m_screenSpaceClipRect));
409 409
410 Region unoccludedRegionInTargetSurface = contentRectInTargetSurface; 410 Region unoccludedRegionInTargetSurface = contentRectInTargetSurface;
411 unoccludedRegionInTargetSurface.Subtract(m_stack.back().occlusionFromInsideT arget); 411 unoccludedRegionInTargetSurface.Subtract(m_stack.back().occlusionFromInsideT arget);
(...skipping 28 matching lines...) Expand all
440 if (contentRect.IsEmpty()) 440 if (contentRect.IsEmpty())
441 return contentRect; 441 return contentRect;
442 442
443 const RenderSurfaceType* surface = layer->renderSurface(); 443 const RenderSurfaceType* surface = layer->renderSurface();
444 const LayerType* contributingSurfaceRenderTarget = layer->parent()->renderTa rget(); 444 const LayerType* contributingSurfaceRenderTarget = layer->parent()->renderTa rget();
445 445
446 if (!surfaceTransformsToTargetKnown(surface)) 446 if (!surfaceTransformsToTargetKnown(surface))
447 return contentRect; 447 return contentRect;
448 448
449 gfx::Transform drawTransform = forReplica ? surface->replicaDrawTransform() : surface->drawTransform(); 449 gfx::Transform drawTransform = forReplica ? surface->replicaDrawTransform() : surface->drawTransform();
450 gfx::Transform inverseDrawTransform; 450 gfx::Transform inverseDrawTransform(gfx::Transform::kSkipInitialization);
451 if (!drawTransform.GetInverse(&inverseDrawTransform)) 451 if (!drawTransform.GetInverse(&inverseDrawTransform))
452 return contentRect; 452 return contentRect;
453 453
454 // Take the ToEnclosingRect at each step, as we want to contain any unocclud ed partial pixels in the resulting Rect. 454 // Take the ToEnclosingRect at each step, as we want to contain any unocclud ed partial pixels in the resulting Rect.
455 gfx::Rect contentRectInTargetSurface = gfx::ToEnclosingRect(MathUtil::mapCli ppedRect(drawTransform, gfx::RectF(contentRect))); 455 gfx::Rect contentRectInTargetSurface = gfx::ToEnclosingRect(MathUtil::mapCli ppedRect(drawTransform, gfx::RectF(contentRect)));
456 if (surface->isClipped()) { 456 if (surface->isClipped()) {
457 contentRectInTargetSurface.Intersect(surface->clipRect()); 457 contentRectInTargetSurface.Intersect(surface->clipRect());
458 } else { 458 } else {
459 contentRectInTargetSurface.Intersect(contributingSurfaceRenderTarget->re nderSurface()->contentRect()); 459 contentRectInTargetSurface.Intersect(contributingSurfaceRenderTarget->re nderSurface()->contentRect());
460 contentRectInTargetSurface.Intersect(gfx::ToEnclosingRect(surface->drawa bleContentRect())); 460 contentRectInTargetSurface.Intersect(gfx::ToEnclosingRect(surface->drawa bleContentRect()));
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 { 496 {
497 // TODO(danakj): Can we remove this use of drawableContentRect and just use the clipRect() and target surface contentRect? 497 // TODO(danakj): Can we remove this use of drawableContentRect and just use the clipRect() and target surface contentRect?
498 return layer->drawableContentRect(); 498 return layer->drawableContentRect();
499 } 499 }
500 500
501 // Instantiate (and export) templates here for the linker. 501 // Instantiate (and export) templates here for the linker.
502 template class OcclusionTrackerBase<Layer, RenderSurface>; 502 template class OcclusionTrackerBase<Layer, RenderSurface>;
503 template class OcclusionTrackerBase<LayerImpl, RenderSurfaceImpl>; 503 template class OcclusionTrackerBase<LayerImpl, RenderSurfaceImpl>;
504 504
505 } // namespace cc 505 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698