| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "printing/emf_win.h" | 5 #include "printing/emf_win.h" |
| 6 | 6 |
| 7 // For quick access. | 7 // For quick access. |
| 8 #include <wingdi.h> | 8 #include <wingdi.h> |
| 9 #include <winspool.h> | 9 #include <winspool.h> |
| 10 | 10 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 }; | 36 }; |
| 37 | 37 |
| 38 const uint32 EMF_HEADER_SIZE = 128; | 38 const uint32 EMF_HEADER_SIZE = 128; |
| 39 | 39 |
| 40 } // namespace | 40 } // namespace |
| 41 | 41 |
| 42 namespace printing { | 42 namespace printing { |
| 43 | 43 |
| 44 TEST(EmfTest, DC) { | 44 TEST(EmfTest, DC) { |
| 45 // Simplest use case. | 45 // Simplest use case. |
| 46 printing::Emf emf; | 46 uint32 size; |
| 47 RECT rect = {100, 100, 200, 200}; | |
| 48 HDC hdc = CreateCompatibleDC(NULL); | |
| 49 EXPECT_TRUE(hdc != NULL); | |
| 50 EXPECT_TRUE(emf.CreateDc(hdc, &rect)); | |
| 51 EXPECT_TRUE(emf.context() != NULL); | |
| 52 // In theory, you'd use the HDC with GDI functions here. | |
| 53 EXPECT_TRUE(emf.Close()); | |
| 54 uint32 size = emf.GetDataSize(); | |
| 55 EXPECT_EQ(size, EMF_HEADER_SIZE); | |
| 56 std::vector<BYTE> data; | 47 std::vector<BYTE> data; |
| 57 EXPECT_TRUE(emf.GetData(&data)); | 48 { |
| 58 EXPECT_EQ(data.size(), size); | 49 printing::Emf emf; |
| 59 emf.CloseEmf(); | 50 EXPECT_TRUE(emf.Init()); |
| 60 EXPECT_TRUE(DeleteDC(hdc)); | 51 EXPECT_TRUE(emf.context() != NULL); |
| 52 // An empty EMF is invalid, so we put at least a rectangle in it. |
| 53 ::Rectangle(emf.context(), 10, 10, 190, 190); |
| 54 EXPECT_TRUE(emf.Close()); |
| 55 size = emf.GetDataSize(); |
| 56 EXPECT_GT(size, EMF_HEADER_SIZE); |
| 57 EXPECT_TRUE(emf.GetData(&data)); |
| 58 EXPECT_EQ(data.size(), size); |
| 59 } |
| 61 | 60 |
| 62 // Playback the data. | 61 // Playback the data. |
| 63 hdc = CreateCompatibleDC(NULL); | 62 printing::Emf emf; |
| 63 EXPECT_TRUE(emf.Init(&data.front(), size)); |
| 64 HDC hdc = CreateCompatibleDC(NULL); |
| 64 EXPECT_TRUE(hdc); | 65 EXPECT_TRUE(hdc); |
| 65 EXPECT_TRUE(emf.Init(&data.front(), size)); | |
| 66 RECT output_rect = {0, 0, 10, 10}; | 66 RECT output_rect = {0, 0, 10, 10}; |
| 67 EXPECT_TRUE(emf.Playback(hdc, &output_rect)); | 67 EXPECT_TRUE(emf.Playback(hdc, &output_rect)); |
| 68 EXPECT_TRUE(DeleteDC(hdc)); | 68 EXPECT_TRUE(DeleteDC(hdc)); |
| 69 } | 69 } |
| 70 | 70 |
| 71 // Disabled if no "UnitTest printer" exist. Useful to reproduce bug 1186598. | 71 // Disabled if no "UnitTest printer" exist. Useful to reproduce bug 1186598. |
| 72 TEST_F(EmfPrintingTest, Enumerate) { | 72 TEST_F(EmfPrintingTest, Enumerate) { |
| 73 if (IsTestCaseDisabled()) | 73 if (IsTestCaseDisabled()) |
| 74 return; | 74 return; |
| 75 | 75 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 context->PageDone(); | 119 context->PageDone(); |
| 120 context->DocumentDone(); | 120 context->DocumentDone(); |
| 121 } | 121 } |
| 122 | 122 |
| 123 // Disabled if no "UnitTest printer" exists. | 123 // Disabled if no "UnitTest printer" exists. |
| 124 TEST_F(EmfPrintingTest, PageBreak) { | 124 TEST_F(EmfPrintingTest, PageBreak) { |
| 125 base::win::ScopedHDC dc( | 125 base::win::ScopedHDC dc( |
| 126 CreateDC(L"WINSPOOL", L"UnitTest Printer", NULL, NULL)); | 126 CreateDC(L"WINSPOOL", L"UnitTest Printer", NULL, NULL)); |
| 127 if (!dc.Get()) | 127 if (!dc.Get()) |
| 128 return; | 128 return; |
| 129 printing::Emf emf; | 129 uint32 size; |
| 130 EXPECT_TRUE(emf.CreateDc(dc.Get(), NULL)); | 130 std::vector<BYTE> data; |
| 131 EXPECT_TRUE(emf.context() != NULL); | 131 { |
| 132 int pages = 3; | 132 printing::Emf emf; |
| 133 while (pages) { | 133 EXPECT_TRUE(emf.Init()); |
| 134 EXPECT_TRUE(emf.StartPage()); | 134 EXPECT_TRUE(emf.context() != NULL); |
| 135 ::Rectangle(emf.context(), 10, 10, 190, 190); | 135 int pages = 3; |
| 136 EXPECT_TRUE(emf.FinishPage()); | 136 while (pages) { |
| 137 --pages; | 137 EXPECT_TRUE(emf.StartPage()); |
| 138 ::Rectangle(emf.context(), 10, 10, 190, 190); |
| 139 EXPECT_TRUE(emf.FinishPage()); |
| 140 --pages; |
| 141 } |
| 142 EXPECT_TRUE(emf.Close()); |
| 143 size = emf.GetDataSize(); |
| 144 EXPECT_TRUE(emf.GetData(&data)); |
| 145 EXPECT_EQ(data.size(), size); |
| 138 } | 146 } |
| 139 EXPECT_TRUE(emf.Close()); | |
| 140 uint32 size = emf.GetDataSize(); | |
| 141 std::vector<BYTE> data; | |
| 142 EXPECT_TRUE(emf.GetData(&data)); | |
| 143 EXPECT_EQ(data.size(), size); | |
| 144 emf.CloseEmf(); | |
| 145 | 147 |
| 146 // Playback the data. | 148 // Playback the data. |
| 147 DOCINFO di = {0}; | 149 DOCINFO di = {0}; |
| 148 di.cbSize = sizeof(DOCINFO); | 150 di.cbSize = sizeof(DOCINFO); |
| 149 di.lpszDocName = L"Test Job"; | 151 di.lpszDocName = L"Test Job"; |
| 150 int job_id = ::StartDoc(dc.Get(), &di); | 152 int job_id = ::StartDoc(dc.Get(), &di); |
| 153 printing::Emf emf; |
| 151 EXPECT_TRUE(emf.Init(&data.front(), size)); | 154 EXPECT_TRUE(emf.Init(&data.front(), size)); |
| 152 EXPECT_TRUE(emf.SafePlayback(dc.Get())); | 155 EXPECT_TRUE(emf.SafePlayback(dc.Get())); |
| 153 ::EndDoc(dc.Get()); | 156 ::EndDoc(dc.Get()); |
| 154 // Since presumably the printer is not real, let us just delete the job from | 157 // Since presumably the printer is not real, let us just delete the job from |
| 155 // the queue. | 158 // the queue. |
| 156 HANDLE printer = NULL; | 159 HANDLE printer = NULL; |
| 157 if (::OpenPrinter(L"UnitTest Printer", &printer, NULL)) { | 160 if (::OpenPrinter(L"UnitTest Printer", &printer, NULL)) { |
| 158 ::SetJob(printer, job_id, 0, NULL, JOB_CONTROL_DELETE); | 161 ::SetJob(printer, job_id, 0, NULL, JOB_CONTROL_DELETE); |
| 159 ClosePrinter(printer); | 162 ClosePrinter(printer); |
| 160 } | 163 } |
| 161 } | 164 } |
| 162 | 165 |
| 163 TEST(EmfTest, FileBackedDC) { | |
| 164 // Simplest use case. | |
| 165 printing::Emf emf; | |
| 166 RECT rect = {100, 100, 200, 200}; | |
| 167 HDC hdc = CreateCompatibleDC(NULL); | |
| 168 EXPECT_TRUE(hdc != NULL); | |
| 169 ScopedTempDir scratch_metafile_dir; | |
| 170 ASSERT_TRUE(scratch_metafile_dir.CreateUniqueTempDir()); | |
| 171 FilePath metafile_path; | |
| 172 EXPECT_TRUE(file_util::CreateTemporaryFileInDir(scratch_metafile_dir.path(), | |
| 173 &metafile_path)); | |
| 174 EXPECT_TRUE(emf.CreateFileBackedDc(hdc, &rect, metafile_path)); | |
| 175 EXPECT_TRUE(emf.context() != NULL); | |
| 176 // In theory, you'd use the HDC with GDI functions here. | |
| 177 EXPECT_TRUE(emf.Close()); | |
| 178 | |
| 179 uint32 size = emf.GetDataSize(); | |
| 180 EXPECT_EQ(size, EMF_HEADER_SIZE); | |
| 181 std::vector<BYTE> data; | |
| 182 EXPECT_TRUE(emf.GetData(&data)); | |
| 183 EXPECT_EQ(data.size(), size); | |
| 184 emf.CloseEmf(); | |
| 185 int64 file_size = 0; | |
| 186 file_util::GetFileSize(metafile_path, &file_size); | |
| 187 EXPECT_EQ(size, file_size); | |
| 188 EXPECT_TRUE(DeleteDC(hdc)); | |
| 189 | |
| 190 // Playback the data. | |
| 191 hdc = CreateCompatibleDC(NULL); | |
| 192 EXPECT_TRUE(hdc); | |
| 193 EXPECT_TRUE(emf.CreateFromFile(metafile_path)); | |
| 194 RECT output_rect = {0, 0, 10, 10}; | |
| 195 EXPECT_TRUE(emf.Playback(hdc, &output_rect)); | |
| 196 EXPECT_TRUE(DeleteDC(hdc)); | |
| 197 emf.CloseEmf(); | |
| 198 } | |
| 199 | |
| 200 } // namespace printing | 166 } // namespace printing |
| OLD | NEW |