| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) | 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) |
| 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) | 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) |
| 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. | 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. |
| 7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. | 7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. |
| 8 * | 8 * |
| 9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
| 10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
| (...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 555 if (childZOffset > *zOffset) { | 555 if (childZOffset > *zOffset) { |
| 556 *zOffset = childZOffset; | 556 *zOffset = childZOffset; |
| 557 return true; | 557 return true; |
| 558 } | 558 } |
| 559 return false; | 559 return false; |
| 560 } | 560 } |
| 561 | 561 |
| 562 return true; | 562 return true; |
| 563 } | 563 } |
| 564 | 564 |
| 565 static inline bool reverseCompareZIndex(RenderBox* first, RenderBox* second) | 565 static inline bool forwardCompareZIndex(RenderBox* first, RenderBox* second) |
| 566 { | 566 { |
| 567 return first->style()->zIndex() > second->style()->zIndex(); | 567 return first->style()->zIndex() < second->style()->zIndex(); |
| 568 } | 568 } |
| 569 | 569 |
| 570 // hitTestLocation and hitTestRect are relative to rootLayer. | 570 // hitTestLocation and hitTestRect are relative to rootLayer. |
| 571 // A 'flattening' layer is one preserves3D() == false. | 571 // A 'flattening' layer is one preserves3D() == false. |
| 572 // transformState.m_accumulatedTransform holds the transform from the containing
flattening layer. | 572 // transformState.m_accumulatedTransform holds the transform from the containing
flattening layer. |
| 573 // transformState.m_lastPlanarPoint is the hitTestLocation in the plane of the c
ontaining flattening layer. | 573 // transformState.m_lastPlanarPoint is the hitTestLocation in the plane of the c
ontaining flattening layer. |
| 574 // transformState.m_lastPlanarQuad is the hitTestRect as a quad in the plane of
the containing flattening layer. | 574 // transformState.m_lastPlanarQuad is the hitTestRect as a quad in the plane of
the containing flattening layer. |
| 575 // | 575 // |
| 576 // If zOffset is non-null (which indicates that the caller wants z offset inform
ation), | 576 // If zOffset is non-null (which indicates that the caller wants z offset inform
ation), |
| 577 // *zOffset on return is the z offset of the hit point relative to the containi
ng flattening layer. | 577 // *zOffset on return is the z offset of the hit point relative to the containi
ng flattening layer. |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 656 zOffsetForDescendantsPtr = zOffset ? zOffset : &localZOffset; | 656 zOffsetForDescendantsPtr = zOffset ? zOffset : &localZOffset; |
| 657 zOffsetForContentsPtr = zOffset ? zOffset : &localZOffset; | 657 zOffsetForContentsPtr = zOffset ? zOffset : &localZOffset; |
| 658 } else if (zOffset) { | 658 } else if (zOffset) { |
| 659 zOffsetForDescendantsPtr = 0; | 659 zOffsetForDescendantsPtr = 0; |
| 660 // Container needs us to give back a z offset for the hit layer. | 660 // Container needs us to give back a z offset for the hit layer. |
| 661 zOffsetForContentsPtr = zOffset; | 661 zOffsetForContentsPtr = zOffset; |
| 662 } | 662 } |
| 663 | 663 |
| 664 Vector<RenderBox*> layers; | 664 Vector<RenderBox*> layers; |
| 665 collectSelfPaintingLayers(layers); | 665 collectSelfPaintingLayers(layers); |
| 666 std::stable_sort(layers.begin(), layers.end(), reverseCompareZIndex); | 666 // Hit testing needs to walk in the backwards direction from paint. |
| 667 // Forward compare and then reverse instead of just reverse comparing |
| 668 // so that elements with the same z-index are walked in reverse tree order. |
| 669 std::stable_sort(layers.begin(), layers.end(), forwardCompareZIndex); |
| 670 layers.reverse(); |
| 667 | 671 |
| 668 bool hitLayer = false; | 672 bool hitLayer = false; |
| 669 for (auto& currentLayer : layers) { | 673 for (auto& currentLayer : layers) { |
| 670 HitTestResult tempResult(result.hitTestLocation()); | 674 HitTestResult tempResult(result.hitTestLocation()); |
| 671 bool localHitLayer = currentLayer->hitTestLayer(rootLayer, layer(), requ
est, tempResult, | 675 bool localHitLayer = currentLayer->hitTestLayer(rootLayer, layer(), requ
est, tempResult, |
| 672 hitTestRect, hitTestLocation, localTransformState.get(), zOffsetForD
escendantsPtr); | 676 hitTestRect, hitTestLocation, localTransformState.get(), zOffsetForD
escendantsPtr); |
| 673 | 677 |
| 674 // If it a rect-based test, we can safely append the temporary result si
nce it might had hit | 678 // If it a rect-based test, we can safely append the temporary result si
nce it might had hit |
| 675 // nodes but not necesserily had hitLayer set. | 679 // nodes but not necesserily had hitLayer set. |
| 676 if (result.isRectBasedTest()) | 680 if (result.isRectBasedTest()) |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 740 result.setInnerNode(enclosingElement); | 744 result.setInnerNode(enclosingElement); |
| 741 if (!result.innerNonSharedNode()) | 745 if (!result.innerNonSharedNode()) |
| 742 result.setInnerNonSharedNode(enclosingElement); | 746 result.setInnerNonSharedNode(enclosingElement); |
| 743 } | 747 } |
| 744 | 748 |
| 745 return true; | 749 return true; |
| 746 } | 750 } |
| 747 | 751 |
| 748 // --------------------- painting stuff ------------------------------- | 752 // --------------------- painting stuff ------------------------------- |
| 749 | 753 |
| 750 static inline bool forwardCompareZIndex(RenderBox* first, RenderBox* second) | |
| 751 { | |
| 752 return first->style()->zIndex() < second->style()->zIndex(); | |
| 753 } | |
| 754 | |
| 755 void RenderBox::paintLayer(GraphicsContext* context, const LayerPaintingInfo& pa
intingInfo) | 754 void RenderBox::paintLayer(GraphicsContext* context, const LayerPaintingInfo& pa
intingInfo) |
| 756 { | 755 { |
| 757 // If this layer is totally invisible then there is nothing to paint. | 756 // If this layer is totally invisible then there is nothing to paint. |
| 758 // TODO(ojan): Return false from isSelfPainting and then ASSERT(!opacity())
here. | 757 // TODO(ojan): Return false from isSelfPainting and then ASSERT(!opacity())
here. |
| 759 if (!opacity()) | 758 if (!opacity()) |
| 760 return; | 759 return; |
| 761 | 760 |
| 762 if (!transform()) { | 761 if (!transform()) { |
| 763 paintLayerContents(context, paintingInfo); | 762 paintLayerContents(context, paintingInfo); |
| 764 return; | 763 return; |
| (...skipping 2308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3073 | 3072 |
| 3074 RenderBox::BoxDecorationData::BoxDecorationData(const RenderStyle& style) | 3073 RenderBox::BoxDecorationData::BoxDecorationData(const RenderStyle& style) |
| 3075 { | 3074 { |
| 3076 backgroundColor = style.colorIncludingFallback(CSSPropertyBackgroundColor); | 3075 backgroundColor = style.colorIncludingFallback(CSSPropertyBackgroundColor); |
| 3077 hasBackground = backgroundColor.alpha() || style.hasBackgroundImage(); | 3076 hasBackground = backgroundColor.alpha() || style.hasBackgroundImage(); |
| 3078 ASSERT(hasBackground == style.hasBackground()); | 3077 ASSERT(hasBackground == style.hasBackground()); |
| 3079 hasBorder = style.hasBorder(); | 3078 hasBorder = style.hasBorder(); |
| 3080 } | 3079 } |
| 3081 | 3080 |
| 3082 } // namespace blink | 3081 } // namespace blink |
| OLD | NEW |