Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(721)

Side by Side Diff: content/common/render_font_warmup_win_unittest.cc

Issue 1327673002: Added GDI font emulation support for Flash. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@warmup_direct_write
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/public/common/render_font_warmup_win.h"
6
7 #include <vector>
8
9 #include "base/files/file_path.h"
10 #include "base/logging.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/win/windows_version.h"
13 #include "skia/ext/refptr.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "third_party/skia/include/core/SkString.h"
16 #include "third_party/skia/include/core/SkTypeface.h"
17 #include "third_party/skia/include/ports/SkFontMgr.h"
18
19 class TestSkTypeface : public SkTypeface {
20 public:
21 TestSkTypeface(const SkFontStyle& style,
22 const char* familyName,
23 SkFontTableTag tag,
24 const char* data,
25 size_t dataLength) :
palmer 2015/09/11 22:34:16 Is this what "git cl format" outputs?
26 SkTypeface(style, 0),
27 familyName_(familyName),
28 tag_(tag),
29 data_(data, data+dataLength) {}
30
31 protected:
32 SkScalerContext* onCreateScalerContext(const SkDescriptor*) const override {
33 ADD_FAILURE();
34 return NULL;
35 }
36 void onFilterRec(SkScalerContextRec*) const override {
37 ADD_FAILURE();
38 }
39 SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics(
40 PerGlyphInfo,
41 const uint32_t* glyphIDs,
42 uint32_t glyphIDsCount) const override {
43 ADD_FAILURE();
44 return NULL;
palmer 2015/09/11 22:34:16 nullptr again
45 }
46
47 SkStreamAsset* onOpenStream(int* ttcIndex) const override {
48 ADD_FAILURE();
49 return NULL;
50 }
51
52 SkFontData* onCreateFontData() const override {
53 ADD_FAILURE();
54 return NULL;
55 }
56
57 void onGetFontDescriptor(SkFontDescriptor*, bool* isLocal) const override {
58 ADD_FAILURE();
59 }
60
61 int onCharsToGlyphs(const void* chars, Encoding, uint16_t glyphs[],
62 int glyphCount) const override {
63 ADD_FAILURE();
64 return 0;
65 }
66
67 int onCountGlyphs() const override {
68 ADD_FAILURE();
69 return 0;
70 }
71
72 int onGetUPEM() const override {
73 ADD_FAILURE();
74 return 0;
75 }
76 bool onGetKerningPairAdjustments(const uint16_t glyphs[], int count,
77 int32_t adjustments[]) const override {
78 ADD_FAILURE();
79 return false;
80 }
81
82 /** Returns the family name of the typeface as known by its font manager.
83 * This name may or may not be produced by the family name iterator.
84 */
85 void onGetFamilyName(SkString* familyName) const override {
86 *familyName = familyName_;
87 }
88
89 /** Returns an iterator over the family names in the font. */
90 LocalizedStrings* onCreateFamilyNameIterator() const override {
91 ADD_FAILURE();
92 return NULL;
93 }
94
95 int onGetTableTags(SkFontTableTag tags[]) const override {
96 ADD_FAILURE();
97 return 0;
98 }
99
100 size_t onGetTableData(SkFontTableTag tag, size_t offset,
101 size_t length, void* data) const override {
102 size_t retsize = 0;
103 if (tag == tag_) {
104 retsize = length > data_.size() ? data_.size() : length;
105 if (data)
106 memcpy(data, &data_[0], retsize);
107 }
108 return retsize;
109 }
110
111 bool onComputeBounds(SkRect*) const override {
112 ADD_FAILURE();
113 return false;
114 }
115
116 private:
117 SkString familyName_;
118 SkFontTableTag tag_;
119 std::vector<char> data_;
120 };
121
122 const char* kTestFontFamily = "GDITest";
123 const wchar_t* kTestFontFamilyW = L"GDITest";
124 const SkFontTableTag kTestFontTableTag = 0x11223344;
125 const char* kTestFontData = "GDITestGDITest";
126 const wchar_t* kTestFontFamilyInvalid = L"InvalidFont";
127
128 static inline DWORD SwapEndian(DWORD dwTable) {
129 return ((dwTable & 0xFF) << 24) |
130 ((dwTable & 0xFF00) << 8) |
131 ((dwTable & 0xFF0000) >> 8) |
132 (dwTable >> 24);
133 }
134
135 class TestSkFontMgr : public SkFontMgr {
136 public:
137 TestSkFontMgr() {
138 content::SetPreSandboxWarmupFontMgr(this);
139 }
140
141 ~TestSkFontMgr() {
142 content::SetPreSandboxWarmupFontMgr(NULL);
143 }
144 protected:
145 // Implement the virtual methods
146 int onCountFamilies() const override {
147 return 1;
148 }
149
150 void onGetFamilyName(int index, SkString* familyName) const override {
151 if (index == 0)
152 *familyName = kTestFontFamily;
153 }
154
155 SkFontStyleSet* onCreateStyleSet(int index)const override {
156 ADD_FAILURE();
157 return NULL;
158 }
159
160 /** May return NULL if the name is not found. */
161 SkFontStyleSet* onMatchFamily(const char familyName[]) const override {
162 ADD_FAILURE();
163 return NULL;
164 }
165
166 SkTypeface* onMatchFamilyStyle(const char familyName[],
167 const SkFontStyle&) const override {
168 if (strcmp(familyName, kTestFontFamily) == 0) {
169 return createTypeface();
170 }
171 return NULL;
172 }
173
174 SkTypeface* onMatchFamilyStyleCharacter(const char familyName[],
175 const SkFontStyle&,
176 const char* bcp47[],
177 int bcp47Count,
178 SkUnichar character) const override {
179 ADD_FAILURE();
180 return NULL;
181 }
182
183 SkTypeface* onMatchFaceStyle(const SkTypeface*,
184 const SkFontStyle&) const override {
185 ADD_FAILURE();
186 return NULL;
187 }
188
189 SkTypeface* onCreateFromData(SkData*, int ttcIndex) const override {
190 ADD_FAILURE();
191 return NULL;
192 }
193
194 SkTypeface* onCreateFromStream(SkStreamAsset*, int ttcIndex) const override {
195 ADD_FAILURE();
196 return NULL;
197 }
198
199 SkTypeface* onCreateFromFontData(SkFontData*) const override {
200 ADD_FAILURE();
201 return NULL;
202 }
203
204 SkTypeface* onCreateFromFile(const char path[],
205 int ttcIndex) const override {
206 ADD_FAILURE();
207 return NULL;
208 }
209
210 SkTypeface* onLegacyCreateTypeface(const char familyName[],
211 unsigned styleBits) const override {
212 ADD_FAILURE();
213 return NULL;
214 }
215
216 private:
217 SkTypeface* createTypeface() const {
218 SkFontStyle style(400,
219 100,
220 SkFontStyle::kUpright_Slant);
221
222 return new TestSkTypeface(style,
223 kTestFontFamily,
224 SwapEndian(kTestFontTableTag),
225 kTestFontData,
226 strlen(kTestFontData));
227 }
228 };
229
230 static void InitLogFont(LOGFONTW* logfont, const wchar_t* fontname) {
231 memcpy(logfont->lfFaceName, fontname,
232 (wcslen(fontname)+1)*sizeof(wchar_t));
233 }
234
235 static content::GdiFontPatchData* SetupTest() {
236 HMODULE module_handle;
237 if (GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
238 reinterpret_cast<LPCWSTR>(SetupTest),
239 &module_handle)) {
240 WCHAR module_path[MAX_PATH];
241
242 if (GetModuleFileNameW(module_handle, module_path, MAX_PATH) > 0) {
243 base::FilePath path(module_path);
244 return content::PatchGdiFontEnumeration(path);
245 }
246 }
247 return NULL;
248 }
249
250 static int CALLBACK EnumFontCallbackTest(
251 const LOGFONT *lpelfe,
252 const TEXTMETRIC *lpntme,
253 DWORD FontType,
254 LPARAM lParam
255 )
256 {
257 const NEWTEXTMETRICEX* m = reinterpret_cast<const NEWTEXTMETRICEX*>(lpntme);
258
259 return !(FontType & TRUETYPE_FONTTYPE) &&
260 !(m->ntmTm.ntmFlags & NTM_PS_OPENTYPE);
261 }
262
263 TEST(GDIFontEmulationTest, CreateDeleteDCSuccess) {
264 if (base::win::GetVersion() < base::win::VERSION_WIN8)
265 return;
266 TestSkFontMgr fontmgr;
267 scoped_ptr<content::GdiFontPatchData> patch_data(SetupTest());
268 EXPECT_FALSE(!patch_data);
269
270 HDC hdc = CreateCompatibleDC(0);
271 EXPECT_TRUE(hdc != NULL);
272 EXPECT_TRUE(DeleteDC(hdc));
273 }
274
275 TEST(GDIFontEmulationTest, CreateUniqueDCSuccess) {
276 if (base::win::GetVersion() < base::win::VERSION_WIN8)
277 return;
278 TestSkFontMgr fontmgr;
279 scoped_ptr<content::GdiFontPatchData> patch_data(SetupTest());
280 EXPECT_FALSE(!patch_data);
281
282 HDC hdc1 = CreateCompatibleDC(0);
283 EXPECT_TRUE(hdc1 != NULL);
284 HDC hdc2 = CreateCompatibleDC(0);
285 EXPECT_TRUE(hdc2 != NULL);
286 EXPECT_NE(hdc1, hdc2);
287 EXPECT_TRUE(DeleteDC(hdc2));
288 EXPECT_TRUE(DeleteDC(hdc1));
289 }
290
291 TEST(GDIFontEmulationTest, CreateFontSuccess) {
292 if (base::win::GetVersion() < base::win::VERSION_WIN8)
293 return;
294 TestSkFontMgr fontmgr;
295 scoped_ptr<content::GdiFontPatchData> patch_data(SetupTest());
296 EXPECT_FALSE(!patch_data);
297 LOGFONTW logfont = {0};
298 InitLogFont(&logfont, kTestFontFamilyW);
299 HFONT font = CreateFontIndirectW(&logfont);
300 EXPECT_TRUE(font != NULL);
301 EXPECT_TRUE(DeleteObject(font));
302 }
303
304 TEST(GDIFontEmulationTest, CreateFontFailure) {
305 if (base::win::GetVersion() < base::win::VERSION_WIN8)
306 return;
307 TestSkFontMgr fontmgr;
308 scoped_ptr<content::GdiFontPatchData> patch_data(SetupTest());
309 EXPECT_FALSE(!patch_data);
310 LOGFONTW logfont = {0};
311 InitLogFont(&logfont, kTestFontFamilyInvalid);
312 HFONT font = CreateFontIndirectW(&logfont);
313 EXPECT_TRUE(font == NULL);
314 }
315
316 TEST(GDIFontEmulationTest, EnumFontFamilySuccess) {
317 if (base::win::GetVersion() < base::win::VERSION_WIN8)
318 return;
319 TestSkFontMgr fontmgr;
320 scoped_ptr<content::GdiFontPatchData> patch_data(SetupTest());
321 EXPECT_FALSE(!patch_data);
322 HDC hdc = CreateCompatibleDC(0);
323 EXPECT_TRUE(hdc != NULL);
324 LOGFONTW logfont = {0};
325 InitLogFont(&logfont, kTestFontFamilyW);
326 int res = EnumFontFamiliesExW(hdc, &logfont, EnumFontCallbackTest, NULL, 0);
327 EXPECT_FALSE(res);
328 EXPECT_TRUE(DeleteDC(hdc));
329 }
330
331 TEST(GDIFontEmulationTest, EnumFontFamilyFailure) {
332 if (base::win::GetVersion() < base::win::VERSION_WIN8)
333 return;
334 TestSkFontMgr fontmgr;
335 scoped_ptr<content::GdiFontPatchData> patch_data(SetupTest());
336 EXPECT_FALSE(!patch_data);
337 HDC hdc = CreateCompatibleDC(0);
338 EXPECT_TRUE(hdc != NULL);
339 LOGFONTW logfont = {0};
340 InitLogFont(&logfont, kTestFontFamilyInvalid);
341 int res = EnumFontFamiliesExW(hdc, &logfont, EnumFontCallbackTest, NULL, 0);
342 EXPECT_TRUE(res);
343 EXPECT_TRUE(DeleteDC(hdc));
344 }
345
346 TEST(GDIFontEmulationTest, DeleteDCFailure) {
347 if (base::win::GetVersion() < base::win::VERSION_WIN8)
348 return;
349 TestSkFontMgr fontmgr;
350 scoped_ptr<content::GdiFontPatchData> patch_data(SetupTest());
351 EXPECT_FALSE(!patch_data);
352 HDC hdc = reinterpret_cast<HDC>(0x11223344);
353 EXPECT_FALSE(DeleteDC(hdc));
354 }
355
356 TEST(GDIFontEmulationTest, DeleteObjectFailure) {
357 if (base::win::GetVersion() < base::win::VERSION_WIN8)
358 return;
359 TestSkFontMgr fontmgr;
360 scoped_ptr<content::GdiFontPatchData> patch_data(SetupTest());
361 EXPECT_FALSE(!patch_data);
362 HFONT font = reinterpret_cast<HFONT>(0x11223344);
363 EXPECT_FALSE(DeleteObject(font));
364 }
365
366 TEST(GDIFontEmulationTest, GetFontDataSizeSuccess) {
367 if (base::win::GetVersion() < base::win::VERSION_WIN8)
368 return;
369 TestSkFontMgr fontmgr;
370 scoped_ptr<content::GdiFontPatchData> patch_data(SetupTest());
371 EXPECT_FALSE(!patch_data);
372 HDC hdc = CreateCompatibleDC(0);
373 EXPECT_TRUE(hdc != NULL);
374 LOGFONTW logfont = {0};
375 InitLogFont(&logfont, kTestFontFamilyW);
376 HFONT font = CreateFontIndirectW(&logfont);
377 EXPECT_TRUE(font != NULL);
378 EXPECT_TRUE(SelectObject(hdc, font) == NULL);
379 DWORD size = GetFontData(hdc, kTestFontTableTag, 0, NULL, 0);
380 DWORD data_size = static_cast<DWORD>(strlen(kTestFontData));
381 EXPECT_EQ(size, data_size);
382 EXPECT_TRUE(DeleteObject(font));
383 EXPECT_TRUE(DeleteDC(hdc));
384 }
385
386 TEST(GDIFontEmulationTest, GetFontDataInvalidTagSuccess) {
387 if (base::win::GetVersion() < base::win::VERSION_WIN8)
388 return;
389 TestSkFontMgr fontmgr;
390 scoped_ptr<content::GdiFontPatchData> patch_data(SetupTest());
391 EXPECT_FALSE(!patch_data);
392 HDC hdc = CreateCompatibleDC(0);
393 EXPECT_TRUE(hdc != NULL);
394 LOGFONTW logfont = {0};
395 InitLogFont(&logfont, kTestFontFamilyW);
396 HFONT font = CreateFontIndirectW(&logfont);
397 EXPECT_TRUE(font != NULL);
398 EXPECT_TRUE(SelectObject(hdc, font) == NULL);
399 DWORD size = GetFontData(hdc, kTestFontTableTag + 1, 0, NULL, 0);
400 EXPECT_EQ(size, GDI_ERROR);
401 EXPECT_TRUE(DeleteObject(font));
402 EXPECT_TRUE(DeleteDC(hdc));
403 }
404
405 TEST(GDIFontEmulationTest, GetFontDataInvalidFontSuccess) {
406 if (base::win::GetVersion() < base::win::VERSION_WIN8)
407 return;
408 TestSkFontMgr fontmgr;
409 scoped_ptr<content::GdiFontPatchData> patch_data(SetupTest());
410 EXPECT_FALSE(!patch_data);
411 HDC hdc = CreateCompatibleDC(0);
412 EXPECT_TRUE(hdc != NULL);
413 DWORD size = GetFontData(hdc, kTestFontTableTag, 0, NULL, 0);
414 EXPECT_EQ(size, GDI_ERROR);
415 EXPECT_TRUE(DeleteDC(hdc));
416 }
417
418 TEST(GDIFontEmulationTest, GetFontDataDataSuccess) {
419 if (base::win::GetVersion() < base::win::VERSION_WIN8)
420 return;
421 TestSkFontMgr fontmgr;
422 scoped_ptr<content::GdiFontPatchData> patch_data(SetupTest());
423 EXPECT_FALSE(!patch_data);
424 HDC hdc = CreateCompatibleDC(0);
425 EXPECT_TRUE(hdc != NULL);
426 LOGFONTW logfont = {0};
427 InitLogFont(&logfont, kTestFontFamilyW);
428 HFONT font = CreateFontIndirectW(&logfont);
429 EXPECT_TRUE(font != NULL);
430 EXPECT_TRUE(SelectObject(hdc, font) == NULL);
431 DWORD data_size = static_cast<DWORD>(strlen(kTestFontData));
432 std::vector<char> data(data_size);
433 DWORD size = GetFontData(hdc, kTestFontTableTag, 0, &data[0], data.size());
434 EXPECT_EQ(size, data_size);
435 EXPECT_EQ(memcmp(&data[0], kTestFontData, data.size()), 0);
436 EXPECT_TRUE(DeleteObject(font));
437 EXPECT_TRUE(DeleteDC(hdc));
438 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698