Fix unusable FPDFBitmap_GetBuffer() return values FPDFBitmap_GetBuffer() can return a bitmap with a color palette, yet there is no public API to access to palette. Avoid this situation by converting the bitmap to one without a palette. Bug: pdfium:1190 Change-Id: Ic3a3d49647e358c5be96106d4b3acc55578948de Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/111752 Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/fpdfsdk/fpdf_edit_embeddertest.cpp b/fpdfsdk/fpdf_edit_embeddertest.cpp index d29a2d3..f22aa86 100644 --- a/fpdfsdk/fpdf_edit_embeddertest.cpp +++ b/fpdfsdk/fpdf_edit_embeddertest.cpp
@@ -4004,8 +4004,8 @@ obj = FPDFPage_GetObject(page, 35); ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj)); ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(obj)); - EXPECT_EQ(FPDFBitmap_Gray, FPDFBitmap_GetFormat(bitmap.get())); - CompareBitmap(bitmap.get(), 92, 68, "9c6d76cb1e37ef8514f9455d759391f3"); + EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(bitmap.get())); + CompareBitmap(bitmap.get(), 92, 68, "7e34551035943e30a9f353db17de62ab"); } { @@ -4096,8 +4096,8 @@ { ScopedFPDFBitmap bitmap(FPDFImageObj_GetBitmap(obj)); ASSERT_TRUE(bitmap); - EXPECT_EQ(FPDFBitmap_Gray, FPDFBitmap_GetFormat(bitmap.get())); - CompareBitmap(bitmap.get(), 1152, 720, "3f6a48e2b3e91b799bf34567f55cb4de"); + EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(bitmap.get())); + CompareBitmap(bitmap.get(), 1152, 720, "0b67a5d69f3f1052abddd5cdd882a126"); } UnloadPage(page);
diff --git a/fpdfsdk/fpdf_editimg.cpp b/fpdfsdk/fpdf_editimg.cpp index 8e3402f..f26c1eb 100644 --- a/fpdfsdk/fpdf_editimg.cpp +++ b/fpdfsdk/fpdf_editimg.cpp
@@ -27,6 +27,7 @@ #include "core/fxge/dib/cfx_dibitmap.h" #include "fpdfsdk/cpdfsdk_customaccess.h" #include "fpdfsdk/cpdfsdk_helpers.h" +#include "third_party/base/notreached.h" namespace { @@ -198,13 +199,35 @@ if (!pSource) return nullptr; - // If the source image has a representation of 1 bit per pixel, then convert - // it to a grayscale bitmap having 1 byte per pixel, since bitmaps have no - // concept of bits. Otherwise, convert the source image to a bitmap directly, + // If the source image has a representation of 1 bit per pixel, or if the + // source image has a color palette, convert it to a color representation if + // needed to get rid of the palette, as there is no public API to access to + // palette. + // + // Otherwise, convert the source image to a bitmap directly, // retaining its color representation. - RetainPtr<CFX_DIBitmap> pBitmap = - pSource->GetBPP() == 1 ? pSource->ConvertTo(FXDIB_Format::k8bppRgb) - : pSource->Realize(); + // + // Only return FPDF_BITMAPs in formats that FPDFBitmap_CreateEx() would + // return. + RetainPtr<CFX_DIBitmap> pBitmap; + switch (pSource->GetFormat()) { + case FXDIB_Format::k1bppMask: + case FXDIB_Format::k1bppRgb: + case FXDIB_Format::k8bppMask: + case FXDIB_Format::k8bppRgb: + pBitmap = pSource->ConvertTo(FXDIB_Format::kRgb); + break; + + case FXDIB_Format::kArgb: + case FXDIB_Format::kRgb: + case FXDIB_Format::kRgb32: + pBitmap = pSource->Realize(); + break; + + case FXDIB_Format::kInvalid: { + NOTREACHED_NORETURN(); + } + } return FPDFBitmapFromCFXDIBitmap(pBitmap.Leak()); }