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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutView.cpp

Issue 2727093002: Account for perspective and preserve-3d in mapToVisualRectInAncestorSpace (Closed)
Patch Set: none Created 3 years, 9 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc.
4 * All rights reserved. 4 * All rights reserved.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 setShouldDoFullPaintInvalidationIncludingNonCompositingDescendants(); 455 setShouldDoFullPaintInvalidationIncludingNonCompositingDescendants();
456 456
457 // The only way we know how to hit these ASSERTS below this point is via the 457 // The only way we know how to hit these ASSERTS below this point is via the
458 // Chromium OS login screen. 458 // Chromium OS login screen.
459 DisableCompositingQueryAsserts disabler; 459 DisableCompositingQueryAsserts disabler;
460 460
461 if (compositor()->inCompositingMode()) 461 if (compositor()->inCompositingMode())
462 compositor()->fullyInvalidatePaint(); 462 compositor()->fullyInvalidatePaint();
463 } 463 }
464 464
465 bool LayoutView::mapToVisualRectInAncestorSpace( 465 bool LayoutView::mapToVisualRectInAncestorSpaceInternal(
466 const LayoutBoxModelObject* ancestor, 466 const LayoutBoxModelObject* ancestor,
467 LayoutRect& rect, 467 TransformState& transformState,
468 VisualRectFlags visualRectFlags) const { 468 VisualRectFlags visualRectFlags) const {
469 return mapToVisualRectInAncestorSpace(ancestor, rect, 0, visualRectFlags); 469 return mapToVisualRectInAncestorSpaceInternal(ancestor, transformState, 0,
470 visualRectFlags);
470 } 471 }
471 472
472 bool LayoutView::mapToVisualRectInAncestorSpace( 473 bool LayoutView::mapToVisualRectInAncestorSpaceInternal(
473 const LayoutBoxModelObject* ancestor, 474 const LayoutBoxModelObject* ancestor,
474 LayoutRect& rect, 475 TransformState& transformState,
475 MapCoordinatesFlags mode, 476 MapCoordinatesFlags mode,
476 VisualRectFlags visualRectFlags) const { 477 VisualRectFlags visualRectFlags) const {
477 if (mode & IsFixed) 478 if (mode & IsFixed)
478 rect.move(offsetForFixedPosition(true)); 479 transformState.move(offsetForFixedPosition(true));
479 480
480 // Apply our transform if we have one (because of full page zooming). 481 // Apply our transform if we have one (because of full page zooming).
481 if (layer() && layer()->transform()) 482 if (layer() && layer()->transform()) {
482 rect = layer()->transform()->mapRect(rect); 483 transformState.applyTransform(layer()->currentTransform(),
484 TransformState::FlattenTransform);
485 }
486
487 transformState.flatten();
483 488
484 if (ancestor == this) 489 if (ancestor == this)
485 return true; 490 return true;
486 491
487 Element* owner = document().localOwner(); 492 Element* owner = document().localOwner();
488 if (!owner) 493 if (!owner) {
489 return frameView()->mapToVisualRectInTopFrameSpace(rect); 494 LayoutRect rect(transformState.lastPlanarQuad().boundingBox());
495 bool retval = frameView()->mapToVisualRectInTopFrameSpace(rect);
496 transformState.setQuad(FloatQuad(FloatRect(rect)));
497 return retval;
498 }
490 499
491 if (LayoutBox* obj = owner->layoutBox()) { 500 if (LayoutBox* obj = owner->layoutBox()) {
501 LayoutRect rect(transformState.lastPlanarQuad().boundingBox());
492 if (!(mode & InputIsInFrameCoordinates)) { 502 if (!(mode & InputIsInFrameCoordinates)) {
493 // Intersect the viewport with the visual rect. 503 // Intersect the viewport with the visual rect.
494 LayoutRect viewRectangle = viewRect(); 504 LayoutRect viewRectangle = viewRect();
495 if (visualRectFlags & EdgeInclusive) { 505 if (visualRectFlags & EdgeInclusive) {
496 if (!rect.inclusiveIntersect(viewRectangle)) 506 if (!rect.inclusiveIntersect(viewRectangle)) {
507 transformState.setQuad(FloatQuad(FloatRect(rect)));
497 return false; 508 return false;
509 }
498 } else { 510 } else {
499 rect.intersect(viewRectangle); 511 rect.intersect(viewRectangle);
500 } 512 }
501 513
502 // Adjust for scroll offset of the view. 514 // Adjust for scroll offset of the view.
503 rect.moveBy(-viewRectangle.location()); 515 rect.moveBy(-viewRectangle.location());
504 } 516 }
505 // Frames are painted at rounded-int position. Since we cannot efficiently 517 // Frames are painted at rounded-int position. Since we cannot efficiently
506 // compute the subpixel offset of painting at this point in a a bottom-up 518 // compute the subpixel offset of painting at this point in a a bottom-up
507 // walk, round to the enclosing int rect, which will enclose the actual 519 // walk, round to the enclosing int rect, which will enclose the actual
508 // visible rect. 520 // visible rect.
509 rect = LayoutRect(enclosingIntRect(rect)); 521 rect = LayoutRect(enclosingIntRect(rect));
510 522
511 // Adjust for frame border. 523 // Adjust for frame border.
512 rect.move(obj->contentBoxOffset()); 524 rect.move(obj->contentBoxOffset());
513 return obj->mapToVisualRectInAncestorSpace(ancestor, rect, visualRectFlags); 525 transformState.setQuad(FloatQuad(FloatRect(rect)));
526
527 return obj->mapToVisualRectInAncestorSpaceInternal(ancestor, transformState,
528 visualRectFlags);
514 } 529 }
515 530
516 // This can happen, e.g., if the iframe element has display:none. 531 // This can happen, e.g., if the iframe element has display:none.
517 rect = LayoutRect(); 532 transformState.setQuad(FloatQuad(FloatRect()));
518 return false; 533 return false;
519 } 534 }
520 535
521 LayoutSize LayoutView::offsetForFixedPosition(bool includePendingScroll) const { 536 LayoutSize LayoutView::offsetForFixedPosition(bool includePendingScroll) const {
522 FloatSize adjustment; 537 FloatSize adjustment;
523 if (m_frameView) { 538 if (m_frameView) {
524 adjustment += m_frameView->getScrollOffset(); 539 adjustment += m_frameView->getScrollOffset();
525 540
526 // FIXME: Paint invalidation should happen after scroll updates, so there 541 // FIXME: Paint invalidation should happen after scroll updates, so there
527 // should be no pending scroll delta. 542 // should be no pending scroll delta.
(...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after
1047 bool LayoutView::paintedOutputOfObjectHasNoEffectRegardlessOfSize() const { 1062 bool LayoutView::paintedOutputOfObjectHasNoEffectRegardlessOfSize() const {
1048 // Frame scroll corner is painted using LayoutView as the display item client. 1063 // Frame scroll corner is painted using LayoutView as the display item client.
1049 if (!RuntimeEnabledFeatures::rootLayerScrollingEnabled() && 1064 if (!RuntimeEnabledFeatures::rootLayerScrollingEnabled() &&
1050 (frameView()->horizontalScrollbar() || frameView()->verticalScrollbar())) 1065 (frameView()->horizontalScrollbar() || frameView()->verticalScrollbar()))
1051 return false; 1066 return false;
1052 1067
1053 return LayoutBlockFlow::paintedOutputOfObjectHasNoEffectRegardlessOfSize(); 1068 return LayoutBlockFlow::paintedOutputOfObjectHasNoEffectRegardlessOfSize();
1054 } 1069 }
1055 1070
1056 } // namespace blink 1071 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698