| // Copyright 2019 PDFium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "core/fxge/cfx_windowsrenderdevice.h" | |
| #include <windows.h> | |
| #include <memory> | |
| #include "core/fxge/cfx_fillrenderoptions.h" | |
| #include "core/fxge/cfx_pathdata.h" | |
| #include "testing/embedder_test.h" | |
| #include "testing/gtest/include/gtest/gtest.h" | |
| namespace { | |
| constexpr CFX_Matrix kIdentityMatrix; | |
| } // namespace | |
| class CFX_WindowsRenderDeviceTest : public EmbedderTest { | |
| public: | |
| void SetUp() override { | |
| EmbedderTest::SetUp(); | |
| // Get a device context with Windows GDI. | |
| m_hDC = CreateCompatibleDC(nullptr); | |
| ASSERT_TRUE(m_hDC); | |
| m_driver = std::make_unique<CFX_WindowsRenderDevice>(m_hDC, nullptr); | |
| m_driver->SaveState(); | |
| } | |
| void TearDown() override { | |
| m_driver->RestoreState(false); | |
| m_driver.reset(); | |
| DeleteDC(m_hDC); | |
| EmbedderTest::TearDown(); | |
| } | |
| protected: | |
| HDC m_hDC; | |
| std::unique_ptr<CFX_WindowsRenderDevice> m_driver; | |
| }; | |
| TEST_F(CFX_WindowsRenderDeviceTest, SimpleClipTriangle) { | |
| CFX_PathData path_data; | |
| CFX_PointF p1(0.0f, 0.0f); | |
| CFX_PointF p2(0.0f, 100.0f); | |
| CFX_PointF p3(100.0f, 100.0f); | |
| path_data.AppendLine(p1, p2); | |
| path_data.AppendLine(p2, p3); | |
| path_data.AppendLine(p3, p1); | |
| path_data.ClosePath(); | |
| EXPECT_TRUE(m_driver->SetClip_PathFill( | |
| &path_data, &kIdentityMatrix, CFX_FillRenderOptions::WindingOptions())); | |
| } | |
| TEST_F(CFX_WindowsRenderDeviceTest, SimpleClipRect) { | |
| CFX_PathData path_data; | |
| path_data.AppendRect(0.0f, 100.0f, 200.0f, 0.0f); | |
| path_data.ClosePath(); | |
| EXPECT_TRUE(m_driver->SetClip_PathFill( | |
| &path_data, &kIdentityMatrix, CFX_FillRenderOptions::WindingOptions())); | |
| } | |
| TEST_F(CFX_WindowsRenderDeviceTest, GargantuanClipRect) { | |
| CFX_PathData path_data; | |
| path_data.AppendRect(-257698020.0f, -257697252.0f, 257698044.0f, | |
| 257698812.0f); | |
| path_data.ClosePath(); | |
| // These coordinates for a clip path are valid, just very large. Using these | |
| // for a clip path should allow IntersectClipRect() to return success; | |
| // however they do not because the GDI API IntersectClipRect() errors out and | |
| // affect subsequent imaging. crbug.com/1019026 | |
| EXPECT_FALSE(m_driver->SetClip_PathFill( | |
| &path_data, &kIdentityMatrix, CFX_FillRenderOptions::WindingOptions())); | |
| } | |
| TEST_F(CFX_WindowsRenderDeviceTest, GargantuanClipRectWithBaseClip) { | |
| CFX_PathData path_data; | |
| const FX_RECT kBaseClip(0, 0, 5100, 6600); | |
| m_driver->SetBaseClip(kBaseClip); | |
| path_data.AppendRect(-257698020.0f, -257697252.0f, 257698044.0f, | |
| 257698812.0f); | |
| path_data.ClosePath(); | |
| // Use of a reasonable base clip ensures that we avoid getting an error back | |
| // from GDI API IntersectClipRect(). | |
| EXPECT_TRUE(m_driver->SetClip_PathFill( | |
| &path_data, &kIdentityMatrix, CFX_FillRenderOptions::WindingOptions())); | |
| } |