summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/graphics/android/layers/ScrollableLayerAndroid.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/platform/graphics/android/layers/ScrollableLayerAndroid.cpp')
-rw-r--r--Source/WebCore/platform/graphics/android/layers/ScrollableLayerAndroid.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/Source/WebCore/platform/graphics/android/layers/ScrollableLayerAndroid.cpp b/Source/WebCore/platform/graphics/android/layers/ScrollableLayerAndroid.cpp
new file mode 100644
index 0000000..f28c31d
--- /dev/null
+++ b/Source/WebCore/platform/graphics/android/layers/ScrollableLayerAndroid.cpp
@@ -0,0 +1,80 @@
+#define LOG_TAG "ScrollableLayerAndroid"
+#define LOG_NDEBUG 1
+
+#include "config.h"
+#include "ScrollableLayerAndroid.h"
+
+#include "GLWebViewState.h"
+
+#if USE(ACCELERATED_COMPOSITING)
+
+#include "AndroidLog.h"
+
+namespace WebCore {
+
+bool ScrollableLayerAndroid::scrollTo(int x, int y)
+{
+ IntRect scrollBounds;
+ getScrollBounds(&scrollBounds);
+ if (!scrollBounds.width() && !scrollBounds.height())
+ return false;
+ SkScalar newX = SkScalarPin(x, scrollBounds.x(), scrollBounds.width());
+ SkScalar newY = SkScalarPin(y, scrollBounds.y(), scrollBounds.height());
+ // Check for no change.
+ if (newX == m_offset.x() && newY == m_offset.y())
+ return false;
+ setScrollOffset(IntPoint(newX, newY));
+ return true;
+}
+
+void ScrollableLayerAndroid::getScrollBounds(IntRect* out) const
+{
+ const SkPoint& pos = getPosition();
+ out->setX(m_scrollLimits.fLeft - pos.fX);
+ out->setY(m_scrollLimits.fTop - pos.fY);
+ out->setWidth(getSize().width() - m_scrollLimits.width());
+ out->setHeight(getSize().height() - m_scrollLimits.height());
+}
+
+void ScrollableLayerAndroid::getScrollRect(SkIRect* out) const
+{
+ const SkPoint& pos = getPosition();
+ out->fLeft = m_scrollLimits.fLeft - pos.fX + m_offset.x();
+ out->fTop = m_scrollLimits.fTop - pos.fY + m_offset.y();
+
+ out->fRight = getSize().width() - m_scrollLimits.width();
+ out->fBottom = getSize().height() - m_scrollLimits.height();
+}
+
+bool ScrollableLayerAndroid::scrollRectIntoView(const SkIRect& rect)
+{
+ // Apply the local transform to the rect to get it relative to the parent
+ // layer.
+ SkMatrix localTransform;
+ getLocalTransform(&localTransform);
+ SkRect transformedRect;
+ transformedRect.set(rect);
+ localTransform.mapRect(&transformedRect);
+
+ // Test left before right to prioritize left alignment if transformedRect is wider than
+ // visible area.
+ int x = m_scrollLimits.fLeft;
+ if (transformedRect.fLeft < m_scrollLimits.fLeft)
+ x = transformedRect.fLeft;
+ else if (transformedRect.fRight > m_scrollLimits.fRight)
+ x = transformedRect.fRight - std::max(m_scrollLimits.width(), transformedRect.width());
+
+ // Test top before bottom to prioritize top alignment if transformedRect is taller than
+ // visible area.
+ int y = m_scrollLimits.fTop;
+ if (transformedRect.fTop < m_scrollLimits.fTop)
+ y = transformedRect.fTop;
+ else if (transformedRect.fBottom > m_scrollLimits.fBottom)
+ y = transformedRect.fBottom - std::max(m_scrollLimits.height(), transformedRect.height());
+
+ return scrollTo(x - getPosition().fX, y - getPosition().fY);
+}
+
+} // namespace WebCore
+
+#endif // USE(ACCELERATED_COMPOSITING)