common/Rectangle.hpp | 10 ++++++++++ wsd/ClientSession.cpp | 18 ++++++++---------- 2 files changed, 18 insertions(+), 10 deletions(-)
New commits: commit 25e1a01a3c3df8bf412db7819536ed0a36196320 Author: Tamás Zolnai <tamas.zol...@collabora.com> AuthorDate: Tue Aug 21 17:15:02 2018 +0200 Commit: Tamás Zolnai <tamas.zol...@collabora.com> CommitDate: Wed Aug 22 13:49:23 2018 +0200 Handle tiles hanging out the visible area A problem comes up when only a part of the tile is visible on the client side and invalidation affects the invisible part of this tile. To get back the old / right behavior we need to request this kind of tiles too. diff --git a/common/Rectangle.hpp b/common/Rectangle.hpp index 1300aa71a..6089f863d 100644 --- a/common/Rectangle.hpp +++ b/common/Rectangle.hpp @@ -78,6 +78,16 @@ struct Rectangle { return _x1 < _x2 && _y1 < _y2; } + + bool intersects(const Rectangle& rOther) + { + Util::Rectangle intersection; + intersection._x1 = std::max(_x1, rOther._x1); + intersection._y1 = std::max(_y1, rOther._y1); + intersection._x2 = std::min(_x2, rOther._x2); + intersection._y2 = std::min(_y2, rOther._y2); + return intersection.isValid(); + } }; } diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp index 90e099d38..01398fedb 100644 --- a/wsd/ClientSession.cpp +++ b/wsd/ClientSession.cpp @@ -1154,18 +1154,16 @@ void ClientSession::handleTileInvalidation(const std::string& message, std::vector<TileDesc> invalidTiles; if(part == _clientSelectedPart || _isTextDocument) { - Util::Rectangle intersection; - intersection._x1 = std::max(invalidateRect._x1, _clientVisibleArea._x1); - intersection._y1 = std::max(invalidateRect._y1, _clientVisibleArea._y1); - intersection._x2 = std::min(invalidateRect._x2, _clientVisibleArea._x2); - intersection._y2 = std::min(invalidateRect._y2, _clientVisibleArea._y2); - if(intersection.isValid()) // Client visible area and invalidated rectangle has intersection + // Iterate through visible tiles + for(int i = std::ceil(_clientVisibleArea._y1 / _tileHeightTwips); + i <= std::ceil(_clientVisibleArea._y2 / _tileHeightTwips); ++i) { - for(int i = std::ceil(intersection._y1 / _tileHeightTwips); - i <= std::ceil(intersection._y2 / _tileHeightTwips); ++i) + for(int j = std::ceil(_clientVisibleArea._x1 / _tileWidthTwips); + j <= std::ceil(_clientVisibleArea._x2 / _tileWidthTwips); ++j) { - for(int j = std::ceil(intersection._x1 / _tileWidthTwips); - j <= std::ceil(intersection._x2 / _tileWidthTwips); ++j) + // Find tiles affected by invalidation + Util::Rectangle tileRect (j * _tileWidthTwips, i * _tileHeightTwips, _tileWidthTwips, _tileHeightTwips); + if(invalidateRect.intersects(tileRect)) { invalidTiles.emplace_back(TileDesc(part, _tileWidthPixel, _tileHeightPixel, j * _tileWidthTwips, i * _tileHeightTwips, _tileWidthTwips, _tileHeightTwips, -1, 0, -1, false)); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits