diff options
author | Teng-Hui Zhu <ztenghui@google.com> | 2011-05-20 15:03:54 -0700 |
---|---|---|
committer | Teng-Hui Zhu <ztenghui@google.com> | 2011-05-23 10:22:43 -0700 |
commit | 52e2557aeb8477967e97fd24f20f8f407a10fa15 (patch) | |
tree | 004ddd909e106697af3469c9849c854f798fd999 | |
parent | 6e18829567040b5996966ce0676d8e0ab30e2904 (diff) | |
download | external_webkit-52e2557aeb8477967e97fd24f20f8f407a10fa15.zip external_webkit-52e2557aeb8477967e97fd24f20f8f407a10fa15.tar.gz external_webkit-52e2557aeb8477967e97fd24f20f8f407a10fa15.tar.bz2 |
Fix position update
We fixed two issues here.
First, when fixed left/right both undefined, the renderlayer position already
took the fix margin into consideration, so we don't need to compute that again.
Second, for compute the fix element's ViewRect, we just need the normal width,
not the overflow one.
bug:4440999
Change-Id: I664c64688a89579f0023288185772c61b01c7cc8
-rw-r--r-- | Source/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp | 17 | ||||
-rw-r--r-- | Source/WebCore/platform/graphics/android/LayerAndroid.cpp | 16 |
2 files changed, 15 insertions, 18 deletions
diff --git a/Source/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp b/Source/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp index 576cfe8..57cb576 100644 --- a/Source/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp +++ b/Source/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp @@ -245,15 +245,14 @@ void GraphicsLayerAndroid::updateFixedPosition() marginRight = convertLength(view->style()->marginRight()); marginBottom = convertLength(view->style()->marginBottom()); - // The layer can be bigger than the element we want to draw; - // not only that, the layout rect of the element might also be - // different from the visible rect of that element (i.e. the element - // has a CSS shadow property -- the shadow is "outside" the element). - // We thus need to: - // 1/ get the size of the element (w,h), using the layoutOverflow rect - // 2/ pass the current offset of the painting relative to the layer - int w = view->rightLayoutOverflow() - view->leftLayoutOverflow(); - int h = view->bottomLayoutOverflow() - view->topLayoutOverflow(); + // In order to compute the fixed element's position, we need the width + // and height of the element when bottom or right is defined. + // And here we should use the non-overflowed value, that means, the + // overflowed content (e.g. outset shadow) will not be counted into the + // width and height. + int w = view->width(); + int h = view->height(); + int paintingOffsetX = - offsetFromRenderer().width(); int paintingOffsetY = - offsetFromRenderer().height(); diff --git a/Source/WebCore/platform/graphics/android/LayerAndroid.cpp b/Source/WebCore/platform/graphics/android/LayerAndroid.cpp index 7bef420..95ccedc 100644 --- a/Source/WebCore/platform/graphics/android/LayerAndroid.cpp +++ b/Source/WebCore/platform/graphics/android/LayerAndroid.cpp @@ -540,21 +540,19 @@ void LayerAndroid::updateFixedLayersPositions(SkRect viewport, LayerAndroid* par float x = dx; float y = dy; - // It turns out that when it is 'auto', the webkit computation will - // take one more factor into account, that is the original render - // layer's X,Y, such that it will align well with the parent's layer. + // It turns out that when it is 'auto', we should use the webkit value + // from the original render layer's X,Y, that will take care of alignment + // with the parent's layer and fix Margin etc. if (!(m_fixedLeft.defined() || m_fixedRight.defined())) x += m_renderLayerPos.x(); - - if (!(m_fixedTop.defined() || m_fixedBottom.defined())) - y += m_renderLayerPos.y(); - - if (m_fixedLeft.defined() || !m_fixedRight.defined()) + else if (m_fixedLeft.defined() || !m_fixedRight.defined()) x += m_fixedMarginLeft.calcFloatValue(w) + m_fixedLeft.calcFloatValue(w) - m_fixedRect.fLeft; else x += w - m_fixedMarginRight.calcFloatValue(w) - m_fixedRight.calcFloatValue(w) - m_fixedRect.fRight; - if (m_fixedTop.defined() || !m_fixedBottom.defined()) + if (!(m_fixedTop.defined() || m_fixedBottom.defined())) + y += m_renderLayerPos.y(); + else if (m_fixedTop.defined() || !m_fixedBottom.defined()) y += m_fixedMarginTop.calcFloatValue(h) + m_fixedTop.calcFloatValue(h) - m_fixedRect.fTop; else y += h - m_fixedMarginBottom.calcFloatValue(h) - m_fixedBottom.calcFloatValue(h) - m_fixedRect.fBottom; |