OSDN Git Service

2643d2c2d90da345f05fa7e7e002b9bc59aeba0a
[android-x86/external-webkit.git] / Source / WebCore / platform / graphics / android / ScrollableLayerAndroid.cpp
1 #include "config.h"
2 #include "ScrollableLayerAndroid.h"
3
4 #include "GLWebViewState.h"
5
6 #if USE(ACCELERATED_COMPOSITING)
7
8 namespace WebCore {
9
10 bool ScrollableLayerAndroid::scrollTo(int x, int y)
11 {
12     SkIRect scrollBounds;
13     getScrollRect(&scrollBounds);
14     if (!scrollBounds.fRight && !scrollBounds.fBottom)
15         return false;
16
17     SkScalar newX = SkScalarPin(x, 0, scrollBounds.fRight);
18     SkScalar newY = SkScalarPin(y, 0, scrollBounds.fBottom);
19     // Check for no change.
20     if (newX == scrollBounds.fLeft && newY == scrollBounds.fTop)
21         return false;
22
23     setPosition(m_scrollLimits.fLeft - newX, m_scrollLimits.fTop - newY);
24
25     if (state())
26         state()->scrolledLayer(this);
27
28     return true;
29 }
30
31 void ScrollableLayerAndroid::getScrollRect(SkIRect* out) const
32 {
33     const SkPoint& pos = getPosition();
34     out->fLeft = m_scrollLimits.fLeft - pos.fX;
35     out->fTop = m_scrollLimits.fTop - pos.fY;
36     out->fRight = getSize().width() - m_scrollLimits.width();
37     out->fBottom = getSize().height() - m_scrollLimits.height();
38 }
39
40 bool ScrollableLayerAndroid::scrollRectIntoView(const SkIRect& rect)
41 {
42     // Apply the local transform to the rect to get it relative to the parent
43     // layer.
44     SkMatrix localTransform;
45     getLocalTransform(&localTransform);
46     SkRect transformedRect;
47     transformedRect.set(rect);
48     localTransform.mapRect(&transformedRect);
49
50     // Test left before right to prioritize left alignment if transformedRect is wider than
51     // visible area.
52     int x = m_scrollLimits.fLeft;
53     if (transformedRect.fLeft < m_scrollLimits.fLeft)
54         x = transformedRect.fLeft;
55     else if (transformedRect.fRight > m_scrollLimits.fRight)
56         x = transformedRect.fRight - std::max(m_scrollLimits.width(), transformedRect.width());
57
58     // Test top before bottom to prioritize top alignment if transformedRect is taller than
59     // visible area.
60     int y = m_scrollLimits.fTop;
61     if (transformedRect.fTop < m_scrollLimits.fTop)
62         y = transformedRect.fTop;
63     else if (transformedRect.fBottom > m_scrollLimits.fBottom)
64         y = transformedRect.fBottom - std::max(m_scrollLimits.height(), transformedRect.height());
65
66     return scrollTo(x - getPosition().fX, y - getPosition().fY);
67 }
68
69 } // namespace WebCore
70
71 #endif // USE(ACCELERATED_COMPOSITING)