Add WebP decoding support to Linux and Windows (#1314)

This commit is contained in:
mwilsnd
2023-07-09 08:57:42 -05:00
committed by GitHub
parent 412c3c1cce
commit 97c75856ad
14 changed files with 70 additions and 7 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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).

View File

@@ -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": [],
}),

View File

@@ -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);
}

View 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

View File

@@ -23,6 +23,7 @@ cc_library(
"-lcurl",
"-lpng",
"-ljpeg",
"-lwebp",
] + ICU_FLAGS,
visibility = ["//visibility:public"],
deps = [

View File

@@ -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).

View File

@@ -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>

View File

@@ -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

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -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});