summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorThiago Marcos P. Santos <tmpsantos@gmail.com>2019-09-20 13:44:39 +0300
committerThiago Marcos P. Santos <tmpsantos@gmail.com>2019-09-20 15:27:52 +0300
commit3888af2460eb601317ccb755a9cffb9ea92ad45d (patch)
tree8f95596d1bf270e856dfebffe5c9a826673dab08 /platform
parent381dda31b478bc768d5b5691619dce47fc9fa20d (diff)
downloadqtlocation-mapboxgl-3888af2460eb601317ccb755a9cffb9ea92ad45d.tar.gz
[build] Move compression to platform
It depends on platform specific compression library.
Diffstat (limited to 'platform')
-rw-r--r--platform/android/core-files.json1
-rw-r--r--platform/default/src/mbgl/util/compression.cpp104
-rw-r--r--platform/ios/core-files.json1
-rw-r--r--platform/linux/config.cmake1
-rw-r--r--platform/macos/core-files.json1
5 files changed, 108 insertions, 0 deletions
diff --git a/platform/android/core-files.json b/platform/android/core-files.json
index b19e5d9a93..362098dd9b 100644
--- a/platform/android/core-files.json
+++ b/platform/android/core-files.json
@@ -92,6 +92,7 @@
"platform/default/src/mbgl/gl/headless_backend.cpp",
"platform/default/src/mbgl/map/map_snapshotter.cpp",
"platform/default/src/mbgl/text/bidi.cpp",
+ "platform/default/src/mbgl/util/compression.cpp",
"platform/default/src/mbgl/util/png_writer.cpp",
"platform/default/src/mbgl/util/thread_local.cpp",
"platform/default/src/mbgl/util/utf.cpp",
diff --git a/platform/default/src/mbgl/util/compression.cpp b/platform/default/src/mbgl/util/compression.cpp
new file mode 100644
index 0000000000..1742898f9e
--- /dev/null
+++ b/platform/default/src/mbgl/util/compression.cpp
@@ -0,0 +1,104 @@
+#include <mbgl/util/compression.hpp>
+
+#if defined(__QT__) && defined(_WIN32) && !defined(__GNUC__)
+#include <QtZlib/zlib.h>
+#else
+#include <zlib.h>
+#endif
+
+#include <cstdio>
+#include <cstring>
+#include <stdexcept>
+
+// Check zlib library version.
+const static bool zlibVersionCheck __attribute__((unused)) = []() {
+ const char *const version = zlibVersion();
+ if (version[0] != ZLIB_VERSION[0]) {
+ char message[96];
+ snprintf(message, 96, "zlib version mismatch: headers report %s, but library reports %s",
+ ZLIB_VERSION, version);
+ throw std::runtime_error(message);
+ }
+
+ return true;
+}();
+
+namespace mbgl {
+namespace util {
+
+// Needed when using a zlib compiled with -DZ_PREFIX
+// because it will mess with this function name and
+// cause a link error.
+#undef compress
+
+std::string compress(const std::string &raw) {
+ z_stream deflate_stream;
+ memset(&deflate_stream, 0, sizeof(deflate_stream));
+
+ // TODO: reuse z_streams
+ if (deflateInit(&deflate_stream, Z_DEFAULT_COMPRESSION) != Z_OK) {
+ throw std::runtime_error("failed to initialize deflate");
+ }
+
+ deflate_stream.next_in = (Bytef *)raw.data();
+ deflate_stream.avail_in = uInt(raw.size());
+
+ std::string result;
+ char out[16384];
+
+ int code;
+ do {
+ deflate_stream.next_out = reinterpret_cast<Bytef *>(out);
+ deflate_stream.avail_out = sizeof(out);
+ code = deflate(&deflate_stream, Z_FINISH);
+ if (result.size() < deflate_stream.total_out) {
+ // append the block to the output string
+ result.append(out, deflate_stream.total_out - result.size());
+ }
+ } while (code == Z_OK);
+
+ deflateEnd(&deflate_stream);
+
+ if (code != Z_STREAM_END) {
+ throw std::runtime_error(deflate_stream.msg);
+ }
+
+ return result;
+}
+
+std::string decompress(const std::string &raw) {
+ z_stream inflate_stream;
+ memset(&inflate_stream, 0, sizeof(inflate_stream));
+
+ // TODO: reuse z_streams
+ if (inflateInit(&inflate_stream) != Z_OK) {
+ throw std::runtime_error("failed to initialize inflate");
+ }
+
+ inflate_stream.next_in = (Bytef *)raw.data();
+ inflate_stream.avail_in = uInt(raw.size());
+
+ std::string result;
+ char out[15384];
+
+ int code;
+ do {
+ inflate_stream.next_out = reinterpret_cast<Bytef *>(out);
+ inflate_stream.avail_out = sizeof(out);
+ code = inflate(&inflate_stream, 0);
+ // result.append(out, sizeof(out) - inflate_stream.avail_out);
+ if (result.size() < inflate_stream.total_out) {
+ result.append(out, inflate_stream.total_out - result.size());
+ }
+ } while (code == Z_OK);
+
+ inflateEnd(&inflate_stream);
+
+ if (code != Z_STREAM_END) {
+ throw std::runtime_error(inflate_stream.msg ? inflate_stream.msg : "decompression error");
+ }
+
+ return result;
+}
+} // namespace util
+} // namespace mbgl
diff --git a/platform/ios/core-files.json b/platform/ios/core-files.json
index 67edda9733..c4930b1667 100644
--- a/platform/ios/core-files.json
+++ b/platform/ios/core-files.json
@@ -15,6 +15,7 @@
"platform/default/src/mbgl/gl/headless_backend.cpp",
"platform/default/src/mbgl/map/map_snapshotter.cpp",
"platform/default/src/mbgl/text/bidi.cpp",
+ "platform/default/src/mbgl/util/compression.cpp",
"platform/default/src/mbgl/util/png_writer.cpp",
"platform/default/src/mbgl/util/thread_local.cpp",
"platform/default/src/mbgl/util/utf.cpp"
diff --git a/platform/linux/config.cmake b/platform/linux/config.cmake
index 74860ea0d7..55e6e3c192 100644
--- a/platform/linux/config.cmake
+++ b/platform/linux/config.cmake
@@ -45,6 +45,7 @@ macro(mbgl_platform_core)
PRIVATE platform/linux/src/gl_functions.cpp
# Misc
+ PRIVATE platform/default/src/mbgl/util/compression.cpp
PRIVATE platform/default/src/mbgl/util/logging_stderr.cpp
PRIVATE platform/default/src/mbgl/util/string_stdlib.cpp
PRIVATE platform/default/src/mbgl/util/thread.cpp
diff --git a/platform/macos/core-files.json b/platform/macos/core-files.json
index a17a48c52f..21b0e698f0 100644
--- a/platform/macos/core-files.json
+++ b/platform/macos/core-files.json
@@ -14,6 +14,7 @@
"platform/default/src/mbgl/gl/headless_backend.cpp",
"platform/default/src/mbgl/map/map_snapshotter.cpp",
"platform/default/src/mbgl/text/bidi.cpp",
+ "platform/default/src/mbgl/util/compression.cpp",
"platform/default/src/mbgl/util/png_writer.cpp",
"platform/default/src/mbgl/util/thread_local.cpp",
"platform/default/src/mbgl/util/utf.cpp"