MCPcopy Create free account
hub / github.com/OpenRCT2/OpenRCT2 / EncodeChunkRLE

Function EncodeChunkRLE

src/openrct2/sawyer_coding/SawyerCoding.cpp:258–304  ·  view source on GitHub ↗

* Ensure dst_buffer is bigger than src_buffer then resize afterwards * returns length of dst_buffer */

Source from the content-addressed store, hash-verified

256 * returns length of dst_buffer
257 */
258 size_t EncodeChunkRLE(const uint8_t* src_buffer, uint8_t* dst_buffer, size_t length)
259 {
260 const uint8_t* src = src_buffer;
261 uint8_t* dst = dst_buffer;
262 const uint8_t* end_src = src + length;
263 uint8_t count = 0;
264 const uint8_t* src_norm_start = src;
265
266 while (src < end_src - 1)
267 {
268 if ((count && *src == src[1]) || count > 125)
269 {
270 *dst++ = count - 1;
271 std::memcpy(dst, src_norm_start, count);
272 dst += count;
273 src_norm_start += count;
274 count = 0;
275 }
276 if (*src == src[1])
277 {
278 for (; (count < 125) && ((src + count) < end_src); count++)
279 {
280 if (*src != src[count])
281 break;
282 }
283 *dst++ = 257 - count;
284 *dst++ = *src;
285 src += count;
286 src_norm_start = src;
287 count = 0;
288 }
289 else
290 {
291 count++;
292 src++;
293 }
294 }
295 if (src == end_src - 1)
296 count++;
297 if (count)
298 {
299 *dst++ = count - 1;
300 std::memcpy(dst, src_norm_start, count);
301 dst += count;
302 }
303 return dst - dst_buffer;
304 }
305
306 size_t EncodeChunkRepeat(const uint8_t* src_buffer, uint8_t* dst_buffer, size_t length)
307 {

Callers 4

WriteChunkBufferFunction · 0.85
EncodeSV4Function · 0.85
EncodeTD6Function · 0.85
WriteChunkTrackMethod · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected