common/Rectangle.hpp | 10 ++++++++++ wsd/ClientSession.cpp | 25 +++++++++++++++---------- wsd/ClientSession.hpp | 13 ++++++++++++- wsd/DocumentBroker.cpp | 1 - wsd/TileCache.cpp | 2 -- 5 files changed, 37 insertions(+), 14 deletions(-)
New commits: commit e7649f5b4535c60ced12da9ba1b9982b58cc3bdc Author: Tamás Zolnai <tamas.zol...@collabora.com> AuthorDate: Tue Aug 21 17:15:02 2018 +0200 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Tue Aug 28 10:42:38 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. (cherry picked from commit 25e1a01a3c3df8bf412db7819536ed0a36196320) Handle negativ position value of clientvisiblearea Change-Id: I1bf1217e038d034167e1a5412d81a311ebbd83ed (cherry picked from commit d0fb39cd76cf9097f8f5398a1f7202d4df6390f4) Reviewed-on: https://gerrit.libreoffice.org/59645 Reviewed-by: Andras Timar <andras.ti...@collabora.com> Tested-by: Andras Timar <andras.ti...@collabora.com> 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 f5573c06c..35732eb94 100644 --- a/wsd/ClientSession.cpp +++ b/wsd/ClientSession.cpp @@ -1141,6 +1141,13 @@ void ClientSession::handleTileInvalidation(const std::string& message, return; } + // Visible area can have negativ value as position, but we have tiles only in the positiv range + Util::Rectangle normalizedVisArea; + normalizedVisArea._x1 = std::max(_clientVisibleArea._x1, 0); + normalizedVisArea._y1 = std::max(_clientVisibleArea._y1, 0); + normalizedVisArea._x2 = _clientVisibleArea._x2; + normalizedVisArea._y2 = _clientVisibleArea._y2; + std::pair<int, Util::Rectangle> result = TileCache::parseInvalidateMsg(message); int part = result.first; Util::Rectangle& invalidateRect = result.second; @@ -1151,18 +1158,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(normalizedVisArea._y1 / _tileHeightTwips); + i <= std::ceil(normalizedVisArea._y2 / _tileHeightTwips); ++i) { - for(int i = std::ceil(intersection._y1 / _tileHeightTwips); - i <= std::ceil(intersection._y2 / _tileHeightTwips); ++i) + for(int j = std::ceil(normalizedVisArea._x1 / _tileWidthTwips); + j <= std::ceil(normalizedVisArea._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)); commit 4de17fe29436bbf2cc70db4be91d06f5dc451e43 Author: Tamás Zolnai <tamas.zol...@collabora.com> AuthorDate: Mon Jul 23 16:11:47 2018 +0200 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Tue Aug 28 10:42:25 2018 +0200 Trace sent tiles when they are actually sent SenderQueue might drop some tiles, so we were waiting for tileprocessed message for a tile which was not sent at all. Change-Id: I7c502966f656e46df7c22002dee19aeabbf97774 (cherry picked from commit b014804ce2229030a8816eb3c35a08f9af9e4676) Reviewed-on: https://gerrit.libreoffice.org/59644 Reviewed-by: Andras Timar <andras.ti...@collabora.com> Tested-by: Andras Timar <andras.ti...@collabora.com> diff --git a/wsd/ClientSession.hpp b/wsd/ClientSession.hpp index 4c86e87a1..ff5975f1e 100644 --- a/wsd/ClientSession.hpp +++ b/wsd/ClientSession.hpp @@ -84,7 +84,18 @@ public: docBroker->assertCorrectThread(); LOG_TRC(getName() << " enqueueing client message " << data->id()); - _senderQueue.enqueue(data); + size_t sizeBefore = _senderQueue.size(); + size_t newSize = _senderQueue.enqueue(data); + if(sizeBefore != newSize) + { + // Track sent tile + const std::string command = data->firstToken(); + if (command == "tile:") + { + const TileDesc tile = TileDesc::parse(data->firstLine()); + traceTileBySend(tile); + } + } } /// Set the save-as socket which is used to send convert-to results. diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp index eb0c1f522..874d1c587 100644 --- a/wsd/DocumentBroker.cpp +++ b/wsd/DocumentBroker.cpp @@ -1438,7 +1438,6 @@ void DocumentBroker::sendRequestedTiles(const std::shared_ptr<ClientSession>& se cachedTile->read(output.data() + pos, size); cachedTile->close(); - session->traceTileBySend(tile); session->sendBinaryFrame(output.data(), output.size()); } else diff --git a/wsd/TileCache.cpp b/wsd/TileCache.cpp index 2702ba2b0..8e0da8cfe 100644 --- a/wsd/TileCache.cpp +++ b/wsd/TileCache.cpp @@ -221,7 +221,6 @@ void TileCache::saveTileAndNotify(const TileDesc& tile, const char *data, const auto firstSession = firstSubscriber.lock(); if (firstSession) { - firstSession->traceTileBySend(tile); firstSession->enqueueSendMessage(payload); } @@ -243,7 +242,6 @@ void TileCache::saveTileAndNotify(const TileDesc& tile, const char *data, const auto session = subscriber.lock(); if (session) { - session->traceTileBySend(tile); session->enqueueSendMessage(payload); } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits