1 #define LOG_TAG "ScrollableLayerAndroid"
2 #define LOG_NDEBUG 1
3
4 #include "config.h"
5 #include "ScrollableLayerAndroid.h"
6
7 #include "GLWebViewState.h"
8
9 #if USE(ACCELERATED_COMPOSITING)
10
11 #include "AndroidLog.h"
12
13 namespace WebCore {
14
scrollTo(int x,int y)15 bool ScrollableLayerAndroid::scrollTo(int x, int y)
16 {
17 IntRect scrollBounds;
18 getScrollBounds(&scrollBounds);
19 if (!scrollBounds.width() && !scrollBounds.height())
20 return false;
21 SkScalar newX = SkScalarPin(x, scrollBounds.x(), scrollBounds.width());
22 SkScalar newY = SkScalarPin(y, scrollBounds.y(), scrollBounds.height());
23 // Check for no change.
24 if (newX == getScrollOffset().x() && newY == getScrollOffset().y())
25 return false;
26 setScrollOffset(IntPoint(newX, newY));
27 return true;
28 }
29
getScrollBounds(IntRect * out) const30 void ScrollableLayerAndroid::getScrollBounds(IntRect* out) const
31 {
32 out->setX(m_scrollLimits.fLeft);
33 out->setY(m_scrollLimits.fTop);
34 out->setWidth(m_scrollLimits.width());
35 out->setHeight(m_scrollLimits.height());
36 }
37
getScrollRect(SkIRect * out) const38 void ScrollableLayerAndroid::getScrollRect(SkIRect* out) const
39 {
40 out->fLeft = getScrollOffset().x();
41 out->fTop = getScrollOffset().y();
42
43 out->fRight = m_scrollLimits.width();
44 out->fBottom = m_scrollLimits.height();
45 }
46
setScrollLimits(float minX,float minY,float maxX,float maxY)47 void ScrollableLayerAndroid::setScrollLimits(float minX, float minY,
48 float maxX, float maxY)
49 {
50 if (minX < 0) minX = 0;
51 if (minY < 0) minY = 0;
52 if (maxX < 0) maxX = 0;
53 if (maxY < 0) maxY = 0;
54 if (minX > maxX) minX = maxX;
55 if (minY > maxY) minY = maxY;
56 m_scrollLimits.set(minX, minY, minX + maxX, minY + maxY);
57 }
58
scrollRectIntoView(const SkIRect & rect)59 bool ScrollableLayerAndroid::scrollRectIntoView(const SkIRect& rect)
60 {
61 // Apply the local transform to the rect to get it relative to the parent
62 // layer.
63 SkMatrix localTransform;
64 getLocalTransform(&localTransform);
65 SkRect transformedRect;
66 transformedRect.set(rect);
67 localTransform.mapRect(&transformedRect);
68
69 // Test left before right to prioritize left alignment if transformedRect is wider than
70 // visible area.
71 int x = m_scrollLimits.fLeft;
72 if (transformedRect.fLeft < m_scrollLimits.fLeft)
73 x = transformedRect.fLeft;
74 else if (transformedRect.fRight > m_scrollLimits.fRight)
75 x = transformedRect.fRight - std::max(m_scrollLimits.width(), transformedRect.width());
76
77 // Test top before bottom to prioritize top alignment if transformedRect is taller than
78 // visible area.
79 int y = m_scrollLimits.fTop;
80 if (transformedRect.fTop < m_scrollLimits.fTop)
81 y = transformedRect.fTop;
82 else if (transformedRect.fBottom > m_scrollLimits.fBottom)
83 y = transformedRect.fBottom - std::max(m_scrollLimits.height(), transformedRect.height());
84
85 return scrollTo(x - getPosition().fX, y - getPosition().fY);
86 }
87
88 } // namespace WebCore
89
90 #endif // USE(ACCELERATED_COMPOSITING)
91