From ca9f7b7dd60815941f1d0ce837710fb6310c0a91 Mon Sep 17 00:00:00 2001 From: Pascal Massimino Date: Tue, 7 Feb 2017 10:25:41 +0100 Subject: [PATCH] WebP-JS: emscripten-based Javascript decoder The build is based on CMake. There is a demo HTML page under webp_js/index.html See README.webp_js file. BUG=webp:261 Change-Id: I6612378b89907efd7b863720c6becf98385fc406 --- CMakeLists.txt | 18 +++++++++- README.webp_js | 63 ++++++++++++++++++++++++++++++++++ webp_js/index.html | 69 ++++++++++++++++++++++++++++++++++++++ webp_js/test_webp_js.webp | Bin 0 -> 24324 bytes 4 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 README.webp_js create mode 100644 webp_js/index.html create mode 100644 webp_js/test_webp_js.webp diff --git a/CMakeLists.txt b/CMakeLists.txt index d42ad7d5..e4f06b94 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,9 +8,14 @@ option(WEBP_BUILD_CWEBP "Build the cwebp command line tool." OFF) option(WEBP_BUILD_DWEBP "Build the dwebp command line tool." OFF) option(WEBP_BUILD_GIF2WEBP "Build the gif2webp conversion tool." OFF) option(WEBP_BUILD_IMG2WEBP "Build the img2webp animation tool." OFF) +option(WEBP_BUILD_WEBP_JS "Emscripten build of webp.js." OFF) option(WEBP_EXPERIMENTAL_FEATURES "Build with experimental features." OFF) option(WEBP_ENABLE_SWAP_16BIT_CSP "Enable byte swap for 16 bit colorspaces." OFF) +if(WEBP_BUILD_WEBP_JS) + set(WEBP_ENABLE_SIMD OFF) +endif() + set(WEBP_DEP_LIBRARIES) set(WEBP_DEP_INCLUDE_DIRS) @@ -135,7 +140,7 @@ endforeach() # Build the executables if asked for. if(WEBP_BUILD_CWEBP OR WEBP_BUILD_DWEBP OR - WEBP_BUILD_GIF2WEBP OR WEBP_BUILD_IMG2WEBP) + WEBP_BUILD_GIF2WEBP OR WEBP_BUILD_IMG2WEBP OR WEBP_BUILD_WEBP_JS) # Example utility library. parse_Makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "EXAMPLEUTIL_SRCS" "example_util_[^ ]*") @@ -204,3 +209,14 @@ if(WEBP_BUILD_IMG2WEBP) add_executable(img2webp ${IMG2WEBP_SRCS}) target_link_libraries(img2webp exampleutil imagedec imageioutil webp webpmux) endif() + +if(WEBP_BUILD_WEBP_JS) + add_executable(webp_js + ${CMAKE_CURRENT_SOURCE_DIR}/extras/webp_to_sdl.c) + target_link_libraries(webp_js webpdecoder SDL) + set_target_properties(webp_js PROPERTIES LINK_FLAGS + "-s EXPORTED_FUNCTIONS='[\"_WebpToSDL\"]' -s INVOKE_RUN=0") + set_target_properties(webp_js PROPERTIES OUTPUT_NAME webp) + target_compile_definitions(webp_js PUBLIC EMSCRIPTEN WEBP_HAVE_SDL) + target_compile_definitions(webpdecoder PUBLIC EMSCRIPTEN) +endif() diff --git a/README.webp_js b/README.webp_js new file mode 100644 index 00000000..74c4f4c3 --- /dev/null +++ b/README.webp_js @@ -0,0 +1,63 @@ + __ __ ____ ____ ____ __ ____ + / \\/ \ _ \ _ \ _ \ (__)/ __\ + \ / __/ _ \ __/ _) \_ \ + \__\__/_____/____/_/ /____/____/ + +Description: +============ + +This file describes the compilation of libwebp into a JavaScript decoder +using Emscripten and CMake. + + - install the Emscripten SDK following the procedure described at: + https://kripken.github.io/emscripten-site/docs/getting_started/downloads.html + After installation, you should have some global variable positioned to the + location of the SDK. In particular, $EMSCRIPTEN should point to the + top-level directory containing Emscripten tools. + + - make sure the file $EMSCRIPTEN/cmake/Modules/Platform/Emscripten.cmake is + accessible. This is the toolchain file used by CMake to invoke Emscripten. + + - configure the project 'WEBP_JS' with CMake using: + + cd webp_js && \ + cmake -DWEBP_BUILD_WEBP_JS=ON \ + -DEMSCRIPTEN_GENERATE_BITCODE_STATIC_LIBRARIES=1 \ + -DCMAKE_TOOLCHAIN_FILE=$EMSCRIPTEN/cmake/Modules/Platform/Emscripten.cmake \ + ../ + + - compile webp.js using 'make'. + + - that's it! Upon completion, you should have the webp.js and + webp.js.mem files generated. + +The callable JavaScript function is WebPToSDL(), which decodes a raw WebP +bitstream into a canvas. See webp_js/index.html for a simple usage sample. + +Demo HTML page: +=============== + + The HTML page webp_js/index.html requires an HTTP server to serve the WebP + image example. It's easy to just use Python for that. + +cd webp_js && python -m SimpleHTTPServer 8080 + +and then navigate to http://localhost:8080 in your favorite browser. + + +Caveat: +======= + + - First decoding using the library is usually slower, due to just-in-time + compilation. + + - Some versions of llvm produce the following compile error when SSE2 is + enabled. + +"Unsupported: %516 = bitcast <8 x i16> %481 to i128 + LLVM ERROR: BitCast Instruction not yet supported for integer types larger than 64 bits" + + The corresponding Emscripten bug is at: + https://github.com/kripken/emscripten/issues/3788 + + Therefore, SSE2 optimization is currently disabled in CMakeLists.txt. diff --git a/webp_js/index.html b/webp_js/index.html new file mode 100644 index 00000000..096ef151 --- /dev/null +++ b/webp_js/index.html @@ -0,0 +1,69 @@ + + + + + + simple Javascript WebP decoding demo + + + + + + +

+ WebP in JavaScript demo - +

+

+ WebP decoder in JavaScript, using libwebp compiled with + Emscripten. +

+

+ +

+

Timing: N/A

+ Your browser does not support canvas + + + diff --git a/webp_js/test_webp_js.webp b/webp_js/test_webp_js.webp new file mode 100644 index 0000000000000000000000000000000000000000..f41d36700b0f69907ddf847ba820ef9cf404b23d GIT binary patch literal 24324 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ʩK3`d}Z7c*sv+XIY+orU`EDF&`1XV@~#_XLf*- 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