From 3c433ca072e513106993b401b1af55f48a853dd7 Mon Sep 17 00:00:00 2001 From: Syping Date: Fri, 3 Mar 2023 03:26:59 +0100 Subject: [PATCH] libragephoto: add opt-in C++17 support - RagePhoto(A): add jpeg_view() function - CMakeLists.txt: move C++17 and WebAssembly stuff inside include files --- CMakeLists.txt | 36 +++---------------------------- cmake/cxxstd.cmake | 21 ++++++++++++++++++ cmake/unicode.cmake | 2 +- cmake/wasm.cmake | 46 ++++++++++++++++++++++++++++++++++++++++ src/RagePhoto.cpp | 10 +++++++++ src/RagePhoto.h | 3 +++ src/RagePhotoA.h | 18 +++++++++++++++- src/RagePhotoConfig.h.in | 1 + 8 files changed, 102 insertions(+), 35 deletions(-) create mode 100644 cmake/cxxstd.cmake create mode 100644 cmake/wasm.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index bbfb80f..009b1a8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,15 +16,12 @@ * responsible for anything with use of the software, you are self responsible. ****************************************************************************]] -cmake_minimum_required(VERSION 3.7) +cmake_minimum_required(VERSION 3.8) project(ragephoto VERSION 0.3.0 LANGUAGES CXX) include(GNUInstallDirs) -set(CMAKE_INCLUDE_CURRENT_DIR ON) -set(CMAKE_CXX_STANDARD 11) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - # RagePhoto CMake includes +include(cmake/cxxstd.cmake) include(cmake/unicode.cmake) # RagePhoto Top Level ON @@ -117,34 +114,7 @@ endif() # RagePhoto WebAssembly Target if (EMSCRIPTEN) - if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.13.0") - add_executable(ragephoto-wasm ${RAGEPHOTO_HEADERS} ${RAGEPHOTO_SOURCES}) - set_target_properties(ragephoto-wasm PROPERTIES - PREFIX "lib" - OUTPUT_NAME "ragephoto" - ) - target_compile_definitions(ragephoto-wasm PRIVATE - LIBRAGEPHOTO_LIBRARY - LIBRAGEPHOTO_WASM - ${LIBRAGEPHOTO_DEFINES} - ) - target_link_options(ragephoto-wasm PRIVATE - "SHELL:-O3" - "SHELL:--no-entry" - "SHELL:-s ALLOW_MEMORY_GROWTH=1" - "SHELL:-s MODULARIZE=1" - "SHELL:-s WASM=1" - "SHELL:-s EXPORT_NAME=libragephotoModule" - "SHELL:-s EXPORTED_FUNCTIONS=_free,_malloc" - "SHELL:-s EXPORTED_RUNTIME_METHODS=ccall,cwrap" - ) - target_include_directories(ragephoto-wasm PUBLIC - "${ragephoto_BINARY_DIR}/include" - "${ragephoto_SOURCE_DIR}/src" - ) - else() - message(WARNING "A useable WebAssembly build needs at least CMake 3.13.0 or newer") - endif() + include(cmake/wasm.cmake) endif() # RagePhoto Documentation diff --git a/cmake/cxxstd.cmake b/cmake/cxxstd.cmake new file mode 100644 index 0000000..550b599 --- /dev/null +++ b/cmake/cxxstd.cmake @@ -0,0 +1,21 @@ +#[[************************************************************************** +* libragephoto RAGE Photo Parser +* Copyright (C) 2023 Syping +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* This software is provided as-is, no warranties are given to you, we are not +* responsible for anything with use of the software, you are self responsible. +****************************************************************************]] + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_CXX_STANDARD 11 CACHE STRING "libragephoto C++ standard") +set(CMAKE_CXX_STANDARD_REQUIRED ON) diff --git a/cmake/unicode.cmake b/cmake/unicode.cmake index 254148d..71e0407 100644 --- a/cmake/unicode.cmake +++ b/cmake/unicode.cmake @@ -1,6 +1,6 @@ #[[************************************************************************** * libragephoto RAGE Photo Parser -* Copyright (C) 2021-2022 Syping +* Copyright (C) 2021-2023 Syping * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: diff --git a/cmake/wasm.cmake b/cmake/wasm.cmake new file mode 100644 index 0000000..436b5d3 --- /dev/null +++ b/cmake/wasm.cmake @@ -0,0 +1,46 @@ +#[[************************************************************************** +* libragephoto RAGE Photo Parser +* Copyright (C) 2023 Syping +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* This software is provided as-is, no warranties are given to you, we are not +* responsible for anything with use of the software, you are self responsible. +****************************************************************************]] + +if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.13.0") + add_executable(ragephoto-wasm ${RAGEPHOTO_HEADERS} ${RAGEPHOTO_SOURCES}) + set_target_properties(ragephoto-wasm PROPERTIES + PREFIX "lib" + OUTPUT_NAME "ragephoto" + ) + target_compile_definitions(ragephoto-wasm PRIVATE + LIBRAGEPHOTO_LIBRARY + LIBRAGEPHOTO_WASM + ${LIBRAGEPHOTO_DEFINES} + ) + target_link_options(ragephoto-wasm PRIVATE + "SHELL:-O3" + "SHELL:--no-entry" + "SHELL:-s ALLOW_MEMORY_GROWTH=1" + "SHELL:-s MODULARIZE=1" + "SHELL:-s WASM=1" + "SHELL:-s EXPORT_NAME=libragephotoModule" + "SHELL:-s EXPORTED_FUNCTIONS=_free,_malloc" + "SHELL:-s EXPORTED_RUNTIME_METHODS=ccall,cwrap" + ) + target_include_directories(ragephoto-wasm PUBLIC + "${ragephoto_BINARY_DIR}/include" + "${ragephoto_SOURCE_DIR}/src" + ) +else() + message(WARNING "A useable WebAssembly build needs at least CMake 3.13.0 or newer") +endif() diff --git a/src/RagePhoto.cpp b/src/RagePhoto.cpp index b77e1fe..577fde5 100644 --- a/src/RagePhoto.cpp +++ b/src/RagePhoto.cpp @@ -602,6 +602,16 @@ const std::string RagePhoto::jpeg() const return std::string(); } +#if (RAGEPHOTO_CXX_STD >= 17) && (__cplusplus >= 201703L) +const std::string_view RagePhoto::jpeg_view() const +{ + if (m_data->jpeg) + return std::string_view(m_data->jpeg, m_data->jpegSize); + else + return std::string_view(); +} +#endif + const char* RagePhoto::jpegData() const { return m_data->jpeg; diff --git a/src/RagePhoto.h b/src/RagePhoto.h index e8727f8..623abb6 100644 --- a/src/RagePhoto.h +++ b/src/RagePhoto.h @@ -115,6 +115,9 @@ public: int32_t error() const; /**< Returns the last error occurred. */ uint32_t format() const; /**< Returns the Photo Format (GTA V or RDR 2). */ const std::string jpeg() const; /**< Returns the Photo JPEG data. */ +#if (RAGEPHOTO_CXX_STD >= 17) && (__cplusplus >= 201703L) + const std::string_view jpeg_view() const; /**< Returns the Photo JPEG data. */ +#endif const char* jpegData() const; /**< Returns the Photo JPEG data. */ uint32_t jpegSize() const; /**< Returns the Photo JPEG data size. */ const char* description() const; /**< Returns the Photo description. */ diff --git a/src/RagePhotoA.h b/src/RagePhotoA.h index 9a164d9..504cf85 100644 --- a/src/RagePhotoA.h +++ b/src/RagePhotoA.h @@ -147,8 +147,22 @@ public: } /** Returns the Photo JPEG data. */ const std::string jpeg() const { - return std::string(ragephoto_getphotojpeg(instance), ragephoto_getphotosize(instance)); + const char *jpegData = ragephoto_getphotojpeg(instance); + if (jpegData) + return std::string(jpegData, ragephoto_getphotosize(instance)); + else + return std::string(); } +#if (__cplusplus >= 201703L) + /** Returns the Photo JPEG data. */ + const std::string_view jpeg_view() const { + const char *jpegData = ragephoto_getphotojpeg(instance); + if (jpegData) + return std::string_view(jpegData, ragephoto_getphotosize(instance)); + else + return std::string_view(); + } +#endif /** Returns the Photo JPEG data. */ const char* jpegData() const { return ragephoto_getphotojpeg(instance); @@ -308,6 +322,8 @@ public: private: ragephoto_t instance; }; +#else +#include "RagePhotoC.h" #endif // __cplusplus #endif // RAGEPHOTOA_H diff --git a/src/RagePhotoConfig.h.in b/src/RagePhotoConfig.h.in index d93be9d..03da1a2 100644 --- a/src/RagePhotoConfig.h.in +++ b/src/RagePhotoConfig.h.in @@ -22,6 +22,7 @@ /* CMAKE CONFIG BEGIN */ #define @LIBRAGEPHOTO_API@ #define @LIBRAGEPHOTO_LIBTYPE@ +#define RAGEPHOTO_CXX_STD @CMAKE_CXX_STANDARD@ #define RAGEPHOTO_VERSION "@ragephoto_VERSION@" #define RAGEPHOTO_VERSION_MAJOR @ragephoto_VERSION_MAJOR@ #define RAGEPHOTO_VERSION_MINOR @ragephoto_VERSION_MINOR@