[Libreoffice-commits] online.git: loolwsd/ChildProcessSession.cpp loolwsd/ChildProcessSession.hpp loolwsd/DocumentBroker.cpp loolwsd/LOOLKit.cpp loolwsd/LOOLSession.hpp loolwsd/MasterProcessSession.hpp
Ashod Nakashian
ashod.nakashian at collabora.co.uk
Wed May 4 10:36:56 UTC 2016
loolwsd/ChildProcessSession.cpp | 151 ---------------------------------------
loolwsd/ChildProcessSession.hpp | 2
loolwsd/DocumentBroker.cpp | 4 +
loolwsd/LOOLKit.cpp | 146 +++++++++++++++++++++++++++++++++++++
loolwsd/LOOLSession.hpp | 4 -
loolwsd/MasterProcessSession.hpp | 4 -
6 files changed, 153 insertions(+), 158 deletions(-)
New commits:
commit df67c4a31c1f7ccd26d861300787e0033eddd9f1
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date: Tue May 3 07:47:58 2016 -0400
loolwsd: move tilecombine handling into lokit
Change-Id: I32854769c5260444b0e97c112a141028f1cda179
Reviewed-on: https://gerrit.libreoffice.org/24641
Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
Tested-by: Ashod Nakashian <ashnakash at gmail.com>
diff --git a/loolwsd/ChildProcessSession.cpp b/loolwsd/ChildProcessSession.cpp
index 5ca7d6e..6843b24 100644
--- a/loolwsd/ChildProcessSession.cpp
+++ b/loolwsd/ChildProcessSession.cpp
@@ -441,14 +441,10 @@ bool ChildProcessSession::_handleInput(const char *buffer, int length)
{
return getStatus(buffer, length);
}
- else if (tokens[0] == "tile")
+ else if (tokens[0] == "tile" || tokens[0] == "tilecombine")
{
assert(!"Tile traffic should go through the DocumentBroker-LoKit WS.");
}
- else if (tokens[0] == "tilecombine")
- {
- sendCombinedTiles(buffer, length, tokens);
- }
else
{
// All other commands are such that they always require a LibreOfficeKitDocument session,
@@ -725,151 +721,6 @@ namespace {
}
}
-void ChildProcessSession::sendCombinedTiles(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
-{
- int part, pixelWidth, pixelHeight, tileWidth, tileHeight;
- std::string tilePositionsX, tilePositionsY;
- std::string reqTimestamp;
-
- if (tokens.count() < 8 ||
- !getTokenInteger(tokens[1], "part", part) ||
- !getTokenInteger(tokens[2], "width", pixelWidth) ||
- !getTokenInteger(tokens[3], "height", pixelHeight) ||
- !getTokenString (tokens[4], "tileposx", tilePositionsX) ||
- !getTokenString (tokens[5], "tileposy", tilePositionsY) ||
- !getTokenInteger(tokens[6], "tilewidth", tileWidth) ||
- !getTokenInteger(tokens[7], "tileheight", tileHeight))
- {
- sendTextFrame("error: cmd=tilecombine kind=syntax");
- return;
- }
-
- if (part < 0 || pixelWidth <= 0 || pixelHeight <= 0
- || tileWidth <= 0 || tileHeight <= 0
- || tilePositionsX.empty() || tilePositionsY.empty())
- {
- sendTextFrame("error: cmd=tilecombine kind=invalid");
- return;
- }
-
- if (tokens.count() > 8)
- getTokenString(tokens[8], "timestamp", reqTimestamp);
-
- bool makeSlow = delayAndRewritePart(part);
-
- Util::Rectangle renderArea;
-
- StringTokenizer positionXtokens(tilePositionsX, ",", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
- StringTokenizer positionYtokens(tilePositionsY, ",", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
-
- size_t numberOfPositions = positionYtokens.count();
- // check that number of positions for X and Y is the same
- if (numberOfPositions != positionYtokens.count())
- {
- sendTextFrame("error: cmd=tilecombine kind=invalid");
- return;
- }
-
- std::vector<Util::Rectangle> tiles;
- tiles.reserve(numberOfPositions);
-
- for (size_t i = 0; i < numberOfPositions; ++i)
- {
- int x = 0;
- if (!stringToInteger(positionXtokens[i], x))
- {
- sendTextFrame("error: cmd=tilecombine kind=syntax");
- return;
- }
-
- int y = 0;
- if (!stringToInteger(positionYtokens[i], y))
- {
- sendTextFrame("error: cmd=tilecombine kind=syntax");
- return;
- }
-
- Util::Rectangle rectangle(x, y, tileWidth, tileHeight);
-
- if (tiles.empty())
- {
- renderArea = rectangle;
- }
- else
- {
- renderArea.extend(rectangle);
- }
-
- tiles.push_back(rectangle);
- }
-
- if (_docType != "text" && part != _loKitDocument->pClass->getPart(_loKitDocument))
- {
- _loKitDocument->pClass->setPart(_loKitDocument, part);
- }
-
- LibreOfficeKitTileMode mode = static_cast<LibreOfficeKitTileMode>(_loKitDocument->pClass->getTileMode(_loKitDocument));
-
- int tilesByX = renderArea.getWidth() / tileWidth;
- int tilesByY = renderArea.getHeight() / tileHeight;
-
- int pixmapWidth = tilesByX * pixelWidth;
- int pixmapHeight = tilesByY * pixelHeight;
-
- const size_t pixmapSize = 4 * pixmapWidth * pixmapHeight;
-
- std::vector<unsigned char> pixmap(pixmapSize, 0);
-
- Timestamp timestamp;
- _loKitDocument->pClass->paintTile(_loKitDocument, pixmap.data(), pixmapWidth, pixmapHeight,
- renderArea.getLeft(), renderArea.getTop(),
- renderArea.getWidth(), renderArea.getHeight());
-
- Log::debug() << "paintTile (combined) called, tile at [" << renderArea.getLeft() << ", " << renderArea.getTop() << "]"
- << " (" << renderArea.getWidth() << ", " << renderArea.getHeight() << ") rendered in "
- << double(timestamp.elapsed())/1000 << "ms" << Log::end;
-
- for (Util::Rectangle& tileRect : tiles)
- {
- std::string response = "tile: part=" + std::to_string(part) +
- " width=" + std::to_string(pixelWidth) +
- " height=" + std::to_string(pixelHeight) +
- " tileposx=" + std::to_string(tileRect.getLeft()) +
- " tileposy=" + std::to_string(tileRect.getTop()) +
- " tilewidth=" + std::to_string(tileWidth) +
- " tileheight=" + std::to_string(tileHeight);
-
- if (reqTimestamp != "")
- response += " timestamp=" + reqTimestamp;
-
-#if ENABLE_DEBUG
- response += " renderid=" + Util::UniqueId();
-#endif
-
- response += "\n";
-
- std::vector<char> output;
- output.reserve(pixelWidth * pixelHeight * 4 + response.size());
- output.resize(response.size());
-
- std::copy(response.begin(), response.end(), output.begin());
-
- int positionX = (tileRect.getLeft() - renderArea.getLeft()) / tileWidth;
- int positionY = (tileRect.getTop() - renderArea.getTop()) / tileHeight;
-
- if (!Util::encodeSubBufferToPNG(pixmap.data(), positionX * pixelWidth, positionY * pixelHeight, pixelWidth, pixelHeight, pixmapWidth, pixmapHeight, output, mode))
- {
- sendTextFrame("error: cmd=tile kind=failure");
- return;
- }
-
- sendBinaryFrame(output.data(), output.size());
- }
-
- if (makeSlow)
- delay();
-}
-
bool ChildProcessSession::clientZoom(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
{
int tilePixelWidth, tilePixelHeight, tileTwipWidth, tileTwipHeight;
diff --git a/loolwsd/ChildProcessSession.hpp b/loolwsd/ChildProcessSession.hpp
index ec6855e..8a760cb 100644
--- a/loolwsd/ChildProcessSession.hpp
+++ b/loolwsd/ChildProcessSession.hpp
@@ -67,8 +67,6 @@ public:
protected:
virtual bool loadDocument(const char *buffer, int length, Poco::StringTokenizer& tokens) override;
- virtual void sendCombinedTiles(const char *buffer, int length, Poco::StringTokenizer& tokens) override;
-
virtual void sendFontRendering(const char *buffer, int length, Poco::StringTokenizer& tokens) override;
bool clientZoom(const char *buffer, int length, Poco::StringTokenizer& tokens);
diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp
index a390320..9f5c0a3 100644
--- a/loolwsd/DocumentBroker.cpp
+++ b/loolwsd/DocumentBroker.cpp
@@ -393,6 +393,10 @@ void DocumentBroker::handleTileRequest(int part, int width, int height, int tile
int tilePosY, int tileWidth, int tileHeight,
const std::shared_ptr<MasterProcessSession>& session)
{
+ Log::trace() << "Tile request for part: " << part << ", width: " << width << ", height: " << height
+ << ", tilePosX: " << tilePosX << ", tilePosY: " << tilePosY << ", tileWidth: " << tileWidth
+ << ", tileHeight: " << tileHeight << Log::end;
+
std::unique_lock<std::mutex> lock(_mutex);
std::unique_ptr<std::fstream> cachedTile = tileCache().lookupTile(part, width, height, tilePosX, tilePosY, tileWidth, tileHeight);
diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp
index a5269a9..2262e78 100644
--- a/loolwsd/LOOLKit.cpp
+++ b/loolwsd/LOOLKit.cpp
@@ -661,6 +661,152 @@ public:
ws->sendFrame(output.data(), length, WebSocket::FRAME_BINARY);
}
+ void sendCombinedTiles(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+ {
+ int part, pixelWidth, pixelHeight, tileWidth, tileHeight;
+ std::string tilePositionsX, tilePositionsY;
+ std::string reqTimestamp;
+
+ if (tokens.count() < 8 ||
+ !getTokenInteger(tokens[1], "part", part) ||
+ !getTokenInteger(tokens[2], "width", pixelWidth) ||
+ !getTokenInteger(tokens[3], "height", pixelHeight) ||
+ !getTokenString (tokens[4], "tileposx", tilePositionsX) ||
+ !getTokenString (tokens[5], "tileposy", tilePositionsY) ||
+ !getTokenInteger(tokens[6], "tilewidth", tileWidth) ||
+ !getTokenInteger(tokens[7], "tileheight", tileHeight))
+ {
+ //sendTextFrame("error: cmd=tilecombine kind=syntax");
+ return;
+ }
+
+ if (part < 0 || pixelWidth <= 0 || pixelHeight <= 0
+ || tileWidth <= 0 || tileHeight <= 0
+ || tilePositionsX.empty() || tilePositionsY.empty())
+ {
+ //sendTextFrame("error: cmd=tilecombine kind=invalid");
+ return;
+ }
+
+ if (tokens.count() > 8)
+ getTokenString(tokens[8], "timestamp", reqTimestamp);
+/*
+ bool makeSlow = delayAndRewritePart(part);
+
+ Util::Rectangle renderArea;
+
+ StringTokenizer positionXtokens(tilePositionsX, ",", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
+ StringTokenizer positionYtokens(tilePositionsY, ",", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
+
+ size_t numberOfPositions = positionYtokens.count();
+ // check that number of positions for X and Y is the same
+ if (numberOfPositions != positionYtokens.count())
+ {
+ sendTextFrame("error: cmd=tilecombine kind=invalid");
+ return;
+ }
+
+ std::vector<Util::Rectangle> tiles;
+ tiles.reserve(numberOfPositions);
+
+ for (size_t i = 0; i < numberOfPositions; ++i)
+ {
+ int x = 0;
+ if (!stringToInteger(positionXtokens[i], x))
+ {
+ sendTextFrame("error: cmd=tilecombine kind=syntax");
+ return;
+ }
+
+ int y = 0;
+ if (!stringToInteger(positionYtokens[i], y))
+ {
+ sendTextFrame("error: cmd=tilecombine kind=syntax");
+ return;
+ }
+
+ Util::Rectangle rectangle(x, y, tileWidth, tileHeight);
+
+ if (tiles.empty())
+ {
+ renderArea = rectangle;
+ }
+ else
+ {
+ renderArea.extend(rectangle);
+ }
+
+ tiles.push_back(rectangle);
+ }
+
+ if (_docType != "text" && part != _loKitDocument->pClass->getPart(_loKitDocument))
+ {
+ _loKitDocument->pClass->setPart(_loKitDocument, part);
+ }
+
+ LibreOfficeKitTileMode mode = static_cast<LibreOfficeKitTileMode>(_loKitDocument->pClass->getTileMode(_loKitDocument));
+
+ int tilesByX = renderArea.getWidth() / tileWidth;
+ int tilesByY = renderArea.getHeight() / tileHeight;
+
+ int pixmapWidth = tilesByX * pixelWidth;
+ int pixmapHeight = tilesByY * pixelHeight;
+
+ const size_t pixmapSize = 4 * pixmapWidth * pixmapHeight;
+
+ std::vector<unsigned char> pixmap(pixmapSize, 0);
+
+ Timestamp timestamp;
+ _loKitDocument->pClass->paintTile(_loKitDocument, pixmap.data(), pixmapWidth, pixmapHeight,
+ renderArea.getLeft(), renderArea.getTop(),
+ renderArea.getWidth(), renderArea.getHeight());
+
+ Log::debug() << "paintTile (combined) called, tile at [" << renderArea.getLeft() << ", " << renderArea.getTop() << "]"
+ << " (" << renderArea.getWidth() << ", " << renderArea.getHeight() << ") rendered in "
+ << double(timestamp.elapsed())/1000 << "ms" << Log::end;
+
+ for (Util::Rectangle& tileRect : tiles)
+ {
+ std::string response = "tile: part=" + std::to_string(part) +
+ " width=" + std::to_string(pixelWidth) +
+ " height=" + std::to_string(pixelHeight) +
+ " tileposx=" + std::to_string(tileRect.getLeft()) +
+ " tileposy=" + std::to_string(tileRect.getTop()) +
+ " tilewidth=" + std::to_string(tileWidth) +
+ " tileheight=" + std::to_string(tileHeight);
+
+ if (reqTimestamp != "")
+ response += " timestamp=" + reqTimestamp;
+
+#if ENABLE_DEBUG
+ response += " renderid=" + Util::UniqueId();
+#endif
+
+ response += "\n";
+
+ std::vector<char> output;
+ output.reserve(pixelWidth * pixelHeight * 4 + response.size());
+ output.resize(response.size());
+
+ std::copy(response.begin(), response.end(), output.begin());
+
+ int positionX = (tileRect.getLeft() - renderArea.getLeft()) / tileWidth;
+ int positionY = (tileRect.getTop() - renderArea.getTop()) / tileHeight;
+
+ if (!Util::encodeSubBufferToPNG(pixmap.data(), positionX * pixelWidth, positionY * pixelHeight, pixelWidth, pixelHeight, pixmapWidth, pixmapHeight, output, mode))
+ {
+ sendTextFrame("error: cmd=tile kind=failure");
+ return;
+ }
+
+ sendBinaryFrame(output.data(), output.size());
+ }
+
+ if (makeSlow)
+ delay();
+ */
+ }
+
private:
static void ViewCallback(int , const char* , void* )
diff --git a/loolwsd/LOOLSession.hpp b/loolwsd/LOOLSession.hpp
index 9864562..13fa109 100644
--- a/loolwsd/LOOLSession.hpp
+++ b/loolwsd/LOOLSession.hpp
@@ -87,10 +87,6 @@ protected:
virtual bool loadDocument(const char *buffer, int length, Poco::StringTokenizer& tokens) = 0;
- virtual void sendTile(const char *buffer, int length, Poco::StringTokenizer& tokens) = 0;
-
- virtual void sendCombinedTiles(const char *buffer, int length, Poco::StringTokenizer& tokens) = 0;
-
virtual void sendFontRendering(const char *buffer, int length, Poco::StringTokenizer& tokens) = 0;
void updateLastActivityTime()
diff --git a/loolwsd/MasterProcessSession.hpp b/loolwsd/MasterProcessSession.hpp
index c3e1662..19a4788 100644
--- a/loolwsd/MasterProcessSession.hpp
+++ b/loolwsd/MasterProcessSession.hpp
@@ -60,9 +60,9 @@ public:
protected:
virtual bool loadDocument(const char *buffer, int length, Poco::StringTokenizer& tokens) override;
- virtual void sendTile(const char *buffer, int length, Poco::StringTokenizer& tokens) override;
+ virtual void sendTile(const char *buffer, int length, Poco::StringTokenizer& tokens);
- virtual void sendCombinedTiles(const char *buffer, int length, Poco::StringTokenizer& tokens) override;
+ virtual void sendCombinedTiles(const char *buffer, int length, Poco::StringTokenizer& tokens);
virtual void sendFontRendering(const char *buffer, int length, Poco::StringTokenizer& tokens) override;
More information about the Libreoffice-commits
mailing list