void GR_UnixCairoGraphics::scroll(UT_sint32 dx, UT_sint32 dy) { UT_sint32 oldDY = tdu(getPrevYOffset()); UT_sint32 oldDX = tdu(getPrevXOffset()); UT_sint32 newY = getPrevYOffset() + dy; UT_sint32 newX = getPrevXOffset() + dx; UT_sint32 ddx = -(tdu(newX) - oldDX); UT_sint32 ddy = -(tdu(newY) - oldDY); setPrevYOffset(newY); setPrevXOffset(newX); if(ddx == 0 && ddy == 0) { return; } disableAllCarets(); UT_sint32 iddy = labs(ddy); bool bEnableSmooth = XAP_App::getApp()->isSmoothScrollingEnabled(); bEnableSmooth = bEnableSmooth && (iddy < 30) && (ddx == 0); if(bEnableSmooth) { if(ddy < 0) { UT_sint32 i = 0; for(i = 0; i< iddy; i++) { gdk_window_scroll(m_pWin,0,-1); } } else { UT_sint32 i = 0; for(i = 0; i< iddy; i++) { gdk_window_scroll(m_pWin,0,1); } } } else { gdk_window_scroll(m_pWin,ddx,ddy); } enableAllCarets(); }
/*! * This method converts to device units while taking account of the Y-scroll * offset. This will always give the exact same logical location on the screen * no matter what the Y-scroll offset is. This fixes off-by-1-pixel bugs in Y. */ UT_sint32 GR_Graphics::_tduY(UT_sint32 layoutUnits) const { return tdu(layoutUnits+getPrevYOffset()) - tdu(getPrevYOffset()); }