Add WebP decoding support to Linux and Windows (#1314)
This commit is contained in:
5
.github/workflows/linux-ci.yml
vendored
5
.github/workflows/linux-ci.yml
vendored
@@ -60,7 +60,8 @@ jobs:
|
||||
libuv1-dev \
|
||||
libjpeg-dev \
|
||||
libpng-dev \
|
||||
libglfw3-dev
|
||||
libglfw3-dev \
|
||||
libwebp-dev
|
||||
|
||||
- name: Build MapLibre Native Core
|
||||
run: |
|
||||
@@ -185,7 +186,9 @@ jobs:
|
||||
libuv1-dev \
|
||||
libjpeg-dev \
|
||||
libpng-dev \
|
||||
libwebp-dev \
|
||||
libglfw3-dev \
|
||||
libsqlite3-dev \
|
||||
xserver-xorg-video-dummy \
|
||||
xinit
|
||||
|
||||
|
||||
3
.github/workflows/node-ci.yml
vendored
3
.github/workflows/node-ci.yml
vendored
@@ -132,7 +132,8 @@ jobs:
|
||||
libc++-9-dev \
|
||||
libc++abi-9-dev \
|
||||
libjpeg-dev \
|
||||
libpng-dev
|
||||
libpng-dev \
|
||||
libwebp-dev
|
||||
/usr/sbin/update-ccache-symlinks
|
||||
|
||||
- name: Setup node
|
||||
|
||||
3
.github/workflows/node-release.yml
vendored
3
.github/workflows/node-release.yml
vendored
@@ -128,7 +128,8 @@ jobs:
|
||||
libc++-9-dev \
|
||||
libc++abi-9-dev \
|
||||
libjpeg-dev \
|
||||
libpng-dev
|
||||
libpng-dev \
|
||||
libwebp-dev
|
||||
/usr/sbin/update-ccache-symlinks
|
||||
|
||||
- name: Setup node
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
### ✨ New features
|
||||
|
||||
- *...Add new stuff here...*
|
||||
- [core] Add WebP image decoding support to default platform (Linux, Windows)
|
||||
- [core] All CMake properties are now prefixed `MLN_*` [1054](https://github.com/maplibre/maplibre-native/pull/1054).
|
||||
- [windows] Added windows build support for core applications and node [#707](https://github.com/maplibre/maplibre-native/pull/707)
|
||||
- [core] Add `ClientOptions` to configure client information [#365](https://github.com/maplibre/maplibre-native/pull/365).
|
||||
|
||||
@@ -70,6 +70,7 @@ cc_library(
|
||||
"src/mbgl/util/string_stdlib.cpp",
|
||||
"src/mbgl/util/thread.cpp",
|
||||
"src/mbgl/util/timer.cpp",
|
||||
"src/mbgl/util/webp_reader.cpp",
|
||||
],
|
||||
"//:ios": [],
|
||||
}),
|
||||
|
||||
@@ -6,14 +6,29 @@ namespace mbgl {
|
||||
|
||||
PremultipliedImage decodePNG(const uint8_t*, size_t);
|
||||
PremultipliedImage decodeJPEG(const uint8_t*, size_t);
|
||||
PremultipliedImage decodeWEBP(const uint8_t*, size_t);
|
||||
|
||||
PremultipliedImage decodeImage(const std::string& string) {
|
||||
const auto* data = reinterpret_cast<const uint8_t*>(string.data());
|
||||
const size_t size = string.size();
|
||||
|
||||
const auto readUInt = [](const uint8_t* imageData, ptrdiff_t offset) -> uint32_t {
|
||||
const auto ptr = imageData + offset;
|
||||
return (static_cast<uint32_t>(ptr[0]) << 24) | (static_cast<uint32_t>(ptr[1]) << 16) |
|
||||
(static_cast<uint32_t>(ptr[2]) << 8) | static_cast<uint32_t>(ptr[3]);
|
||||
};
|
||||
|
||||
if (size >= 16) {
|
||||
uint32_t magic1 = readUInt(data, 0x0);
|
||||
uint32_t magic2 = readUInt(data, 0x8);
|
||||
// RIFF <xxxx = file size> WEBP
|
||||
if (magic1 == 0x52494646 && magic2 == 0x57454250) {
|
||||
return decodeWEBP(data, size);
|
||||
}
|
||||
}
|
||||
|
||||
if (size >= 4) {
|
||||
uint32_t magic = (static_cast<uint32_t>(data[0]) << 24) | (static_cast<uint32_t>(data[1]) << 16) |
|
||||
(static_cast<uint32_t>(data[2]) << 8) | static_cast<uint32_t>(data[3]);
|
||||
uint32_t magic = readUInt(data, 0x0);
|
||||
if (magic == 0x89504E47U) {
|
||||
return decodePNG(data, size);
|
||||
}
|
||||
|
||||
26
platform/default/src/mbgl/util/webp_reader.cpp
Normal file
26
platform/default/src/mbgl/util/webp_reader.cpp
Normal file
@@ -0,0 +1,26 @@
|
||||
#include <mbgl/util/image.hpp>
|
||||
#include <mbgl/util/logging.hpp>
|
||||
#include <mbgl/util/premultiply.hpp>
|
||||
|
||||
#include <webp/types.h>
|
||||
#include <webp/decode.h>
|
||||
|
||||
namespace mbgl {
|
||||
|
||||
PremultipliedImage decodeWEBP(const uint8_t* data, size_t size) {
|
||||
int32_t width, height;
|
||||
if (!WebPGetInfo(data, size, &width, &height)) {
|
||||
Log::Warning(Event::Image, "Failed to decode WebP image header!");
|
||||
return {};
|
||||
}
|
||||
|
||||
auto img = UnassociatedImage({static_cast<uint32_t>(width), static_cast<uint32_t>(height)});
|
||||
if (!WebPDecodeRGBAInto(data, size, img.data.get(), img.bytes(), static_cast<int32_t>(img.stride()))) {
|
||||
Log::Warning(Event::Image, "Failed to decode WebP image contents!");
|
||||
return {};
|
||||
}
|
||||
|
||||
return util::premultiply(std::move(img));
|
||||
}
|
||||
|
||||
} // namespace mbgl
|
||||
@@ -23,6 +23,7 @@ cc_library(
|
||||
"-lcurl",
|
||||
"-lpng",
|
||||
"-ljpeg",
|
||||
"-lwebp",
|
||||
] + ICU_FLAGS,
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
|
||||
@@ -7,7 +7,7 @@ This guide explains how to get started building and running MapLibre Native on L
|
||||
The following system libraries need to be installed.
|
||||
|
||||
```bash
|
||||
apt install libcurl4-openssl-dev libglfw3-dev libuv1-dev libpng-dev libicu-dev libjpeg62-turbo
|
||||
apt install libcurl4-openssl-dev libglfw3-dev libuv1-dev libpng-dev libicu-dev libjpeg62-turbo libwebp-dev
|
||||
```
|
||||
|
||||
Optional: `libsqlite3-dev` (also available as vendored dependency).
|
||||
|
||||
@@ -12,6 +12,7 @@ if (MLN_WITH_X11)
|
||||
endif ()
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
pkg_search_module(WEBP libwebp REQUIRED)
|
||||
pkg_search_module(LIBUV libuv REQUIRED)
|
||||
|
||||
target_sources(
|
||||
@@ -45,6 +46,7 @@ target_sources(
|
||||
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/filesystem.cpp
|
||||
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/image.cpp
|
||||
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/jpeg_reader.cpp
|
||||
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/webp_reader.cpp
|
||||
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/logging_stderr.cpp
|
||||
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/monotonic_timer.cpp
|
||||
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/png_reader.cpp
|
||||
@@ -100,6 +102,7 @@ target_include_directories(
|
||||
${JPEG_INCLUDE_DIRS}
|
||||
${LIBUV_INCLUDE_DIRS}
|
||||
${X11_INCLUDE_DIRS}
|
||||
${WEBP_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
include(${PROJECT_SOURCE_DIR}/vendor/nunicode.cmake)
|
||||
@@ -127,6 +130,7 @@ target_link_libraries(
|
||||
${LIBUV_LIBRARIES}
|
||||
${X11_LIBRARIES}
|
||||
${CMAKE_THREAD_LIBS_INIT}
|
||||
${WEBP_LIBRARIES}
|
||||
$<$<NOT:$<BOOL:${MLN_USE_BUILTIN_ICU}>>:ICU::i18n>
|
||||
$<$<NOT:$<BOOL:${MLN_USE_BUILTIN_ICU}>>:ICU::uc>
|
||||
$<$<BOOL:${MLN_USE_BUILTIN_ICU}>:mbgl-vendor-icu>
|
||||
|
||||
@@ -30,7 +30,7 @@ if(-not (Test-Path "$vcpkg_temp_dir\vcpkg.exe"))
|
||||
& "$vcpkg_temp_dir\bootstrap-vcpkg.bat"
|
||||
}
|
||||
|
||||
& "$vcpkg_temp_dir\vcpkg.exe" --disable-metrics --overlay-triplets=$([System.IO.Path]::Combine($PWD.Path, 'vendor', 'vcpkg-custom-triplets')) --triplet=$($Triplet) --clean-after-build install curl dlfcn-win32 glfw3 icu libuv libjpeg-turbo libpng $($renderer_packages)
|
||||
& "$vcpkg_temp_dir\vcpkg.exe" --disable-metrics --overlay-triplets=$([System.IO.Path]::Combine($PWD.Path, 'vendor', 'vcpkg-custom-triplets')) --triplet=$($Triplet) --clean-after-build install curl dlfcn-win32 glfw3 icu libuv libjpeg-turbo libpng libwebp $($renderer_packages)
|
||||
|
||||
subst $vcpkg_temp_dir /D
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ find_package(ICU OPTIONAL_COMPONENTS i18n uc)
|
||||
find_package(JPEG REQUIRED)
|
||||
find_package(libuv REQUIRED)
|
||||
find_package(PNG REQUIRED)
|
||||
find_package(WebP REQUIRED)
|
||||
find_path(DLFCN_INCLUDE_DIRS dlfcn.h)
|
||||
find_path(LIBUV_INCLUDE_DIRS uv.h)
|
||||
|
||||
@@ -57,6 +58,7 @@ target_sources(
|
||||
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/filesystem.cpp
|
||||
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/image.cpp
|
||||
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/jpeg_reader.cpp
|
||||
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/webp_reader.cpp
|
||||
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/logging_stderr.cpp
|
||||
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/monotonic_timer.cpp
|
||||
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/png_reader.cpp
|
||||
@@ -147,6 +149,7 @@ target_include_directories(
|
||||
${DLFCN_INCLUDE_DIRS}
|
||||
${JPEG_INCLUDE_DIRS}
|
||||
${LIBUV_INCLUDE_DIRS}
|
||||
${WEBP_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
include(${PROJECT_SOURCE_DIR}/vendor/nunicode.cmake)
|
||||
@@ -172,6 +175,7 @@ target_link_libraries(
|
||||
${CURL_LIBRARIES}
|
||||
${JPEG_LIBRARIES}
|
||||
${LIBUV_LIBRARIES}
|
||||
${WEBP_LIBRARIES}
|
||||
dlfcn-win32::dl
|
||||
$<$<NOT:$<BOOL:${MLN_USE_BUILTIN_ICU}>>:ICU::data>
|
||||
$<$<NOT:$<BOOL:${MLN_USE_BUILTIN_ICU}>>:ICU::i18n>
|
||||
|
||||
BIN
test/fixtures/image/tile.webp
vendored
Normal file
BIN
test/fixtures/image/tile.webp
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 31 KiB |
@@ -78,6 +78,12 @@ TEST(Image, JPEGTile) {
|
||||
EXPECT_EQ(256u, image.size.height);
|
||||
}
|
||||
|
||||
TEST(Image, WebPTile) {
|
||||
PremultipliedImage image = decodeImage(util::read_file("test/fixtures/image/tile.webp"));
|
||||
EXPECT_EQ(256u, image.size.width);
|
||||
EXPECT_EQ(256u, image.size.height);
|
||||
}
|
||||
|
||||
TEST(Image, Resize) {
|
||||
AlphaImage image({0, 0});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user