Relax pitch check in CFX_DIBitmap::CalculatePitchAndSize()

When a pitch value has been provided, check it is valid, but do not
require it to be a multiple of 4.

Bug: pdfium:2112
Change-Id: Ia282e45e9af38ec8abcef1890c43b27449f43d2c
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/115310
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxge/dib/cfx_dibitmap.cpp b/core/fxge/dib/cfx_dibitmap.cpp
index fa5b1b1..f3d70e4 100644
--- a/core/fxge/dib/cfx_dibitmap.cpp
+++ b/core/fxge/dib/cfx_dibitmap.cpp
@@ -677,14 +677,16 @@
   if (!bpp) {
     return absl::nullopt;
   }
-  absl::optional<uint32_t> pitch32 = fxge::CalculatePitch32(bpp, width);
-  if (!pitch32.has_value()) {
-    return absl::nullopt;
-  }
   if (pitch == 0) {
+    absl::optional<uint32_t> pitch32 = fxge::CalculatePitch32(bpp, width);
+    if (!pitch32.has_value()) {
+      return absl::nullopt;
+    }
     pitch = pitch32.value();
   } else {
-    if (pitch < pitch32.value()) {
+    absl::optional<uint32_t> actual_pitch =
+        fxge::CalculatePitch8(bpp, /*components=*/1, width);
+    if (!actual_pitch.has_value() || pitch < actual_pitch.value()) {
       return absl::nullopt;
     }
   }
diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp
index 41e6ae6..d708e8a 100644
--- a/fpdfsdk/fpdf_view_embeddertest.cpp
+++ b/fpdfsdk/fpdf_view_embeddertest.cpp
@@ -2183,6 +2183,5 @@
   std::vector<uint8_t> vec(kStride * kHeight);
   ScopedFPDFBitmap bitmap(FPDFBitmap_CreateEx(kWidth, kHeight, FPDFBitmap_BGR,
                                               vec.data(), kStride));
-  // TODO(crbug.com/pdfium/2112): Should return FPDFBitmap_BGR.
-  EXPECT_EQ(FPDFBitmap_Unknown, FPDFBitmap_GetFormat(bitmap.get()));
+  EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(bitmap.get()));
 }