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;