Add unit test for CStrecthEngine::PixelWeights. Demonstrate the underlying issue before applying fix. Bug: pdfium:1688 Change-Id: Ia6f2d2cc803f2a10fe048c4c5cda5698c9a4ed69 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/82153 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxge/dib/cstretchengine_unittest.cpp b/core/fxge/dib/cstretchengine_unittest.cpp index c3e3b8d..fec9eb0 100644 --- a/core/fxge/dib/cstretchengine_unittest.cpp +++ b/core/fxge/dib/cstretchengine_unittest.cpp
@@ -14,6 +14,42 @@ #include "core/fxge/dib/fx_dib.h" #include "testing/gtest/include/gtest/gtest.h" +namespace { + +uint32_t PixelWeightSum(const CStretchEngine::PixelWeight* weights) { + uint32_t sum = 0; + for (int j = weights->m_SrcStart; j <= weights->m_SrcEnd; ++j) { + sum += weights->GetWeightForPosition(j); + } + return sum; +} + +void ExecuteOneStretchTest(uint32_t dest_width, + uint32_t src_width, + const FXDIB_ResampleOptions& options) { + constexpr uint32_t kExpectedSum = 65536; // kFixedPointOne not exposed yet. + CStretchEngine::WeightTable table; + table.CalculateWeights(dest_width, 0, dest_width, src_width, 0, src_width, + options); + for (uint32_t i = 0; i < dest_width; ++i) { + EXPECT_EQ(kExpectedSum, PixelWeightSum(table.GetPixelWeight(i))) + << "for { " << src_width << ", " << dest_width << " } at " << i; + } +} + +void ExecuteStretchTests(const FXDIB_ResampleOptions& options) { + // Can't test everything, few random values chosen. + constexpr uint32_t kDestWidths[] = {1, 2, 337, 512, 808, 2550}; + constexpr uint32_t kSrcWidths[] = {1, 2, 187, 256, 809, 1110}; + for (uint32_t src_width : kSrcWidths) { + for (uint32_t dest_width : kDestWidths) { + ExecuteOneStretchTest(dest_width, src_width, options); + } + } +} + +} // namespace + TEST(CStretchEngine, OverflowInCtor) { FX_RECT clip_rect; RetainPtr<CPDF_Dictionary> dict_obj = pdfium::MakeRetain<CPDF_Dictionary>(); @@ -30,3 +66,29 @@ EXPECT_FALSE(engine.GetResampleOptionsForTest().bNoSmoothing); EXPECT_FALSE(engine.GetResampleOptionsForTest().bLossy); } + +// See https://crbug.com/pdfium/1688 +TEST(CStretchEngine, DISABLED_WeightRounding) { + FXDIB_ResampleOptions options; + ExecuteStretchTests(options); +} + +TEST(CStretchEngine, WeightRoundingNoSmoothing) { + FXDIB_ResampleOptions options; + options.bNoSmoothing = true; + ExecuteStretchTests(options); +} + +// See https://crbug.com/pdfium/1688 +TEST(CStretchEngine, DISABLED_WeightRoundingBilinear) { + FXDIB_ResampleOptions options; + options.bInterpolateBilinear = true; + ExecuteStretchTests(options); +} + +TEST(CStretchEngine, WeightRoundingNoSmoothingBilinear) { + FXDIB_ResampleOptions options; + options.bNoSmoothing = true; + options.bInterpolateBilinear = true; + ExecuteStretchTests(options); +}