Read data in bigger chunks in fax codec code.
In case there are long runs of data to be skipped, FindBit() runs much
faster reading and comparing 8 bytes at a time.
BUG=chromium:834633
Change-Id: Ifc7b348d123c5a72cf09fbf53d764075f8abfba0
Reviewed-on: https://pdfium-review.googlesource.com/32513
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
diff --git a/core/fxcodec/codec/fx_codec_fax.cpp b/core/fxcodec/codec/fx_codec_fax.cpp
index 20280a3..9739101 100644
--- a/core/fxcodec/codec/fx_codec_fax.cpp
+++ b/core/fxcodec/codec/fx_codec_fax.cpp
@@ -66,9 +66,21 @@
start_pos += 7;
}
- uint8_t skip = bit ? 0x00 : 0xff;
+ const uint8_t skip = bit ? 0x00 : 0xff;
+ const int max_byte = (max_pos + 7) / 8;
int byte_pos = start_pos / 8;
- int max_byte = (max_pos + 7) / 8;
+
+ // Try reading in bigger chunks in case there are long runs to be skipped.
+ static constexpr int kBulkReadSize = 8;
+ if (max_byte >= kBulkReadSize && byte_pos < max_byte - kBulkReadSize) {
+ uint8_t skip_block[kBulkReadSize];
+ memset(skip_block, skip, kBulkReadSize);
+ while (byte_pos < max_byte - kBulkReadSize &&
+ memcmp(data_buf + byte_pos, skip_block, kBulkReadSize) == 0) {
+ byte_pos += kBulkReadSize;
+ }
+ }
+
while (byte_pos < max_byte) {
if (data_buf[byte_pos] != skip)
break;