diff --git a/.github/workflows/ubuntu-c.yml b/.github/workflows/ubuntu-c.yml
new file mode 100644
index 0000000..103bd5e
--- /dev/null
+++ b/.github/workflows/ubuntu-c.yml
@@ -0,0 +1,29 @@
+name: Ubuntu C
+
+on: push
+
+jobs:
+  Release:
+    runs-on: ubuntu-latest
+    env:
+      BUILD_TYPE: Release
+    steps:
+    - uses: actions/checkout@v2
+      with:
+        submodules: recursive
+    - name: Install packages
+      run: |
+        sudo apt-get update -qq
+        sudo apt-get install cmake gcc g++ ninja-build -qq
+    - name: Configure CMake
+      run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DRAGEPHOTO_C_LIBRARY=ON -GNinja
+    - name: Build
+      run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
+    - name: Install
+      run: cmake --install ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --prefix ${{github.workspace}}/install/usr/local
+    - name: Upload
+      uses: actions/upload-artifact@v2
+      with:
+        name: Ubuntu
+        path: |
+          ${{github.workspace}}/install/
diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu-cxx.yml
similarity index 98%
rename from .github/workflows/ubuntu.yml
rename to .github/workflows/ubuntu-cxx.yml
index 317bfdb..a885877 100644
--- a/.github/workflows/ubuntu.yml
+++ b/.github/workflows/ubuntu-cxx.yml
@@ -1,4 +1,4 @@
-name: Ubuntu
+name: Ubuntu CXX
 
 on: push
 
diff --git a/.github/workflows/webassembly.yml b/.github/workflows/webassembly-c.yml
similarity index 87%
rename from .github/workflows/webassembly.yml
rename to .github/workflows/webassembly-c.yml
index 7940500..74ed63b 100644
--- a/.github/workflows/webassembly.yml
+++ b/.github/workflows/webassembly-c.yml
@@ -1,4 +1,4 @@
-name: WebAssembly
+name: WebAssembly C
 
 on: push
 
@@ -18,7 +18,7 @@ jobs:
         sudo apt-get update -qq
         sudo apt-get install cmake ninja-build -qq
     - name: Configure CMake
-      run: emcmake cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DRAGEPHOTO_C_LIBRARY=ON -DRAGEPHOTO_UNICODE=iconv -GNinja
+      run: emcmake cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -RAGEPHOTO_C_LIBRARY=ON -GNinja
     - name: Build
       run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
     - name: Upload
diff --git a/.github/workflows/webassembly-cxx.yml b/.github/workflows/webassembly-cxx.yml
new file mode 100644
index 0000000..7fb8569
--- /dev/null
+++ b/.github/workflows/webassembly-cxx.yml
@@ -0,0 +1,30 @@
+name: WebAssembly CXX
+
+on: push
+
+jobs:
+  Release:
+    runs-on: ubuntu-latest
+    env:
+      BUILD_TYPE: Release
+    steps:
+    - uses: actions/checkout@v2
+      with:
+        submodules: recursive
+    - name: Setup emsdk
+      uses: mymindstorm/setup-emsdk@v11
+    - name: Install packages
+      run: |
+        sudo apt-get update -qq
+        sudo apt-get install cmake ninja-build -qq
+    - name: Configure CMake
+      run: emcmake cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -GNinja
+    - name: Build
+      run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
+    - name: Upload
+      uses: actions/upload-artifact@v2
+      with:
+        name: WebAssembly
+        path: |
+          ${{github.workspace}}/build/libragephoto.js
+          ${{github.workspace}}/build/libragephoto.wasm
diff --git a/.github/workflows/windows-c.yml b/.github/workflows/windows-c.yml
new file mode 100644
index 0000000..0788863
--- /dev/null
+++ b/.github/workflows/windows-c.yml
@@ -0,0 +1,34 @@
+name: Windows C
+
+on: push
+
+jobs:
+  Release:
+    runs-on: windows-latest
+    env:
+      BUILD_TYPE: Release
+    strategy:
+      matrix:
+        arch:
+          - amd64
+          - amd64_x86
+          - amd64_arm64
+    steps:
+    - uses: actions/checkout@v2
+      with:
+        submodules: recursive
+    - uses: ilammy/msvc-dev-cmd@v1
+      with:
+        arch: ${{matrix.arch}}
+    - name: Configure CMake
+      run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DRAGEPHOTO_C_LIBRARY=ON -DRAGEPHOTO_UNICODE=wincvt -GNinja
+    - name: Build
+      run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
+    - name: Install
+      run: cmake --install ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --prefix ${{github.workspace}}/install
+    - name: Upload
+      uses: actions/upload-artifact@v2
+      with:
+        name: Windows MSVC ${{matrix.arch}}
+        path: |
+          ${{github.workspace}}/install/
diff --git a/.github/workflows/windows.yml b/.github/workflows/windows-cxx.yml
similarity index 98%
rename from .github/workflows/windows.yml
rename to .github/workflows/windows-cxx.yml
index 0f4394c..480b53b 100644
--- a/.github/workflows/windows.yml
+++ b/.github/workflows/windows-cxx.yml
@@ -1,4 +1,4 @@
-name: Windows
+name: Windows CXX
 
 on: push
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b7a1c53..297f1ca 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -35,7 +35,7 @@ endif()
 option(RAGEPHOTO_C_LIBRARY "Build libragephoto as C library" OFF)
 if (RAGEPHOTO_C_LIBRARY)
     set(RAGEPHOTO_HEADERS
-        src/RagePhotoC.h
+        src/RagePhoto.h
         src/RagePhotoLibrary.h
         src/RagePhotoTypedefs.h
     )
@@ -44,7 +44,8 @@ if (RAGEPHOTO_C_LIBRARY)
     )
 else()
     set(RAGEPHOTO_HEADERS
-        src/RagePhoto.h
+        src/RagePhoto
+        src/RagePhoto.hpp
         src/RagePhotoLibrary.h
         src/RagePhotoTypedefs.h
     )
@@ -75,17 +76,19 @@ endif()
 if (RAGEPHOTO_C_LIBRARY)
     set(LIBRAGEPHOTO_API LIBRAGEPHOTO_C_API)
     list(APPEND RAGEPHOTO_HEADERS
-        src/RagePhotoA.h
+        src/RagePhotoA
+        src/RagePhotoA.hpp
     )
 else()
     if (RAGEPHOTO_C_API)
         set(LIBRAGEPHOTO_API LIBRAGEPHOTO_C_API)
         list(APPEND RAGEPHOTO_HEADERS
-            src/RagePhotoA.h
-            src/RagePhotoC.h
+            src/RagePhoto.h
+            src/RagePhotoA
+            src/RagePhotoA.hpp
         )
     else()
-        set(LIBRAGEPHOTO_API LIBRAGEPHOTO_C_NOAPI)
+        set(LIBRAGEPHOTO_API LIBRAGEPHOTO_CXX_ONLY)
     endif()
 endif()
 
diff --git a/cmake/unicode.cmake b/cmake/unicode.cmake
index 71e0407..e97886e 100644
--- a/cmake/unicode.cmake
+++ b/cmake/unicode.cmake
@@ -60,7 +60,7 @@ else()
             "UNICODE_WINCVT"
         )
         message("-- UnicodeCvt - wincvt")
-    elseif (CODECVT_COMPAT)
+    elseif (CODECVT_COMPAT AND NOT RAGEPHOTO_C_LIBRARY)
         list(APPEND LIBRAGEPHOTO_DEFINES
             "UNICODE_CODECVT"
         )
@@ -70,5 +70,7 @@ else()
             "UNICODE_ICONV"
         )
         message("-- UnicodeCvt - iconv")
+    else()
+        message("-- UnicodeCvt - none")
     endif()
 endif()
diff --git a/examples/ragephoto-gtkviewer/src/main.cpp b/examples/ragephoto-gtkviewer/src/main.cpp
index 845f003..05ba481 100644
--- a/examples/ragephoto-gtkviewer/src/main.cpp
+++ b/examples/ragephoto-gtkviewer/src/main.cpp
@@ -16,7 +16,7 @@
 * responsible for anything with use of the software, you are self responsible.
 *****************************************************************************/
 
-#include <RagePhoto.h>
+#include <RagePhoto>
 #include <gtkmm/application.h>
 #include <gtkmm/box.h>
 #include <gtkmm/button.h>
diff --git a/examples/ragephoto-qtviewer/src/main.cpp b/examples/ragephoto-qtviewer/src/main.cpp
index 6df9c6b..f7613b4 100644
--- a/examples/ragephoto-qtviewer/src/main.cpp
+++ b/examples/ragephoto-qtviewer/src/main.cpp
@@ -16,7 +16,7 @@
 * responsible for anything with use of the software, you are self responsible.
 *****************************************************************************/
 
-#include <RagePhoto.h>
+#include <RagePhoto>
 #include <QApplication>
 #include <QHBoxLayout>
 #include <QVBoxLayout>
diff --git a/src/RagePhoto b/src/RagePhoto
new file mode 100644
index 0000000..47d2c96
--- /dev/null
+++ b/src/RagePhoto
@@ -0,0 +1 @@
+#include "RagePhoto.hpp"
diff --git a/src/RagePhoto-Extract.c b/src/RagePhoto-Extract.c
index dcd37d4..85f57a0 100644
--- a/src/RagePhoto-Extract.c
+++ b/src/RagePhoto-Extract.c
@@ -16,7 +16,7 @@
 * responsible for anything with use of the software, you are self responsible.
 *****************************************************************************/
 
-#include "RagePhotoC.h"
+#include "RagePhoto.h"
 #include <stdio.h>
 
 int main(int argc, char *argv[])
diff --git a/src/RagePhoto-Extract.cpp b/src/RagePhoto-Extract.cpp
index ec4fdb4..6534d6c 100644
--- a/src/RagePhoto-Extract.cpp
+++ b/src/RagePhoto-Extract.cpp
@@ -16,7 +16,7 @@
 * responsible for anything with use of the software, you are self responsible.
 *****************************************************************************/
 
-#include "RagePhoto.h"
+#include <RagePhoto>
 #include <fstream>
 
 int main(int argc, char *argv[])
diff --git a/src/RagePhoto.c b/src/RagePhoto.c
index 9d98fbe..c998a04 100644
--- a/src/RagePhoto.c
+++ b/src/RagePhoto.c
@@ -16,7 +16,7 @@
 * responsible for anything with use of the software, you are self responsible.
 *****************************************************************************/
 
-#include "RagePhotoC.h"
+#include "RagePhoto.h"
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
diff --git a/src/RagePhoto.cpp b/src/RagePhoto.cpp
index 6b48fef..76fa0fc 100644
--- a/src/RagePhoto.cpp
+++ b/src/RagePhoto.cpp
@@ -16,9 +16,9 @@
 * responsible for anything with use of the software, you are self responsible.
 *****************************************************************************/
 
-#include "RagePhoto.h"
+#include "RagePhoto.hpp"
 #ifdef LIBRAGEPHOTO_C_API
-#include "RagePhotoC.h"
+#include "RagePhoto.h"
 #endif
 
 #include <cstdlib>
diff --git a/src/RagePhoto.h b/src/RagePhoto.h
index c895a65..ff51ca0 100644
--- a/src/RagePhoto.h
+++ b/src/RagePhoto.h
@@ -19,175 +19,297 @@
 #ifndef RAGEPHOTO_H
 #define RAGEPHOTO_H
 
-#ifdef __cplusplus
 #include "RagePhotoLibrary.h"
 #include "RagePhotoTypedefs.h"
-#include <iostream>
-#include <cstdlib>
-#include <cstdint>
-#include <cstdio>
+#include <stddef.h>
+#include <stdint.h>
 
-/**
-* \brief GTA V and RDR 2 Photo Parser.
+#ifdef __cplusplus
+extern "C" {
+#endif // __cplusplus
+
+/** C API for RagePhoto.
+* \file RagePhoto.h
 */
-class LIBRAGEPHOTO_CXX_PUBLIC RagePhoto
-{
-public:
-    /** Default sizes */
-    enum DefaultSize : uint32_t {
-        DEFAULT_GTA5_PHOTOBUFFER = 524288UL, /**< GTA V default Photo Buffer Size */
-        DEFAULT_RDR2_PHOTOBUFFER = 1048576UL, /**< RDR 2 default Photo Buffer Size */
-        DEFAULT_DESCBUFFER = 256UL, /**< Default Description Buffer Size */
-        DEFAULT_JSONBUFFER = 3072UL, /**< Default JSON Buffer Size */
-        DEFAULT_TITLBUFFER = 256UL, /**< Default Title Buffer Size */
-        GTA5_HEADERSIZE = 264UL, /**< GTA V Header Size */
-        RDR2_HEADERSIZE = 272UL, /**< RDR 2 Header Size */
-    };
-    /** Parsing and set errors */
-    enum Error : int32_t {
-        DescBufferTight = 39L, /**< Description Buffer is too tight */
-        DescMallocError = 31L, /**< Description Buffer can't be allocated */
-        DescReadError = 32L, /**< Description can't be read successfully */
-        HeaderBufferTight = 35L, /**< Header Buffer is too tight */
-        HeaderMallocError = 4L, /**< Header Buffer can't be allocated */
-        IncompatibleFormat = 2L, /**< Format is incompatible */
-        IncompleteChecksum = 7L, /**< Header checksum is incomplete */
-        IncompleteDescBuffer = 30L, /**< Description Buffer Size is incomplete */
-        IncompleteDescMarker = 28L, /**< Description Marker is incomplete */
-        IncompleteDescOffset = 11L, /**< Description Offset is incomplete */
-        IncompleteEOF = 8L, /**< End Of File Offset is incomplete */
-        IncompleteHeader = 3L, /**< Header is incomplete */
-        IncompleteJendMarker = 33L, /**< JEND Marker is incomplete */
-        IncompleteJpegMarker = 12L, /**< JPEG Marker is incomplete */
-        IncompleteJsonBuffer = 20L, /**< JSON Buffer Size is incomplete */
-        IncompleteJsonMarker = 18L, /**< JSON Marker incomplete */
-        IncompleteJsonOffset = 9L, /**< JSON Offset incomplete */
-        IncompletePhotoBuffer = 14L, /**< Photo Buffer Size is incomplete */
-        IncompletePhotoSize = 15L, /**< Photo Size is incomplete */
-        IncompleteTitleBuffer = 25L, /**< Title Buffer Size is incomplete */
-        IncompleteTitleMarker = 23L, /**< Title Marker is incomplete */
-        IncompleteTitleOffset = 10L, /**< Title Offset is incomplete */
-        IncorrectDescMarker = 29L, /**< Description Marker is incorrect */
-        IncorrectJendMarker = 34L, /**< JEND Marker is incorrect */
-        IncorrectJpegMarker = 13L, /**< JPEG Marker is incorrect */
-        IncorrectJsonMarker = 19L, /**< JSON Marker is incorrect */
-        IncorrectTitleMarker = 24L, /**< Title Marker is incorrect */
-        JsonBufferTight = 37L, /**< JSON Buffer is too tight */
-        JsonMallocError = 21L, /**< JSON Buffer can't be allocated */
-        JsonReadError = 22L, /**< JSON can't be read successfully */
-        NoError = 255L, /**< Finished without errors */
-        NoFormatIdentifier = 1L, /**< No format detected, empty file */
-        PhotoBufferTight = 36L, /**< Photo Buffer is too tight */
-        PhotoMallocError = 16L, /**< Photo Buffer can't be allocated */
-        PhotoReadError = 17L, /**< Photo can't be read */
-        TitleBufferTight = 38L, /**< Title Buffer is too tight */
-        TitleMallocError = 26L, /**< Title Buffer can't be allocated */
-        TitleReadError = 27L, /**< Title can't be read */
-        UnicodeInitError = 5L, /**< Failed to initialise Unicode decoder */
-        UnicodeHeaderError = 6L, /**< Header can't be encoded/decoded successfully */
-        Uninitialised = 0L, /**< Uninitialised, file access failed */
-    };
-    /** Photo Formats */
-    enum PhotoFormat : uint32_t {
-        GTA5 = 0x01000000UL, /**< GTA V Photo Format */
-        RDR2 = 0x04000000UL, /**< RDR 2 Photo Format */
-    };
-    /** Sign Initials */
-    enum SignInitials : uint32_t {
-        SIGTA5 = 0xE47AB81CUL, /**< GTA V Sign Initial */
-        SIRDR2 = 0x00FEEB1EUL, /**< RDR 2 Sign Initial */
-    };
-    RagePhoto();
-    ~RagePhoto();
-    void addParser(RagePhotoFormatParser *rp_parser); /**< Add a custom defined RagePhotoFormatParser. */
-    static void clear(RagePhotoData *rp_data); /**< Resets the RagePhotoData object to default values. */
-    void clear(); /**< Resets the RagePhotoData object to default values. */
-    RagePhotoData* data(); /**< Returns the internal RagePhotoData object. */
-    static bool load(const char *data, size_t size, RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser); /**< Loads a Photo from a const char*. */
-    /** Loads a Photo from a const char*.
-    * \param data Photo data
-    * \param size Photo data size
-    */
-    bool load(const char *data, size_t size);
-    /** Loads a Photo from a std::string.
-    * \param data Photo data
-    */
-    bool load(const std::string &data);
-    /** Loads a Photo from a file.
-    * \param filename File to load
-    */
-    bool loadFile(const std::string &filename);
-    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. */
-    static uint64_t jpegSign(uint32_t photoFormat, RagePhotoData *rp_data); /**< Returns the Photo JPEG sign. */
-    static uint64_t jpegSign(RagePhotoData *rp_data); /**< Returns the Photo JPEG sign. */
-    uint64_t jpegSign(uint32_t photoFormat) const; /**< Returns the Photo JPEG sign. */
-    uint64_t jpegSign() const; /**< Returns the Photo JPEG sign. */
-    uint32_t jpegSize() const; /**< Returns the Photo JPEG data size. */
-    const char* description() const; /**< Returns the Photo description. */
-    const char* json() const; /**< Returns the Photo JSON data. */
-    const char* header() const; /**< Returns the Photo header. */
-    const char* title() const; /**< Returns the Photo title. */
-    static const char* version(); /**< Returns the library version. */
-    static bool save(char *data, uint32_t photoFormat, RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser); /**< Saves a Photo to a char*. */
-    static bool save(char *data, RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser); /**< Saves a Photo to a char*. */
-    /** Saves a Photo to a char*.
-    * \param data Photo data
-    * \param photoFormat Photo Format (GTA V or RDR 2)
-    */
-    bool save(char *data, uint32_t photoFormat);
-    /** Saves a Photo to a char*.
-    * \param data Photo data
-    */
-    bool save(char *data);
-    /** Saves a Photo to a std::string.
-    * \param photoFormat Photo Format (GTA V or RDR 2)
-    * \param ok \p true when saved successfully
-    */
-    const std::string save(uint32_t photoFormat, bool *ok = nullptr);
-    /** Saves a Photo to a std::string.
-    * \param ok \p true when saved successfully
-    */
-    const std::string save(bool *ok = nullptr);
-    bool saveFile(const std::string &filename, uint32_t photoFormat); /**< Saves a Photo to a file. */
-    bool saveFile(const std::string &filename); /**< Saves a Photo to a file. */
-    static size_t saveSize(uint32_t photoFormat, RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser); /**< Returns the Photo save file size. */
-    static size_t saveSize(RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser); /**< Returns the Photo save file size. */
-    size_t saveSize(uint32_t photoFormat); /**< Returns the Photo save file size. */
-    size_t saveSize(); /**< Returns the Photo save file size. */
-    static void setBufferDefault(RagePhotoData *rp_data); /**< Sets all cross-format Buffer to default size. */
-    void setBufferDefault(); /**< Sets all cross-format Buffer to default size. */
-    static void setBufferOffsets(RagePhotoData *rp_data); /**< Moves all Buffer offsets to correct position. */
-    void setBufferOffsets(); /**< Moves all Buffer offsets to correct position. */
-    bool setData(RagePhotoData *rp_data, bool takeCopy = true); /**< Sets the internal RagePhotoData object. */
-    void setDescription(const char *description, uint32_t bufferSize = 0); /**< Sets the Photo description. */
-    void setFormat(uint32_t photoFormat); /**< Sets the Photo Format (GTA V or RDR 2). */
-    /** Sets the Photo JPEG data.
-    * \param data JPEG data
-    * \param size JPEG data size
-    * \param bufferSize JPEG buffer size
-    */
-    bool setJpeg(const char *data, uint32_t size, uint32_t bufferSize = 0);
-    /** Sets the Photo JPEG data.
-    * \param data JPEG data
-    * \param bufferSize JPEG buffer size
-    */
-    bool setJpeg(const std::string &data, uint32_t bufferSize = 0);
-    void setJson(const char *json, uint32_t bufferSize = 0); /**< Sets the Photo JSON data. */
-    void setHeader(const char *header, uint32_t headerSum, uint32_t headerSum2 = 0); /**< Sets the Photo header. */
-    void setTitle(const char *title, uint32_t bufferSize = 0); /**< Sets the Photo title. */
 
-private:
-    RagePhotoData *m_data;
-    RagePhotoFormatParser *m_parser;
-};
-#else
-#include "RagePhotoC.h"
+/** RagePhoto C instance/C++ class typedef. */
+typedef void* ragephoto_t;
+
+/** Opens a \p ragephoto_t instance. */
+LIBRAGEPHOTO_C_PUBLIC ragephoto_t ragephoto_open();
+
+/** Add a custom defined RagePhotoFormatParser.
+* \param instance \p ragephoto_t instance
+* \param rp_parser RagePhotoFormatParser parser to add
+*/
+LIBRAGEPHOTO_C_PUBLIC void ragephoto_addparser(ragephoto_t instance, RagePhotoFormatParser *rp_parser);
+
+/** Resets the RagePhotoData object to default values.
+* \param instance \p ragephoto_t instance
+*/
+LIBRAGEPHOTO_C_PUBLIC void ragephoto_clear(ragephoto_t instance);
+
+/** Resets the RagePhotoData object to default values.
+* \param rp_data RagePhotoData object
+*/
+LIBRAGEPHOTO_C_PUBLIC void ragephotodata_clear(RagePhotoData *rp_data);
+
+/** Loads a Photo from a const char*.
+* \param instance \p ragephoto_t instance
+* \param data Photo data
+* \param size Photo data size
+*/
+LIBRAGEPHOTO_C_PUBLIC bool ragephoto_load(ragephoto_t instance, const char *data, size_t size);
+
+/** Loads a Photo from a const char*.
+* \param rp_data RagePhotoData object
+* \param rp_parser RagePhotoFormatParser parser array
+* \param data Photo data
+* \param size Photo data size
+*/
+LIBRAGEPHOTO_C_PUBLIC bool ragephotodata_load(RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser, const char *data, size_t size);
+
+/** Loads a Photo from a file.
+* \param instance \p ragephoto_t instance
+* \param filename File to load
+*/
+LIBRAGEPHOTO_C_PUBLIC bool ragephoto_loadfile(ragephoto_t instance, const char *filename);
+
+/** Returns the last error occurred.
+* \param instance \p ragephoto_t instance
+*/
+LIBRAGEPHOTO_C_PUBLIC int32_t ragephoto_error(ragephoto_t instance);
+
+/** Returns the GTA V default Photo Buffer Size. */
+LIBRAGEPHOTO_C_PUBLIC uint32_t ragephoto_defpbuf_gta5();
+
+/** Returns the RDR 2 default Photo Buffer Size. */
+LIBRAGEPHOTO_C_PUBLIC uint32_t ragephoto_defpbuf_rdr2();
+
+/** Returns the GTA V Photo Format. */
+LIBRAGEPHOTO_C_PUBLIC uint32_t ragephoto_format_gta5();
+
+/** Returns the RDR 2 Photo Format. */
+LIBRAGEPHOTO_C_PUBLIC uint32_t ragephoto_format_rdr2();
+
+/** Returns the internal RagePhotoData object.
+* \param instance \p ragephoto_t instance
+*/
+LIBRAGEPHOTO_C_PUBLIC RagePhotoData* ragephoto_getphotodata(ragephoto_t instance);
+
+/** Returns the Photo description.
+* \param instance \p ragephoto_t instance
+*/
+LIBRAGEPHOTO_C_PUBLIC const char* ragephoto_getphotodesc(ragephoto_t instance);
+
+/** Returns the Photo Format (GTA V or RDR 2).
+* \param instance \p ragephoto_t instance
+*/
+LIBRAGEPHOTO_C_PUBLIC uint32_t ragephoto_getphotoformat(ragephoto_t instance);
+
+/** Returns the Photo JPEG data.
+* \param instance \p ragephoto_t instance
+*/
+LIBRAGEPHOTO_C_PUBLIC const char* ragephoto_getphotojpeg(ragephoto_t instance);
+
+/** Returns the Photo JSON data.
+* \param instance \p ragephoto_t instance
+*/
+LIBRAGEPHOTO_C_PUBLIC const char* ragephoto_getphotojson(ragephoto_t instance);
+
+/** Returns the Photo header.
+* \param instance \p ragephoto_t instance
+*/
+LIBRAGEPHOTO_C_PUBLIC const char* ragephoto_getphotoheader(ragephoto_t instance);
+
+/** Returns the Photo JPEG sign.
+* \param instance \p ragephoto_t instance
+*/
+LIBRAGEPHOTO_C_PUBLIC uint64_t ragephoto_getphotosign(ragephoto_t instance);
+
+/** Returns the Photo JPEG sign.
+* \param instance \p ragephoto_t instance
+* \param photoFormat Photo Format (GTA V or RDR 2)
+*/
+LIBRAGEPHOTO_C_PUBLIC uint64_t ragephoto_getphotosignf(ragephoto_t instance, uint32_t photoFormat);
+
+/** Returns the Photo JPEG sign.
+* \param rp_data RagePhotoData object
+*/
+LIBRAGEPHOTO_C_PUBLIC uint64_t ragephotodata_getphotosign(RagePhotoData *rp_data);
+
+/** Returns the Photo JPEG sign.
+* \param rp_data RagePhotoData object
+* \param photoFormat Photo Format (GTA V or RDR 2)
+*/
+LIBRAGEPHOTO_C_PUBLIC uint64_t ragephotodata_getphotosignf(RagePhotoData *rp_data, uint32_t photoFormat);
+
+/** Returns the Photo JPEG data size.
+* \param instance \p ragephoto_t instance
+*/
+LIBRAGEPHOTO_C_PUBLIC uint32_t ragephoto_getphotosize(ragephoto_t instance);
+
+/** Returns the Photo title.
+* \param instance \p ragephoto_t instance
+*/
+LIBRAGEPHOTO_C_PUBLIC const char* ragephoto_getphototitle(ragephoto_t instance);
+
+/** Returns the Photo save file size.
+* \param instance \p ragephoto_t instance
+*/
+LIBRAGEPHOTO_C_PUBLIC size_t ragephoto_getsavesize(ragephoto_t instance);
+
+/** Returns the Photo save file size.
+* \param rp_data RagePhotoData object
+* \param rp_parser RagePhotoFormatParser parser array
+*/
+LIBRAGEPHOTO_C_PUBLIC size_t ragephotodata_getsavesize(RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser);
+
+/** Returns the Photo save file size.
+* \param instance \p ragephoto_t instance
+* \param photoFormat Photo Format (GTA V or RDR 2)
+*/
+LIBRAGEPHOTO_C_PUBLIC size_t ragephoto_getsavesizef(ragephoto_t instance, uint32_t photoFormat);
+
+/** Returns the Photo save file size.
+* \param rp_data RagePhotoData object
+* \param rp_parser RagePhotoFormatParser parser array
+* \param photoFormat Photo Format (GTA V or RDR 2)
+*/
+LIBRAGEPHOTO_C_PUBLIC size_t ragephotodata_getsavesizef(RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser, uint32_t photoFormat);
+
+/** Saves a Photo to a char*.
+* \param instance \p ragephoto_t instance
+* \param data Photo data
+*/
+LIBRAGEPHOTO_C_PUBLIC bool ragephoto_save(ragephoto_t instance, char *data);
+
+/** Saves a Photo to a char*.
+* \param rp_data RagePhotoData object
+* \param rp_parser RagePhotoFormatParser parser array
+* \param data Photo data
+*/
+LIBRAGEPHOTO_C_PUBLIC bool ragephotodata_save(RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser, char *data);
+
+/** Saves a Photo to a char*.
+* \param instance \p ragephoto_t instance
+* \param data Photo data
+* \param photoFormat Photo Format (GTA V or RDR 2)
+*/
+LIBRAGEPHOTO_C_PUBLIC bool ragephoto_savef(ragephoto_t instance, char *data, uint32_t photoFormat);
+
+/** Saves a Photo to a char*.
+* \param rp_data RagePhotoData object
+* \param rp_parser RagePhotoFormatParser parser array
+* \param data Photo data
+* \param photoFormat Photo Format (GTA V or RDR 2)
+*/
+LIBRAGEPHOTO_C_PUBLIC bool ragephotodata_savef(RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser, char *data, uint32_t photoFormat);
+
+/** Saves a Photo to a file.
+* \param instance \p ragephoto_t instance
+* \param filename File to save
+*/
+LIBRAGEPHOTO_C_PUBLIC bool ragephoto_savefile(ragephoto_t instance, const char *filename);
+
+/** Saves a Photo to a file.
+* \param instance \p ragephoto_t instance
+* \param filename File to save
+* \param photoFormat Photo Format (GTA V or RDR 2)
+*/
+LIBRAGEPHOTO_C_PUBLIC bool ragephoto_savefilef(ragephoto_t instance, const char *filename, uint32_t photoFormat);
+
+/** Sets all cross-format Buffer to default size.
+* \param instance \p ragephoto_t instance
+*/
+LIBRAGEPHOTO_C_PUBLIC void ragephoto_setbufferdefault(ragephoto_t instance);
+
+/** Sets all cross-format Buffer to default size.
+* \param rp_data RagePhotoData object
+*/
+LIBRAGEPHOTO_C_PUBLIC void ragephotodata_setbufferdefault(RagePhotoData *rp_data);
+
+/** Moves all Buffer offsets to correct position.
+* \param instance \p ragephoto_t instance
+*/
+LIBRAGEPHOTO_C_PUBLIC void ragephoto_setbufferoffsets(ragephoto_t instance);
+
+/** Moves all Buffer offsets to correct position.
+* \param rp_data RagePhotoData object
+*/
+LIBRAGEPHOTO_C_PUBLIC void ragephotodata_setbufferoffsets(RagePhotoData *rp_data);
+
+/** Sets the internal RagePhotoData object.
+* \param instance \p ragephoto_t instance
+* \param rp_data RagePhotoData object being set
+*/
+LIBRAGEPHOTO_C_PUBLIC bool ragephoto_setphotodata(ragephoto_t instance, RagePhotoData *rp_data);
+
+/** Copies RagePhotoData object to internal RagePhotoData object.
+* \param instance \p ragephoto_t instance
+* \param rp_data RagePhotoData object being copied
+*/
+LIBRAGEPHOTO_C_PUBLIC bool ragephoto_setphotodatac(ragephoto_t instance, RagePhotoData *rp_data);
+
+/** Sets the Photo description.
+* \param instance \p ragephoto_t instance
+* \param description Description
+* \param bufferSize Description buffer size
+*
+* Default bufferSize: 256UL
+*/
+LIBRAGEPHOTO_C_PUBLIC void ragephoto_setphotodesc(ragephoto_t instance, const char *description, uint32_t bufferSize);
+
+/** Sets the Photo Format (GTA V or RDR 2).
+* \param instance \p ragephoto_t instance
+* \param photoFormat Photo Format (GTA V or RDR 2)
+*/
+LIBRAGEPHOTO_C_PUBLIC void ragephoto_setphotoformat(ragephoto_t instance, uint32_t photoFormat);
+
+/** Sets the Photo JPEG data.
+* \param instance \p ragephoto_t instance
+* \param data JPEG data
+* \param size JPEG data size
+* \param bufferSize JPEG buffer size
+*
+* Default bufferSize: ragephoto_defpbuf_gta5() or ragephoto_defpbuf_rdr2()
+*/
+LIBRAGEPHOTO_C_PUBLIC bool ragephoto_setphotojpeg(ragephoto_t instance, const char *data, uint32_t size, uint32_t bufferSize);
+
+/** Sets the Photo JSON data.
+* \param instance \p ragephoto_t instance
+* \param json JSON data
+* \param bufferSize JSON data buffer size
+*
+* Default bufferSize: 3072UL
+*/
+LIBRAGEPHOTO_C_PUBLIC void ragephoto_setphotojson(ragephoto_t instance, const char *json, uint32_t bufferSize);
+
+/** Sets the Photo header. */
+LIBRAGEPHOTO_C_PUBLIC void ragephoto_setphotoheader(ragephoto_t instance, const char *header, uint32_t headerSum);
+
+/** Sets the Photo header. (RDR 2) */
+LIBRAGEPHOTO_C_PUBLIC void ragephoto_setphotoheader2(ragephoto_t instance, const char *header, uint32_t headerSum, uint32_t headerSum2);
+
+/** Sets the Photo title.
+* \param instance \p ragephoto_t instance
+* \param title Title
+* \param bufferSize Title buffer size
+*
+* Default bufferSize: 256UL
+*/
+LIBRAGEPHOTO_C_PUBLIC void ragephoto_setphototitle(ragephoto_t instance, const char *title, uint32_t bufferSize);
+
+/** Closes a \p ragephoto_t instance.
+* \param instance \p ragephoto_t instance
+*/
+LIBRAGEPHOTO_C_PUBLIC void ragephoto_close(ragephoto_t instance);
+
+/** Returns the library version. */
+LIBRAGEPHOTO_C_PUBLIC const char* ragephoto_version();
+
+#ifdef __cplusplus
+}
 #endif // __cplusplus
 
 #endif // RAGEPHOTO_H
diff --git a/src/RagePhoto.hpp b/src/RagePhoto.hpp
new file mode 100644
index 0000000..addb920
--- /dev/null
+++ b/src/RagePhoto.hpp
@@ -0,0 +1,191 @@
+/*****************************************************************************
+* libragephoto RAGE Photo Parser
+* 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:
+*
+* 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.
+*****************************************************************************/
+
+#ifndef RAGEPHOTO_HPP
+#define RAGEPHOTO_HPP
+
+#ifdef __cplusplus
+#include "RagePhotoLibrary.h"
+#include "RagePhotoTypedefs.h"
+#include <iostream>
+#include <cstdlib>
+#include <cstdint>
+#include <cstdio>
+
+/**
+* \brief GTA V and RDR 2 Photo Parser.
+*/
+class LIBRAGEPHOTO_CXX_PUBLIC RagePhoto
+{
+public:
+    /** Default sizes */
+    enum DefaultSize : uint32_t {
+        DEFAULT_GTA5_PHOTOBUFFER = 524288UL, /**< GTA V default Photo Buffer Size */
+        DEFAULT_RDR2_PHOTOBUFFER = 1048576UL, /**< RDR 2 default Photo Buffer Size */
+        DEFAULT_DESCBUFFER = 256UL, /**< Default Description Buffer Size */
+        DEFAULT_JSONBUFFER = 3072UL, /**< Default JSON Buffer Size */
+        DEFAULT_TITLBUFFER = 256UL, /**< Default Title Buffer Size */
+        GTA5_HEADERSIZE = 264UL, /**< GTA V Header Size */
+        RDR2_HEADERSIZE = 272UL, /**< RDR 2 Header Size */
+    };
+    /** Parsing and set errors */
+    enum Error : int32_t {
+        DescBufferTight = 39L, /**< Description Buffer is too tight */
+        DescMallocError = 31L, /**< Description Buffer can't be allocated */
+        DescReadError = 32L, /**< Description can't be read successfully */
+        HeaderBufferTight = 35L, /**< Header Buffer is too tight */
+        HeaderMallocError = 4L, /**< Header Buffer can't be allocated */
+        IncompatibleFormat = 2L, /**< Format is incompatible */
+        IncompleteChecksum = 7L, /**< Header checksum is incomplete */
+        IncompleteDescBuffer = 30L, /**< Description Buffer Size is incomplete */
+        IncompleteDescMarker = 28L, /**< Description Marker is incomplete */
+        IncompleteDescOffset = 11L, /**< Description Offset is incomplete */
+        IncompleteEOF = 8L, /**< End Of File Offset is incomplete */
+        IncompleteHeader = 3L, /**< Header is incomplete */
+        IncompleteJendMarker = 33L, /**< JEND Marker is incomplete */
+        IncompleteJpegMarker = 12L, /**< JPEG Marker is incomplete */
+        IncompleteJsonBuffer = 20L, /**< JSON Buffer Size is incomplete */
+        IncompleteJsonMarker = 18L, /**< JSON Marker incomplete */
+        IncompleteJsonOffset = 9L, /**< JSON Offset incomplete */
+        IncompletePhotoBuffer = 14L, /**< Photo Buffer Size is incomplete */
+        IncompletePhotoSize = 15L, /**< Photo Size is incomplete */
+        IncompleteTitleBuffer = 25L, /**< Title Buffer Size is incomplete */
+        IncompleteTitleMarker = 23L, /**< Title Marker is incomplete */
+        IncompleteTitleOffset = 10L, /**< Title Offset is incomplete */
+        IncorrectDescMarker = 29L, /**< Description Marker is incorrect */
+        IncorrectJendMarker = 34L, /**< JEND Marker is incorrect */
+        IncorrectJpegMarker = 13L, /**< JPEG Marker is incorrect */
+        IncorrectJsonMarker = 19L, /**< JSON Marker is incorrect */
+        IncorrectTitleMarker = 24L, /**< Title Marker is incorrect */
+        JsonBufferTight = 37L, /**< JSON Buffer is too tight */
+        JsonMallocError = 21L, /**< JSON Buffer can't be allocated */
+        JsonReadError = 22L, /**< JSON can't be read successfully */
+        NoError = 255L, /**< Finished without errors */
+        NoFormatIdentifier = 1L, /**< No format detected, empty file */
+        PhotoBufferTight = 36L, /**< Photo Buffer is too tight */
+        PhotoMallocError = 16L, /**< Photo Buffer can't be allocated */
+        PhotoReadError = 17L, /**< Photo can't be read */
+        TitleBufferTight = 38L, /**< Title Buffer is too tight */
+        TitleMallocError = 26L, /**< Title Buffer can't be allocated */
+        TitleReadError = 27L, /**< Title can't be read */
+        UnicodeInitError = 5L, /**< Failed to initialise Unicode decoder */
+        UnicodeHeaderError = 6L, /**< Header can't be encoded/decoded successfully */
+        Uninitialised = 0L, /**< Uninitialised, file access failed */
+    };
+    /** Photo Formats */
+    enum PhotoFormat : uint32_t {
+        GTA5 = 0x01000000UL, /**< GTA V Photo Format */
+        RDR2 = 0x04000000UL, /**< RDR 2 Photo Format */
+    };
+    /** Sign Initials */
+    enum SignInitials : uint32_t {
+        SIGTA5 = 0xE47AB81CUL, /**< GTA V Sign Initial */
+        SIRDR2 = 0x00FEEB1EUL, /**< RDR 2 Sign Initial */
+    };
+    RagePhoto();
+    ~RagePhoto();
+    void addParser(RagePhotoFormatParser *rp_parser); /**< Add a custom defined RagePhotoFormatParser. */
+    static void clear(RagePhotoData *rp_data); /**< Resets the RagePhotoData object to default values. */
+    void clear(); /**< Resets the RagePhotoData object to default values. */
+    RagePhotoData* data(); /**< Returns the internal RagePhotoData object. */
+    static bool load(const char *data, size_t size, RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser); /**< Loads a Photo from a const char*. */
+    /** Loads a Photo from a const char*.
+    * \param data Photo data
+    * \param size Photo data size
+    */
+    bool load(const char *data, size_t size);
+    /** Loads a Photo from a std::string.
+    * \param data Photo data
+    */
+    bool load(const std::string &data);
+    /** Loads a Photo from a file.
+    * \param filename File to load
+    */
+    bool loadFile(const std::string &filename);
+    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. */
+    static uint64_t jpegSign(uint32_t photoFormat, RagePhotoData *rp_data); /**< Returns the Photo JPEG sign. */
+    static uint64_t jpegSign(RagePhotoData *rp_data); /**< Returns the Photo JPEG sign. */
+    uint64_t jpegSign(uint32_t photoFormat) const; /**< Returns the Photo JPEG sign. */
+    uint64_t jpegSign() const; /**< Returns the Photo JPEG sign. */
+    uint32_t jpegSize() const; /**< Returns the Photo JPEG data size. */
+    const char* description() const; /**< Returns the Photo description. */
+    const char* json() const; /**< Returns the Photo JSON data. */
+    const char* header() const; /**< Returns the Photo header. */
+    const char* title() const; /**< Returns the Photo title. */
+    static const char* version(); /**< Returns the library version. */
+    static bool save(char *data, uint32_t photoFormat, RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser); /**< Saves a Photo to a char*. */
+    static bool save(char *data, RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser); /**< Saves a Photo to a char*. */
+    /** Saves a Photo to a char*.
+    * \param data Photo data
+    * \param photoFormat Photo Format (GTA V or RDR 2)
+    */
+    bool save(char *data, uint32_t photoFormat);
+    /** Saves a Photo to a char*.
+    * \param data Photo data
+    */
+    bool save(char *data);
+    /** Saves a Photo to a std::string.
+    * \param photoFormat Photo Format (GTA V or RDR 2)
+    * \param ok \p true when saved successfully
+    */
+    const std::string save(uint32_t photoFormat, bool *ok = nullptr);
+    /** Saves a Photo to a std::string.
+    * \param ok \p true when saved successfully
+    */
+    const std::string save(bool *ok = nullptr);
+    bool saveFile(const std::string &filename, uint32_t photoFormat); /**< Saves a Photo to a file. */
+    bool saveFile(const std::string &filename); /**< Saves a Photo to a file. */
+    static size_t saveSize(uint32_t photoFormat, RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser); /**< Returns the Photo save file size. */
+    static size_t saveSize(RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser); /**< Returns the Photo save file size. */
+    size_t saveSize(uint32_t photoFormat); /**< Returns the Photo save file size. */
+    size_t saveSize(); /**< Returns the Photo save file size. */
+    static void setBufferDefault(RagePhotoData *rp_data); /**< Sets all cross-format Buffer to default size. */
+    void setBufferDefault(); /**< Sets all cross-format Buffer to default size. */
+    static void setBufferOffsets(RagePhotoData *rp_data); /**< Moves all Buffer offsets to correct position. */
+    void setBufferOffsets(); /**< Moves all Buffer offsets to correct position. */
+    bool setData(RagePhotoData *rp_data, bool takeCopy = true); /**< Sets the internal RagePhotoData object. */
+    void setDescription(const char *description, uint32_t bufferSize = 0); /**< Sets the Photo description. */
+    void setFormat(uint32_t photoFormat); /**< Sets the Photo Format (GTA V or RDR 2). */
+    /** Sets the Photo JPEG data.
+    * \param data JPEG data
+    * \param size JPEG data size
+    * \param bufferSize JPEG buffer size
+    */
+    bool setJpeg(const char *data, uint32_t size, uint32_t bufferSize = 0);
+    /** Sets the Photo JPEG data.
+    * \param data JPEG data
+    * \param bufferSize JPEG buffer size
+    */
+    bool setJpeg(const std::string &data, uint32_t bufferSize = 0);
+    void setJson(const char *json, uint32_t bufferSize = 0); /**< Sets the Photo JSON data. */
+    void setHeader(const char *header, uint32_t headerSum, uint32_t headerSum2 = 0); /**< Sets the Photo header. */
+    void setTitle(const char *title, uint32_t bufferSize = 0); /**< Sets the Photo title. */
+
+private:
+    RagePhotoData *m_data;
+    RagePhotoFormatParser *m_parser;
+};
+#endif // __cplusplus
+
+#endif // RAGEPHOTO_HPP
diff --git a/src/RagePhotoA b/src/RagePhotoA
new file mode 100644
index 0000000..28c2211
--- /dev/null
+++ b/src/RagePhotoA
@@ -0,0 +1 @@
+#include "RagePhotoA.hpp"
diff --git a/src/RagePhotoA.h b/src/RagePhotoA.hpp
similarity index 99%
rename from src/RagePhotoA.h
rename to src/RagePhotoA.hpp
index c37a3d0..72955aa 100644
--- a/src/RagePhotoA.h
+++ b/src/RagePhotoA.hpp
@@ -16,11 +16,11 @@
 * responsible for anything with use of the software, you are self responsible.
 *****************************************************************************/
 
-#ifndef RAGEPHOTOA_H
-#define RAGEPHOTOA_H
+#ifndef RAGEPHOTOA_HPP
+#define RAGEPHOTOA_HPP
 
 #ifdef __cplusplus
-#include "RagePhotoC.h"
+#include "RagePhoto.h"
 #include <cstdlib>
 #include <iostream>
 
@@ -343,8 +343,6 @@ public:
 private:
     ragephoto_t instance;
 };
-#else
-#include "RagePhotoC.h"
 #endif // __cplusplus
 
-#endif // RAGEPHOTOA_H
+#endif // RAGEPHOTOA_HPP
diff --git a/src/RagePhotoC.h b/src/RagePhotoC.h
deleted file mode 100644
index 136de9a..0000000
--- a/src/RagePhotoC.h
+++ /dev/null
@@ -1,319 +0,0 @@
-/*****************************************************************************
-* libragephoto RAGE Photo Parser
-* 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:
-*
-* 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.
-*****************************************************************************/
-
-#ifndef RAGEPHOTOC_H
-#define RAGEPHOTOC_H
-
-#include "RagePhotoLibrary.h"
-#include "RagePhotoTypedefs.h"
-#include <stddef.h>
-#include <stdint.h>
-
-#ifdef LIBRAGEPHOTO_C_NOAPI
-#error "libragephoto was built without C API"
-#endif // LIBRAGEPHOTO_C_NOAPI
-
-#ifdef __cplusplus
-extern "C" {
-#endif // __cplusplus
-
-/** C API for RagePhoto.
-* \file RagePhotoC.h
-*/
-
-/** RagePhoto C instance/C++ class typedef. */
-typedef void* ragephoto_t;
-
-/** Opens a \p ragephoto_t instance. */
-LIBRAGEPHOTO_C_PUBLIC ragephoto_t ragephoto_open();
-
-/** Add a custom defined RagePhotoFormatParser.
-* \param instance \p ragephoto_t instance
-* \param rp_parser RagePhotoFormatParser parser to add
-*/
-LIBRAGEPHOTO_C_PUBLIC void ragephoto_addparser(ragephoto_t instance, RagePhotoFormatParser *rp_parser);
-
-/** Resets the RagePhotoData object to default values.
-* \param instance \p ragephoto_t instance
-*/
-LIBRAGEPHOTO_C_PUBLIC void ragephoto_clear(ragephoto_t instance);
-
-/** Resets the RagePhotoData object to default values.
-* \param rp_data RagePhotoData object
-*/
-LIBRAGEPHOTO_C_PUBLIC void ragephotodata_clear(RagePhotoData *rp_data);
-
-/** Loads a Photo from a const char*.
-* \param instance \p ragephoto_t instance
-* \param data Photo data
-* \param size Photo data size
-*/
-LIBRAGEPHOTO_C_PUBLIC bool ragephoto_load(ragephoto_t instance, const char *data, size_t size);
-
-/** Loads a Photo from a const char*.
-* \param rp_data RagePhotoData object
-* \param rp_parser RagePhotoFormatParser parser array
-* \param data Photo data
-* \param size Photo data size
-*/
-LIBRAGEPHOTO_C_PUBLIC bool ragephotodata_load(RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser, const char *data, size_t size);
-
-/** Loads a Photo from a file.
-* \param instance \p ragephoto_t instance
-* \param filename File to load
-*/
-LIBRAGEPHOTO_C_PUBLIC bool ragephoto_loadfile(ragephoto_t instance, const char *filename);
-
-/** Returns the last error occurred.
-* \param instance \p ragephoto_t instance
-*/
-LIBRAGEPHOTO_C_PUBLIC int32_t ragephoto_error(ragephoto_t instance);
-
-/** Returns the GTA V default Photo Buffer Size. */
-LIBRAGEPHOTO_C_PUBLIC uint32_t ragephoto_defpbuf_gta5();
-
-/** Returns the RDR 2 default Photo Buffer Size. */
-LIBRAGEPHOTO_C_PUBLIC uint32_t ragephoto_defpbuf_rdr2();
-
-/** Returns the GTA V Photo Format. */
-LIBRAGEPHOTO_C_PUBLIC uint32_t ragephoto_format_gta5();
-
-/** Returns the RDR 2 Photo Format. */
-LIBRAGEPHOTO_C_PUBLIC uint32_t ragephoto_format_rdr2();
-
-/** Returns the internal RagePhotoData object.
-* \param instance \p ragephoto_t instance
-*/
-LIBRAGEPHOTO_C_PUBLIC RagePhotoData* ragephoto_getphotodata(ragephoto_t instance);
-
-/** Returns the Photo description.
-* \param instance \p ragephoto_t instance
-*/
-LIBRAGEPHOTO_C_PUBLIC const char* ragephoto_getphotodesc(ragephoto_t instance);
-
-/** Returns the Photo Format (GTA V or RDR 2).
-* \param instance \p ragephoto_t instance
-*/
-LIBRAGEPHOTO_C_PUBLIC uint32_t ragephoto_getphotoformat(ragephoto_t instance);
-
-/** Returns the Photo JPEG data.
-* \param instance \p ragephoto_t instance
-*/
-LIBRAGEPHOTO_C_PUBLIC const char* ragephoto_getphotojpeg(ragephoto_t instance);
-
-/** Returns the Photo JSON data.
-* \param instance \p ragephoto_t instance
-*/
-LIBRAGEPHOTO_C_PUBLIC const char* ragephoto_getphotojson(ragephoto_t instance);
-
-/** Returns the Photo header.
-* \param instance \p ragephoto_t instance
-*/
-LIBRAGEPHOTO_C_PUBLIC const char* ragephoto_getphotoheader(ragephoto_t instance);
-
-/** Returns the Photo JPEG sign.
-* \param instance \p ragephoto_t instance
-*/
-LIBRAGEPHOTO_C_PUBLIC uint64_t ragephoto_getphotosign(ragephoto_t instance);
-
-/** Returns the Photo JPEG sign.
-* \param instance \p ragephoto_t instance
-* \param photoFormat Photo Format (GTA V or RDR 2)
-*/
-LIBRAGEPHOTO_C_PUBLIC uint64_t ragephoto_getphotosignf(ragephoto_t instance, uint32_t photoFormat);
-
-/** Returns the Photo JPEG sign.
-* \param rp_data RagePhotoData object
-*/
-LIBRAGEPHOTO_C_PUBLIC uint64_t ragephotodata_getphotosign(RagePhotoData *rp_data);
-
-/** Returns the Photo JPEG sign.
-* \param rp_data RagePhotoData object
-* \param photoFormat Photo Format (GTA V or RDR 2)
-*/
-LIBRAGEPHOTO_C_PUBLIC uint64_t ragephotodata_getphotosignf(RagePhotoData *rp_data, uint32_t photoFormat);
-
-/** Returns the Photo JPEG data size.
-* \param instance \p ragephoto_t instance
-*/
-LIBRAGEPHOTO_C_PUBLIC uint32_t ragephoto_getphotosize(ragephoto_t instance);
-
-/** Returns the Photo title.
-* \param instance \p ragephoto_t instance
-*/
-LIBRAGEPHOTO_C_PUBLIC const char* ragephoto_getphototitle(ragephoto_t instance);
-
-/** Returns the Photo save file size.
-* \param instance \p ragephoto_t instance
-*/
-LIBRAGEPHOTO_C_PUBLIC size_t ragephoto_getsavesize(ragephoto_t instance);
-
-/** Returns the Photo save file size.
-* \param rp_data RagePhotoData object
-* \param rp_parser RagePhotoFormatParser parser array
-*/
-LIBRAGEPHOTO_C_PUBLIC size_t ragephotodata_getsavesize(RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser);
-
-/** Returns the Photo save file size.
-* \param instance \p ragephoto_t instance
-* \param photoFormat Photo Format (GTA V or RDR 2)
-*/
-LIBRAGEPHOTO_C_PUBLIC size_t ragephoto_getsavesizef(ragephoto_t instance, uint32_t photoFormat);
-
-/** Returns the Photo save file size.
-* \param rp_data RagePhotoData object
-* \param rp_parser RagePhotoFormatParser parser array
-* \param photoFormat Photo Format (GTA V or RDR 2)
-*/
-LIBRAGEPHOTO_C_PUBLIC size_t ragephotodata_getsavesizef(RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser, uint32_t photoFormat);
-
-/** Saves a Photo to a char*.
-* \param instance \p ragephoto_t instance
-* \param data Photo data
-*/
-LIBRAGEPHOTO_C_PUBLIC bool ragephoto_save(ragephoto_t instance, char *data);
-
-/** Saves a Photo to a char*.
-* \param rp_data RagePhotoData object
-* \param rp_parser RagePhotoFormatParser parser array
-* \param data Photo data
-*/
-LIBRAGEPHOTO_C_PUBLIC bool ragephotodata_save(RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser, char *data);
-
-/** Saves a Photo to a char*.
-* \param instance \p ragephoto_t instance
-* \param data Photo data
-* \param photoFormat Photo Format (GTA V or RDR 2)
-*/
-LIBRAGEPHOTO_C_PUBLIC bool ragephoto_savef(ragephoto_t instance, char *data, uint32_t photoFormat);
-
-/** Saves a Photo to a char*.
-* \param rp_data RagePhotoData object
-* \param rp_parser RagePhotoFormatParser parser array
-* \param data Photo data
-* \param photoFormat Photo Format (GTA V or RDR 2)
-*/
-LIBRAGEPHOTO_C_PUBLIC bool ragephotodata_savef(RagePhotoData *rp_data, RagePhotoFormatParser *rp_parser, char *data, uint32_t photoFormat);
-
-/** Saves a Photo to a file.
-* \param instance \p ragephoto_t instance
-* \param filename File to save
-*/
-LIBRAGEPHOTO_C_PUBLIC bool ragephoto_savefile(ragephoto_t instance, const char *filename);
-
-/** Saves a Photo to a file.
-* \param instance \p ragephoto_t instance
-* \param filename File to save
-* \param photoFormat Photo Format (GTA V or RDR 2)
-*/
-LIBRAGEPHOTO_C_PUBLIC bool ragephoto_savefilef(ragephoto_t instance, const char *filename, uint32_t photoFormat);
-
-/** Sets all cross-format Buffer to default size.
-* \param instance \p ragephoto_t instance
-*/
-LIBRAGEPHOTO_C_PUBLIC void ragephoto_setbufferdefault(ragephoto_t instance);
-
-/** Sets all cross-format Buffer to default size.
-* \param rp_data RagePhotoData object
-*/
-LIBRAGEPHOTO_C_PUBLIC void ragephotodata_setbufferdefault(RagePhotoData *rp_data);
-
-/** Moves all Buffer offsets to correct position.
-* \param instance \p ragephoto_t instance
-*/
-LIBRAGEPHOTO_C_PUBLIC void ragephoto_setbufferoffsets(ragephoto_t instance);
-
-/** Moves all Buffer offsets to correct position.
-* \param rp_data RagePhotoData object
-*/
-LIBRAGEPHOTO_C_PUBLIC void ragephotodata_setbufferoffsets(RagePhotoData *rp_data);
-
-/** Sets the internal RagePhotoData object.
-* \param instance \p ragephoto_t instance
-* \param rp_data RagePhotoData object being set
-*/
-LIBRAGEPHOTO_C_PUBLIC bool ragephoto_setphotodata(ragephoto_t instance, RagePhotoData *rp_data);
-
-/** Copies RagePhotoData object to internal RagePhotoData object.
-* \param instance \p ragephoto_t instance
-* \param rp_data RagePhotoData object being copied
-*/
-LIBRAGEPHOTO_C_PUBLIC bool ragephoto_setphotodatac(ragephoto_t instance, RagePhotoData *rp_data);
-
-/** Sets the Photo description.
-* \param instance \p ragephoto_t instance
-* \param description Description
-* \param bufferSize Description buffer size
-*
-* Default bufferSize: 256UL
-*/
-LIBRAGEPHOTO_C_PUBLIC void ragephoto_setphotodesc(ragephoto_t instance, const char *description, uint32_t bufferSize);
-
-/** Sets the Photo Format (GTA V or RDR 2).
-* \param instance \p ragephoto_t instance
-* \param photoFormat Photo Format (GTA V or RDR 2)
-*/
-LIBRAGEPHOTO_C_PUBLIC void ragephoto_setphotoformat(ragephoto_t instance, uint32_t photoFormat);
-
-/** Sets the Photo JPEG data.
-* \param instance \p ragephoto_t instance
-* \param data JPEG data
-* \param size JPEG data size
-* \param bufferSize JPEG buffer size
-*
-* Default bufferSize: ragephoto_defpbuf_gta5() or ragephoto_defpbuf_rdr2()
-*/
-LIBRAGEPHOTO_C_PUBLIC bool ragephoto_setphotojpeg(ragephoto_t instance, const char *data, uint32_t size, uint32_t bufferSize);
-
-/** Sets the Photo JSON data.
-* \param instance \p ragephoto_t instance
-* \param json JSON data
-* \param bufferSize JSON data buffer size
-*
-* Default bufferSize: 3072UL
-*/
-LIBRAGEPHOTO_C_PUBLIC void ragephoto_setphotojson(ragephoto_t instance, const char *json, uint32_t bufferSize);
-
-/** Sets the Photo header. */
-LIBRAGEPHOTO_C_PUBLIC void ragephoto_setphotoheader(ragephoto_t instance, const char *header, uint32_t headerSum);
-
-/** Sets the Photo header. (RDR 2) */
-LIBRAGEPHOTO_C_PUBLIC void ragephoto_setphotoheader2(ragephoto_t instance, const char *header, uint32_t headerSum, uint32_t headerSum2);
-
-/** Sets the Photo title.
-* \param instance \p ragephoto_t instance
-* \param title Title
-* \param bufferSize Title buffer size
-*
-* Default bufferSize: 256UL
-*/
-LIBRAGEPHOTO_C_PUBLIC void ragephoto_setphototitle(ragephoto_t instance, const char *title, uint32_t bufferSize);
-
-/** Closes a \p ragephoto_t instance.
-* \param instance \p ragephoto_t instance
-*/
-LIBRAGEPHOTO_C_PUBLIC void ragephoto_close(ragephoto_t instance);
-
-/** Returns the library version. */
-LIBRAGEPHOTO_C_PUBLIC const char* ragephoto_version();
-
-#ifdef __cplusplus
-}
-#endif // __cplusplus
-
-#endif // RAGEPHOTOC_H
diff --git a/src/RagePhotoLibrary.h b/src/RagePhotoLibrary.h
index ffffba9..e50f44f 100644
--- a/src/RagePhotoLibrary.h
+++ b/src/RagePhotoLibrary.h
@@ -59,10 +59,9 @@
 
 /* ENABLE C API FOR RAGEPHOTO WASM LIBRARY BEGIN */
 #ifdef LIBRAGEPHOTO_WASM
-#ifdef RAGEPHOTO_C_NOAPI
-#undef RAGEPHOTO_C_NOAPI
+#ifndef RAGEPHOTO_C_API
 #define RAGEPHOTO_C_API
-#endif // RAGEPHOTO_C_NOAPI
+#endif // RAGEPHOTO_C_API
 #endif // LIBRAGEPHOTO_WASM
 /* ENABLE C API FOR RAGEPHOTO WASM LIBRARY END */