static inline void _ewk_view_single_scroll_process_single(Ewk_View_Smart_Data* smartData, void* pixels, Evas_Coord width, Evas_Coord height, const WebCore::IntSize& scrollOffset, const WebCore::IntRect& rectToScroll) { int scrollX = rectToScroll.x(); int scrollY = rectToScroll.y(); int scrollWidth = rectToScroll.width(); int scrollHeight = rectToScroll.height(); DBG("%d,%d + %d,%d %+03d,%+03d, store: %p %dx%d", scrollX, scrollY, scrollWidth, scrollHeight, scrollOffset.width(), scrollOffset.height(), pixels, width, height); if (abs(scrollOffset.width()) >= scrollWidth || abs(scrollOffset.height()) >= scrollHeight) { ewk_view_repaint_add(smartData->_priv, scrollX, scrollY, scrollWidth, scrollHeight); return; } if (scrollX < 0) { scrollWidth += scrollX; scrollX = 0; } if (scrollY < 0) { scrollHeight += scrollY; scrollY = 0; } if (scrollX + scrollWidth > width) scrollWidth = width - scrollX; if (scrollY + scrollHeight > height) scrollHeight = height - scrollY; if (scrollWidth <= 0 || scrollHeight <= 0) return; int sourceX = scrollOffset.width() < 0 ? abs(scrollOffset.width()) : 0; int sourceY = scrollOffset.height() < 0 ? abs(scrollOffset.height()) : 0; int destinationX = scrollOffset.width() < 0 ? 0 : scrollOffset.width(); int destinationY = scrollOffset.height() < 0 ? 0 : scrollOffset.height(); int copyWidth = scrollWidth - abs(scrollOffset.width()); int copyHeight = scrollHeight - abs(scrollOffset.height()); if (scrollOffset.width() || scrollOffset.height()) { _ewk_view_screen_move(static_cast<uint32_t*>(pixels), destinationX, destinationY, sourceX, sourceY, copyWidth, copyHeight, width); evas_object_image_data_update_add(smartData->backing_store, destinationX, destinationY, copyWidth, copyHeight); } Eina_Rectangle verticalUpdate; verticalUpdate.x = destinationX ? 0 : copyWidth - 1; verticalUpdate.y = 0; verticalUpdate.w = abs(scrollOffset.width()); verticalUpdate.h = scrollHeight; if (verticalUpdate.w && verticalUpdate.h) ewk_view_repaint_add(smartData->_priv, verticalUpdate.x, verticalUpdate.y, verticalUpdate.w, verticalUpdate.h); Eina_Rectangle horizontalUpdate; horizontalUpdate.x = destinationX; horizontalUpdate.y = destinationY ? 0 : copyHeight - 1; horizontalUpdate.w = copyWidth; horizontalUpdate.h = abs(scrollOffset.height()); if (horizontalUpdate.w && horizontalUpdate.h) ewk_view_repaint_add(smartData->_priv, horizontalUpdate.x, horizontalUpdate.y, horizontalUpdate.w, horizontalUpdate.h); }
static inline void _ewk_view_single_scroll_process_single(Ewk_View_Smart_Data* smartData, void* pixels, Evas_Coord width, Evas_Coord height, const Ewk_Scroll_Request* scrollRequest) { Evas_Coord scrollX, scrollY, scrollWidth, scrollHeight; DBG("%d,%d + %d,%d %+03d,%+03d, store: %p %dx%d", scrollRequest->x, scrollRequest->y, scrollRequest->w, scrollRequest->h, scrollRequest->dx, scrollRequest->dy, pixels, width, height); scrollX = scrollRequest->x; scrollY = scrollRequest->y; scrollWidth = scrollRequest->w; scrollHeight = scrollRequest->h; if (abs(scrollRequest->dx) >= scrollWidth || abs(scrollRequest->dy) >= scrollHeight) { /* doubt webkit would be so stupid... */ DBG("full page scroll %+03d,%+03d. convert to repaint %d,%d + %dx%d", scrollRequest->dx, scrollRequest->dy, scrollX, scrollY, scrollWidth, scrollHeight); ewk_view_repaint_add(smartData->_priv, scrollX, scrollY, scrollWidth, scrollHeight); return; } if (scrollX < 0) { scrollWidth += scrollX; scrollX = 0; } if (scrollY < 0) { scrollHeight += scrollY; scrollY = 0; } if (scrollX + scrollWidth > width) scrollWidth = width - scrollX; if (scrollY + scrollHeight > height) scrollHeight = height - scrollY; if (scrollWidth < 0) scrollWidth = 0; if (scrollHeight < 0) scrollHeight = 0; EINA_SAFETY_ON_TRUE_RETURN(!scrollWidth || !scrollHeight); int sourceX = scrollRequest->dx < 0 ? abs(scrollRequest->dx) : 0; int sourceY = scrollRequest->dy < 0 ? abs(scrollRequest->dy) : 0; int destinationX = scrollRequest->dx < 0 ? 0 : scrollRequest->dx; int destinationY = scrollRequest->dy < 0 ? 0 : scrollRequest->dy; int copyWidth = scrollWidth - abs(scrollRequest->dx); int copyHeight = scrollHeight - abs(scrollRequest->dy); if (scrollRequest->dx || scrollRequest->dy) { _ewk_view_screen_move(static_cast<uint32_t*>(pixels), destinationX, destinationY, sourceX, sourceY, copyWidth, copyHeight, width); evas_object_image_data_update_add(smartData->backing_store, destinationX, destinationY, copyWidth, copyHeight); } Eina_Rectangle verticalUpdate; verticalUpdate.x = destinationX ? 0 : copyWidth - 1; verticalUpdate.y = 0; verticalUpdate.w = abs(scrollRequest->dx); verticalUpdate.h = scrollHeight; if (verticalUpdate.w && verticalUpdate.h) ewk_view_repaint_add(smartData->_priv, verticalUpdate.x, verticalUpdate.y, verticalUpdate.w, verticalUpdate.h); Eina_Rectangle horizontalUpdate; horizontalUpdate.x = destinationX; horizontalUpdate.y = destinationY ? 0 : copyHeight - 1; horizontalUpdate.w = copyWidth; horizontalUpdate.h = abs(scrollRequest->dy); if (horizontalUpdate.w && horizontalUpdate.h) ewk_view_repaint_add(smartData->_priv, horizontalUpdate.x, horizontalUpdate.y, horizontalUpdate.w, horizontalUpdate.h); }