mirror of
https://github.com/mhx/dwarfs.git
synced 2025-09-11 05:23:29 -04:00
feat(ricepp): some minor speed improvements
This commit is contained in:
parent
f95e59e10b
commit
f1672b6c78
@ -50,20 +50,20 @@ void decode_block(V block, BitstreamReader& reader, PixelTraits const& traits,
|
|||||||
if (fsp1 == 0) [[unlikely]] {
|
if (fsp1 == 0) [[unlikely]] {
|
||||||
std::fill(block.begin(), block.end(), traits.write(last));
|
std::fill(block.begin(), block.end(), traits.write(last));
|
||||||
} else if (fsp1 > kFsMax) [[unlikely]] {
|
} else if (fsp1 > kFsMax) [[unlikely]] {
|
||||||
for (size_t i = 0; i < block.size(); ++i) {
|
for (auto& b : block) {
|
||||||
block[i] = reader.template read_bits<pixel_value_type>(kPixelBits);
|
b = reader.template read_bits<pixel_value_type>(kPixelBits);
|
||||||
}
|
}
|
||||||
last = traits.read(block.back());
|
last = traits.read(block.back());
|
||||||
} else {
|
} else {
|
||||||
auto const fs = fsp1 - 1;
|
auto const fs = fsp1 - 1;
|
||||||
for (size_t i = 0; i < block.size(); ++i) {
|
for (auto& b : block) {
|
||||||
pixel_value_type diff = reader.find_first_set() << fs;
|
pixel_value_type diff = reader.find_first_set() << fs;
|
||||||
if (fs > 0) {
|
if (fs > 0) {
|
||||||
diff |= reader.template read_bits<pixel_value_type>(fs);
|
diff |= reader.template read_bits<pixel_value_type>(fs);
|
||||||
}
|
}
|
||||||
last += static_cast<std::make_signed_t<pixel_value_type>>(
|
last += static_cast<std::make_signed_t<pixel_value_type>>(
|
||||||
(diff & 1) ? ~(diff >> 1) : (diff >> 1));
|
(diff & 1) ? ~(diff >> 1) : (diff >> 1));
|
||||||
block[i] = traits.write(last);
|
b = traits.write(last);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,8 +125,8 @@ void encode_block(V block, BitstreamWriter& writer, PixelTraits const& traits,
|
|||||||
// the input pixel data. This is really unlikely, so reading the input
|
// the input pixel data. This is really unlikely, so reading the input
|
||||||
// pixels again is fine.
|
// pixels again is fine.
|
||||||
writer.write_bits(kFsMax + 1, kFsBits);
|
writer.write_bits(kFsMax + 1, kFsBits);
|
||||||
for (size_t i = 0; i < block.size(); ++i) {
|
for (auto& b : block) {
|
||||||
writer.write_bits(block[i], kPixelBits);
|
writer.write_bits(b, kPixelBits);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Encode the difference values using Rice entropy coding.
|
// Encode the difference values using Rice entropy coding.
|
||||||
@ -134,7 +134,7 @@ void encode_block(V block, BitstreamWriter& writer, PixelTraits const& traits,
|
|||||||
for (size_t i = 0; i < block.size(); ++i) {
|
for (size_t i = 0; i < block.size(); ++i) {
|
||||||
pixel_value_type const diff = delta[i];
|
pixel_value_type const diff = delta[i];
|
||||||
pixel_value_type const top = diff >> fs;
|
pixel_value_type const top = diff >> fs;
|
||||||
if (top > 0) {
|
if (top > 0) [[unlikely]] {
|
||||||
writer.write_bit(0, top);
|
writer.write_bit(0, top);
|
||||||
}
|
}
|
||||||
writer.write_bit(1);
|
writer.write_bit(1);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user