mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-21 23:20:20 +00:00
AK+LibCompress: Remove the Deflate back-reference intermediate buffer
Instead of reading bytes from the output stream into a buffer, just to immediately write them back out, we can skip the middle-man and copy the bytes directly into the output buffer.
This commit is contained in:
parent
9f238793e0
commit
8b56d82865
Notes:
sideshowbarker
2024-07-16 23:57:20 +09:00
Author: https://github.com/trflynn89 Commit: https://github.com/SerenityOS/serenity/commit/8b56d82865 Pull-request: https://github.com/SerenityOS/serenity/pull/18106
3 changed files with 19 additions and 3 deletions
|
@ -206,4 +206,20 @@ ErrorOr<size_t> CircularBuffer::fill_from_stream(Stream& stream)
|
|||
return bytes.size();
|
||||
}
|
||||
|
||||
ErrorOr<void> CircularBuffer::copy_from_seekback(size_t distance, size_t length)
|
||||
{
|
||||
if (distance > m_seekback_limit)
|
||||
return Error::from_string_literal("Tried a seekback copy beyond the seekback limit");
|
||||
|
||||
while (length > 0) {
|
||||
auto next_span = next_read_span_with_seekback(distance);
|
||||
if (next_span.size() == 0)
|
||||
break;
|
||||
|
||||
length -= write(next_span.trim(length));
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -33,6 +33,8 @@ public:
|
|||
/// before the current write pointer and allows for reading already-read data.
|
||||
ErrorOr<Bytes> read_with_seekback(Bytes bytes, size_t distance);
|
||||
|
||||
ErrorOr<void> copy_from_seekback(size_t distance, size_t length);
|
||||
|
||||
[[nodiscard]] size_t empty_space() const;
|
||||
[[nodiscard]] size_t used_space() const;
|
||||
[[nodiscard]] size_t capacity() const;
|
||||
|
|
|
@ -207,9 +207,7 @@ ErrorOr<bool> DeflateDecompressor::CompressedBlock::try_read_more()
|
|||
m_decompressor.m_output_buffer.write({ &byte, sizeof(byte) });
|
||||
}
|
||||
} else {
|
||||
Array<u8, DeflateDecompressor::max_back_reference_length> buffer;
|
||||
auto bytes = TRY(m_decompressor.m_output_buffer.read_with_seekback({ buffer.data(), length }, distance));
|
||||
m_decompressor.m_output_buffer.write(bytes);
|
||||
TRY(m_decompressor.m_output_buffer.copy_from_seekback(distance, length));
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
Loading…
Reference in a new issue