[Libreoffice-commits] online.git: loolwsd/ChildSession.cpp loolwsd/LOKitClient.cpp loolwsd/LOOLKit.cpp loolwsd/Png.hpp loolwsd/Util.cpp loolwsd/Util.hpp

Ashod Nakashian ashod.nakashian at collabora.co.uk
Sat May 21 15:58:15 UTC 2016


 loolwsd/ChildSession.cpp |    3 +
 loolwsd/LOKitClient.cpp  |    7 +--
 loolwsd/LOOLKit.cpp      |    3 +
 loolwsd/Png.hpp          |   93 +++++++++++++++++++++++++++++++++++++++++++++++
 loolwsd/Util.cpp         |   73 ------------------------------------
 loolwsd/Util.hpp         |    8 ----
 6 files changed, 100 insertions(+), 87 deletions(-)

New commits:
commit 3f03860a792bca54c63462627c00abdec4f2a469
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sat May 21 11:31:04 2016 -0400

    loolwsd: moved and localized png bits to Png.hpp
    
    Change-Id: I4f27143bc2e5f638c8e84c32616b2820136a20e5
    Reviewed-on: https://gerrit.libreoffice.org/25266
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/loolwsd/ChildSession.cpp b/loolwsd/ChildSession.cpp
index c3b948b..785f6f2 100644
--- a/loolwsd/ChildSession.cpp
+++ b/loolwsd/ChildSession.cpp
@@ -28,6 +28,7 @@
 #include "LOKitHelper.hpp"
 #include "LOOLProtocol.hpp"
 #include "Log.hpp"
+#include "Png.hpp"
 #include "Rectangle.hpp"
 #include "Util.hpp"
 
@@ -656,7 +657,7 @@ void ChildSession::sendFontRendering(const char* /*buffer*/, int /*length*/, Str
 
     if (pixmap != nullptr)
     {
-        if (!Util::encodeBufferToPNG(pixmap, width, height, output, LOK_TILEMODE_RGBA))
+        if (!png::encodeBufferToPNG(pixmap, width, height, output, LOK_TILEMODE_RGBA))
         {
             sendTextFrame("error: cmd=renderfont kind=failure");
             delete[] pixmap;
diff --git a/loolwsd/LOKitClient.cpp b/loolwsd/LOKitClient.cpp
index 488644f..937cc6d 100644
--- a/loolwsd/LOKitClient.cpp
+++ b/loolwsd/LOKitClient.cpp
@@ -18,8 +18,6 @@
 #include <LibreOfficeKit/LibreOfficeKit.h>
 #include <LibreOfficeKit/LibreOfficeKitInit.h>
 
-#include <png.h>
-
 #include <Poco/Buffer.h>
 #include <Poco/Process.h>
 #include <Poco/Random.h>
@@ -30,6 +28,7 @@
 #include <Poco/Util/Application.h>
 
 #include "LOKitHelper.hpp"
+#include "Png.hpp"
 #include "Util.hpp"
 
 using Poco::StringTokenizer;
@@ -170,9 +169,9 @@ protected:
                     continue;
 
                 std::vector<char> png;
-                LibreOfficeKitTileMode mode = static_cast<LibreOfficeKitTileMode>(loKitDocument->pClass->getTileMode(loKitDocument));
+                const auto mode = static_cast<LibreOfficeKitTileMode>(loKitDocument->pClass->getTileMode(loKitDocument));
 
-                Util::encodeBufferToPNG(pixmap.data(), canvasWidth, canvasHeight, png, mode);
+                png::encodeBufferToPNG(pixmap.data(), canvasWidth, canvasHeight, png, mode);
 
                 TemporaryFile pngFile;
                 std::ofstream pngStream(pngFile.path(), std::ios::binary);
diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp
index daf58b1..8cd6329 100644
--- a/loolwsd/LOOLKit.cpp
+++ b/loolwsd/LOOLKit.cpp
@@ -50,6 +50,7 @@
 #include "LOOLProtocol.hpp"
 #include "LibreOfficeKit.hpp"
 #include "Log.hpp"
+#include "Png.hpp"
 #include "QueueHandler.hpp"
 #include "TileDesc.hpp"
 #include "Unit.hpp"
@@ -601,7 +602,7 @@ public:
                      << " rendered in " << (timestamp.elapsed()/1000.) << " ms" << Log::end;
 
         const auto mode = static_cast<LibreOfficeKitTileMode>(_loKitDocument->getTileMode());
-        if (!Util::encodeBufferToPNG(pixmap.data(), tile.getWidth(), tile.getHeight(), output, mode))
+        if (!png::encodeBufferToPNG(pixmap.data(), tile.getWidth(), tile.getHeight(), output, mode))
         {
             //FIXME: Return error.
             //sendTextFrame("error: cmd=tile kind=failure");
diff --git a/loolwsd/Png.hpp b/loolwsd/Png.hpp
index 23d86d4..19bda55 100644
--- a/loolwsd/Png.hpp
+++ b/loolwsd/Png.hpp
@@ -1,3 +1,12 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
 /* cairo - a vector graphics library with display and print output
  *
  * Copyright © 2003 University of Southern California
@@ -36,6 +45,33 @@
  *        Chris Wilson <chris at chris-wilson.co.uk>
  */
 
+#define PNG_SKIP_SETJMP_CHECK
+#include <png.h>
+
+namespace png
+{
+
+// Callback functions for libpng
+extern "C"
+{
+    static void user_write_status_fn(png_structp, png_uint_32, int)
+    {
+    }
+
+    static void user_write_fn(png_structp png_ptr, png_bytep data, png_size_t length)
+    {
+        std::vector<char> *outputp = (std::vector<char> *) png_get_io_ptr(png_ptr);
+        const size_t oldsize = outputp->size();
+        outputp->resize(oldsize + length);
+        std::memcpy(outputp->data() + oldsize, data, length);
+    }
+
+    static void user_flush_fn(png_structp)
+    {
+    }
+}
+
+
 /* Unpremultiplies data and converts native endian ARGB => RGBA bytes */
 static void
 unpremultiply_data (png_structp /*png*/, png_row_infop row_info, png_bytep data)
@@ -64,4 +100,61 @@ unpremultiply_data (png_structp /*png*/, png_row_infop row_info, png_bytep data)
     }
 }
 
+// Sadly, older libpng headers don't use const for the pixmap pointer parameter to
+// png_write_row(), so can't use const here for pixmap.
+inline
+bool encodeSubBufferToPNG(unsigned char* pixmap, int startX, int startY,
+                          int width, int height,
+                          int bufferWidth, int bufferHeight,
+                          std::vector<char>& output, LibreOfficeKitTileMode mode)
+{
+    if (bufferWidth < width || bufferHeight < height)
+    {
+        return false;
+    }
+
+    png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
+
+    png_infop info_ptr = png_create_info_struct(png_ptr);
+
+    if (setjmp(png_jmpbuf(png_ptr)))
+    {
+        png_destroy_write_struct(&png_ptr, nullptr);
+        return false;
+    }
+
+    png_set_IHDR(png_ptr, info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
+
+    png_set_write_fn(png_ptr, &output, user_write_fn, user_flush_fn);
+    png_set_write_status_fn(png_ptr, user_write_status_fn);
+
+    png_write_info(png_ptr, info_ptr);
+
+    if (mode == LOK_TILEMODE_BGRA)
+    {
+        png_set_write_user_transform_fn (png_ptr, unpremultiply_data);
+    }
+
+    for (int y = 0; y < height; ++y)
+    {
+        size_t position = ((startY + y) * bufferWidth * 4) + (startX * 4);
+        png_write_row(png_ptr, pixmap + position);
+    }
+
+    png_write_end(png_ptr, info_ptr);
+
+    png_destroy_write_struct(&png_ptr, &info_ptr);
+
+    return true;
+}
+
+inline
+bool encodeBufferToPNG(unsigned char* pixmap, int width, int height,
+                       std::vector<char>& output, LibreOfficeKitTileMode mode)
+{
+    return encodeSubBufferToPNG(pixmap, 0, 0, width, height, width, height, output, mode);
+}
+
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/loolwsd/Util.cpp b/loolwsd/Util.cpp
index 5b6ad9f..5c5ffe9 100644
--- a/loolwsd/Util.cpp
+++ b/loolwsd/Util.cpp
@@ -7,10 +7,6 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  */
 
-// PNG headers are testy and don't like us including anything
-// they include. Must be first until moved and restrained.
-#include <png.h>
-
 #include "Util.hpp"
 #include "config.h"
 
@@ -44,28 +40,6 @@
 
 #include "Common.hpp"
 #include "Log.hpp"
-#include "Png.hpp"
-
-// Callback functions for libpng
-
-extern "C"
-{
-    static void user_write_status_fn(png_structp, png_uint_32, int)
-    {
-    }
-
-    static void user_write_fn(png_structp png_ptr, png_bytep data, png_size_t length)
-    {
-        std::vector<char> *outputp = (std::vector<char> *) png_get_io_ptr(png_ptr);
-        const size_t oldsize = outputp->size();
-        outputp->resize(oldsize + length);
-        std::memcpy(outputp->data() + oldsize, data, length);
-    }
-
-    static void user_flush_fn(png_structp)
-    {
-    }
-}
 
 volatile bool TerminationFlag = false;
 
@@ -145,53 +119,6 @@ namespace Util
         return std::getenv("DISPLAY") != nullptr;
     }
 
-    bool encodeBufferToPNG(unsigned char *pixmap, int width, int height, std::vector<char>& output, LibreOfficeKitTileMode mode)
-    {
-
-        return encodeSubBufferToPNG(pixmap, 0, 0, width, height, width, height, output, mode);
-    }
-
-    bool encodeSubBufferToPNG(unsigned char *pixmap, int startX, int startY, int width, int height,
-                              int bufferWidth, int bufferHeight, std::vector<char>& output, LibreOfficeKitTileMode mode)
-    {
-        if (bufferWidth < width || bufferHeight < height)
-            return false;
-
-        png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
-
-        png_infop info_ptr = png_create_info_struct(png_ptr);
-
-        if (setjmp(png_jmpbuf(png_ptr)))
-        {
-            png_destroy_write_struct(&png_ptr, nullptr);
-            return false;
-        }
-
-        png_set_IHDR(png_ptr, info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
-
-        png_set_write_fn(png_ptr, &output, user_write_fn, user_flush_fn);
-        png_set_write_status_fn(png_ptr, user_write_status_fn);
-
-        png_write_info(png_ptr, info_ptr);
-
-        if (mode == LOK_TILEMODE_BGRA)
-        {
-            png_set_write_user_transform_fn (png_ptr, unpremultiply_data);
-        }
-
-        for (int y = 0; y < height; ++y)
-        {
-            size_t position = ((startY + y) * bufferWidth * 4) + (startX * 4);
-            png_write_row(png_ptr, pixmap + position);
-        }
-
-        png_write_end(png_ptr, info_ptr);
-
-        png_destroy_write_struct(&png_ptr, &info_ptr);
-
-        return true;
-    }
-
     const char *signalName(const int signo)
     {
         switch (signo)
diff --git a/loolwsd/Util.hpp b/loolwsd/Util.hpp
index d364e1b..38b2268 100644
--- a/loolwsd/Util.hpp
+++ b/loolwsd/Util.hpp
@@ -47,14 +47,6 @@ namespace Util
 
     bool windowingAvailable();
 
-    // Sadly, older libpng headers don't use const for the pixmap pointer parameter to
-    // png_write_row(), so can't use const here for pixmap.
-    bool encodeBufferToPNG(unsigned char* pixmap, int width, int height,
-                           std::vector<char>& output, LibreOfficeKitTileMode mode);
-    bool encodeSubBufferToPNG(unsigned char* pixmap, int startX, int startY, int width, int height,
-                              int bufferWidth, int bufferHeight,
-                              std::vector<char>& output, LibreOfficeKitTileMode mode);
-
     /// Assert that a lock is already taken.
     template <typename T>
     void assertIsLocked(T& lock)


More information about the Libreoffice-commits mailing list