245 const size_t data_dec_len,
246 const size_t data_enc_extra_size,
247 size_t *r_data_enc_len)
249 size_t data_enc_alloc_size = data_enc_extra_size +
264 constexpr size_t rle_skip_threshold =
sizeof(
RLE_Literal);
270 for (
size_t ofs_dec = 0, span_skip_next = 1; ofs_dec < data_dec_len;) {
272 size_t ofs_dec_next = ofs_dec + span_skip_next;
280 const size_t span = ofs_dec_next - ofs_dec;
281 if (span >= rle_skip_threshold) {
283 BLI_assert(data_dec[ofs_dec] == data_dec[(ofs_dec + span) - 1]);
284 BLI_assert((ofs_dec + span == data_dec_len) ||
285 (data_dec[ofs_dec] != data_dec[(ofs_dec + span)]));
286 e->head.span_size = span;
288 data_enc_alloc_size +=
sizeof(
RLE_Span);
295 size_t ofs_dec_test = ofs_dec_next + 1;
296 if (
LIKELY(ofs_dec_test < data_dec_len)) {
298 size_t ofs_dec_test_start = ofs_dec_next;
303 const size_t span_test = ofs_dec_test - ofs_dec_test_start;
305 if (span_test == rle_skip_threshold) {
308 span_skip_next = span_test;
309 ofs_dec_next = ofs_dec_test_start;
314 BLI_assert(ofs_dec_test - ofs_dec_test_start < rle_skip_threshold);
316 ofs_dec_test_start = ofs_dec_test;
320 if (
UNLIKELY(ofs_dec_test == data_dec_len)) {
321 ofs_dec_next = data_dec_len;
327 ofs_dec_next = data_dec_len;
331 const size_t non_rle_span = ofs_dec_next - ofs_dec;
332 e->head.span_size = 0;
333 e->literal.value = non_rle_span;
334 data_enc_alloc_size +=
sizeof(
RLE_Literal) + non_rle_span;
337 ofs_dec = ofs_dec_next;
342 data_enc += data_enc_extra_size;
352 if (
e->head.span_size) {
353 memcpy(data_enc + ofs_enc, &
e->span,
sizeof(
RLE_Span));
355 ofs_dec +=
e->head.span_size;
358 memcpy(data_enc + ofs_enc, &
e->literal,
sizeof(
RLE_Literal));
361 const size_t non_rle_span =
e->literal.value;
362 memcpy(data_enc + ofs_enc, data_dec + ofs_dec, non_rle_span);
363 ofs_enc += non_rle_span;
364 ofs_dec += non_rle_span;
372 memset(data_enc + ofs_enc, 0x0,
sizeof(
RLE_Literal));
374 *r_data_enc_len = data_enc_alloc_size - data_enc_extra_size;
376 data_enc -= data_enc_extra_size;
381 const size_t data_enc_len,
383 const size_t data_dec_len)
387 uint8_t *data_dec =
reinterpret_cast<uint8_t *
>(data_dec_v);
394 memcpy(&
e, data_enc + ofs_enc,
sizeof(
RLE_Head));
396 if (
e.span_size != 0) {
398 const uint8_t value = *
reinterpret_cast<const uint8_t *
>(data_enc + ofs_enc);
399 memset(data_dec + ofs_dec,
int(value),
e.span_size);
400 ofs_enc +=
sizeof(uint8_t);
401 ofs_dec +=
e.span_size;
406 memcpy(&non_rle_span, data_enc + ofs_enc,
sizeof(
size_t));
407 ofs_enc +=
sizeof(size_t);
409 memcpy(data_dec + ofs_dec, data_enc + ofs_enc, non_rle_span);
410 ofs_enc += non_rle_span;
411 ofs_dec += non_rle_span;