From d2a2f0e8aeda4cefb2588e4ed1673e248098c2b0 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 15 Apr 2024 02:57:42 +0300 Subject: [PATCH] rle module moved to coders package --- src/coders/rle.cpp | 90 ++++++++++++++++++++++++++++++++++++++++ src/coders/rle.h | 17 ++++++++ src/files/WorldFiles.cpp | 2 +- src/files/rle.cpp | 90 ---------------------------------------- src/files/rle.h | 17 -------- 5 files changed, 108 insertions(+), 108 deletions(-) create mode 100644 src/coders/rle.cpp create mode 100644 src/coders/rle.h delete mode 100644 src/files/rle.cpp delete mode 100644 src/files/rle.h diff --git a/src/coders/rle.cpp b/src/coders/rle.cpp new file mode 100644 index 00000000..06cd1828 --- /dev/null +++ b/src/coders/rle.cpp @@ -0,0 +1,90 @@ +#include "rle.h" + +size_t rle::decode(const ubyte* src, size_t srclen, ubyte* dst) { + size_t offset = 0; + for (size_t i = 0; i < srclen;) { + ubyte len = src[i++]; + ubyte c = src[i++]; + for (size_t j = 0; j <= len; j++) { + dst[offset++] = c; + } + } + return offset; +} + +size_t rle::encode(const ubyte* src, size_t srclen, ubyte* dst) { + if (srclen == 0) { + return 0; + } + size_t offset = 0; + ubyte counter = 0; + ubyte c = src[0]; + for (size_t i = 1; i < srclen; i++) { + ubyte cnext = src[i]; + if (cnext != c || counter == 255) { + dst[offset++] = counter; + dst[offset++] = c; + c = cnext; + counter = 0; + } + else { + counter++; + } + } + dst[offset++] = counter; + dst[offset++] = c; + return offset; +} + + +size_t extrle::decode(const ubyte* src, size_t srclen, ubyte* dst) { + size_t offset = 0; + for (size_t i = 0; i < srclen;) { + uint len = src[i++]; + if (len & 0x80) { + len &= 0x7F; + len |= ((uint)src[i++]) << 7; + } + ubyte c = src[i++]; + for (size_t j = 0; j <= len; j++) { + dst[offset++] = c; + } + } + return offset; +} + +size_t extrle::encode(const ubyte* src, size_t srclen, ubyte* dst) { + if (srclen == 0) { + return 0; + } + size_t offset = 0; + uint counter = 0; + ubyte c = src[0]; + for (size_t i = 1; i < srclen; i++) { + ubyte cnext = src[i]; + if (cnext != c || counter == max_sequence) { + if (counter >= 0x80) { + dst[offset++] = 0x80 | (counter & 0x7F); + dst[offset++] = counter >> 7; + } + else { + dst[offset++] = counter; + } + dst[offset++] = c; + c = cnext; + counter = 0; + } + else { + counter++; + } + } + if (counter >= 0x80) { + dst[offset++] = 0x80 | (counter & 0x7F); + dst[offset++] = counter >> 7; + } + else { + dst[offset++] = counter; + } + dst[offset++] = c; + return offset; +} diff --git a/src/coders/rle.h b/src/coders/rle.h new file mode 100644 index 00000000..79d8601e --- /dev/null +++ b/src/coders/rle.h @@ -0,0 +1,17 @@ +#ifndef CODERS_RLE_H_ +#define CODERS_RLE_H_ + +#include "../typedefs.h" + +namespace rle { + size_t encode(const ubyte* src, size_t length, ubyte* dst); + size_t decode(const ubyte* src, size_t length, ubyte* dst); +} + +namespace extrle { + constexpr uint max_sequence = 0x7FFF; + size_t encode(const ubyte* src, size_t length, ubyte* dst); + size_t decode(const ubyte* src, size_t length, ubyte* dst); +} + +#endif // CODERS_RLE_H_ diff --git a/src/files/WorldFiles.cpp b/src/files/WorldFiles.cpp index 8a4a3904..d9d2a598 100644 --- a/src/files/WorldFiles.cpp +++ b/src/files/WorldFiles.cpp @@ -2,6 +2,7 @@ #include "../coders/byte_utils.h" #include "../coders/json.h" +#include "../coders/rle.h" #include "../constants.h" #include "../content/Content.h" #include "../core_defs.h" @@ -19,7 +20,6 @@ #include "../voxels/voxel.h" #include "../window/Camera.h" #include "../world/World.h" -#include "rle.h" #include #include diff --git a/src/files/rle.cpp b/src/files/rle.cpp deleted file mode 100644 index 5a5c5714..00000000 --- a/src/files/rle.cpp +++ /dev/null @@ -1,90 +0,0 @@ -#include "rle.h" - -size_t rle::decode(const ubyte* src, size_t srclen, ubyte* dst) { - size_t offset = 0; - for (size_t i = 0; i < srclen;) { - ubyte len = src[i++]; - ubyte c = src[i++]; - for (size_t j = 0; j <= len; j++) { - dst[offset++] = c; - } - } - return offset; -} - -size_t rle::encode(const ubyte* src, size_t srclen, ubyte* dst) { - if (srclen == 0) { - return 0; - } - size_t offset = 0; - ubyte counter = 0; - ubyte c = src[0]; - for (size_t i = 1; i < srclen; i++) { - ubyte cnext = src[i]; - if (cnext != c || counter == 255) { - dst[offset++] = counter; - dst[offset++] = c; - c = cnext; - counter = 0; - } - else { - counter++; - } - } - dst[offset++] = counter; - dst[offset++] = c; - return offset; -} - - -size_t extrle::decode(const ubyte* src, size_t srclen, ubyte* dst) { - size_t offset = 0; - for (size_t i = 0; i < srclen;) { - uint len = src[i++]; - if (len & 0x80) { - len &= 0x7F; - len |= ((uint)src[i++]) << 7; - } - ubyte c = src[i++]; - for (size_t j = 0; j <= len; j++) { - dst[offset++] = c; - } - } - return offset; -} - -size_t extrle::encode(const ubyte* src, size_t srclen, ubyte* dst) { - if (srclen == 0) { - return 0; - } - size_t offset = 0; - uint counter = 0; - ubyte c = src[0]; - for (size_t i = 1; i < srclen; i++) { - ubyte cnext = src[i]; - if (cnext != c || counter == max_sequence) { - if (counter >= 0x80) { - dst[offset++] = 0x80 | (counter & 0x7F); - dst[offset++] = counter >> 7; - } - else { - dst[offset++] = counter; - } - dst[offset++] = c; - c = cnext; - counter = 0; - } - else { - counter++; - } - } - if (counter >= 0x80) { - dst[offset++] = 0x80 | (counter & 0x7F); - dst[offset++] = counter >> 7; - } - else { - dst[offset++] = counter; - } - dst[offset++] = c; - return offset; -} diff --git a/src/files/rle.h b/src/files/rle.h deleted file mode 100644 index 0dcbe042..00000000 --- a/src/files/rle.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef FILES_RLE_H_ -#define FILES_RLE_H_ - -#include "../typedefs.h" - -namespace rle { - size_t encode(const ubyte* src, size_t length, ubyte* dst); - size_t decode(const ubyte* src, size_t length, ubyte* dst); -} - -namespace extrle { - constexpr uint max_sequence = 0x7FFF; - size_t encode(const ubyte* src, size_t length, ubyte* dst); - size_t decode(const ubyte* src, size_t length, ubyte* dst); -} - -#endif // FILES_RLE_H_