|
1 // Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
2 // All rights reserved. |
|
3 // This component and the accompanying materials are made available |
|
4 // under the terms of "Eclipse Public License v1.0" |
|
5 // which accompanies this distribution, and is available |
|
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
7 // |
|
8 // Initial Contributors: |
|
9 // Nokia Corporation - initial contribution. |
|
10 // |
|
11 // Contributors: |
|
12 // |
|
13 // Description: |
|
14 // |
|
15 |
|
16 /** |
|
17 @file |
|
18 @internalComponent - Internal Symbian test code |
|
19 */ |
|
20 |
|
21 #include "TFBS.H" |
|
22 #include "../sfbs/UTILS.H" |
|
23 #include "../sfbs/fbshelper.h" |
|
24 #include <shapeinfo.h> |
|
25 #include <graphics/openfontrasterizer.h> |
|
26 #include <graphics/openfontconstants.h> |
|
27 #include "fbsdefs.h" |
|
28 #include "fbsmessage.h" |
|
29 |
|
30 TInt buffer[2]; |
|
31 |
|
32 _LIT(KFBSERVFontFileDir, "\\resource\\fonts\\"); |
|
33 _LIT(KTypefaceName, "DejaVu Sans Condensed"); |
|
34 |
|
35 // TLS Handle for TestFlushCallback test, from tfbsserver.mmp |
|
36 const TInt KTlsHandle = 0x10273364; |
|
37 |
|
38 |
|
39 #ifdef __WINS__ |
|
40 template<class C> XTCallCounter<C>::XTCallCounter(CTGraphicsBase& aTestBase) |
|
41 : iTestBase(aTestBase), iVFCallsOutsideFBServ(0) |
|
42 {} |
|
43 |
|
44 template<class C> void XTCallCounter<C>::ExecuteShellcode(TInt aFromFunction) |
|
45 { |
|
46 const TUint32 KFBServId = 0x10003A16; |
|
47 const TUint32 KTFbsServerId = 0x10273364; |
|
48 TSecureId id = RProcess().SecureId(); |
|
49 if (id != KFBServId) |
|
50 { |
|
51 User::LockedInc(iVFCallsOutsideFBServ); |
|
52 if (id == KTFbsServerId) |
|
53 { |
|
54 TBuf<128> name; |
|
55 XVtableInjector<C>::GetVirtualFunctionName(aFromFunction, name); |
|
56 iTestBase.INFO_PRINTF2(_L("Virtual function call to %S from outside FBServ"), &name); |
|
57 } |
|
58 } |
|
59 } |
|
60 #endif |
|
61 |
|
62 |
|
63 void CTFbs::DeleteScanLineBuffer() |
|
64 { |
|
65 delete iFbs->iScanLineBuffer; |
|
66 iFbs->iScanLineBuffer = 0; |
|
67 }; |
|
68 |
|
69 CTFbs::CTFbs(CTestStep* aStep): |
|
70 CTGraphicsBase(aStep), |
|
71 iHandle(0), |
|
72 iFbs(NULL), |
|
73 iTs(NULL), |
|
74 iHeap(NULL), |
|
75 iFs(NULL), |
|
76 iResourceCount(0), |
|
77 iAllocs(0) |
|
78 #ifdef __WINS__ |
|
79 , iFontCallCounter(*this), iOpenFontCallCounter(*this) |
|
80 #endif |
|
81 { |
|
82 } |
|
83 |
|
84 void CTFbs::ConstructL() |
|
85 { |
|
86 ExpandCleanupStackL(); |
|
87 |
|
88 TestConstruction(); |
|
89 AllocScanLineBuf(); |
|
90 |
|
91 INFO_PRINTF1(_L("FBSERV testing")); |
|
92 } |
|
93 |
|
94 CTFbs::~CTFbs() |
|
95 { |
|
96 delete iTs; |
|
97 } |
|
98 |
|
99 void CTFbs::RunTestCaseL(TInt aCurTestCase) |
|
100 { |
|
101 ((CTFbsStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName); |
|
102 switch(aCurTestCase) |
|
103 { |
|
104 case 1: |
|
105 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0555")); |
|
106 TestConnection(); |
|
107 break; |
|
108 case 2: |
|
109 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0558")); |
|
110 TestInvalidFiles(); |
|
111 break; |
|
112 case 3: |
|
113 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0556")); |
|
114 TestFlushCallBack(); |
|
115 break; |
|
116 case 4: |
|
117 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0568")); |
|
118 TestMultiThread(); |
|
119 break; |
|
120 case 5: |
|
121 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0559")); |
|
122 TestGetFont(); |
|
123 break; |
|
124 case 6: |
|
125 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0560")); |
|
126 TestFontStore(); |
|
127 break; |
|
128 case 7: |
|
129 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-PREQ807_1_Load_all_fonts-0001")); |
|
130 TestAllFontsLoaded(); |
|
131 break; |
|
132 case 8: |
|
133 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0561")); |
|
134 TestFontNameAlias(); |
|
135 break; |
|
136 case 9: |
|
137 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0557")); |
|
138 TestAddFontFile(); |
|
139 break; |
|
140 case 10: |
|
141 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0562")); |
|
142 TestBufferedFont(); |
|
143 break; |
|
144 case 11: |
|
145 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0563")); |
|
146 TestMultipleFont(); |
|
147 break; |
|
148 case 12: |
|
149 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0564")); |
|
150 TestCreateBitmap(); |
|
151 break; |
|
152 case 13: |
|
153 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0565")); |
|
154 TestLoadBitmap(); |
|
155 break; |
|
156 case 14: |
|
157 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0566")); |
|
158 TestQueryBitmap(); |
|
159 TRAPD(errCode, TestRomBitmapL()); |
|
160 if(errCode==KErrNone) |
|
161 { |
|
162 TestHeapCompression(); |
|
163 } |
|
164 break; |
|
165 case 15: |
|
166 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0570")); |
|
167 TestDefaultLanguageForMetrics(); |
|
168 break; |
|
169 case 16: |
|
170 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-CTFbs-TestDuplicateFontFileEntries-0001")); |
|
171 TestDuplicateFontFileEntries(); |
|
172 break; |
|
173 //COMMENTED OUT FOR NOW BECAUSE DEF084095 FIX MAKES THIS TEST REDUNDANT |
|
174 /*case 17: |
|
175 TestShapeHeaderMemoryLeakAtClientDeath(); |
|
176 break;*/ |
|
177 case 17: |
|
178 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0506")); |
|
179 TestBitmapHandleImmutable(); |
|
180 break; |
|
181 case 18: |
|
182 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0507")); |
|
183 TestBitmapBeginEnd(); |
|
184 break; |
|
185 case 19: |
|
186 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0508")); |
|
187 TestSingletonServer(); |
|
188 break; |
|
189 case 21: |
|
190 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0620")); |
|
191 TestFontSessionCacheLookupL(); |
|
192 break; |
|
193 case 22: |
|
194 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0650")); |
|
195 TestInvalidHandlesInIpcCallsL(); |
|
196 break; |
|
197 case 23: |
|
198 // this one should always be the last test, since it checks the final virtual function call count |
|
199 ((CTFbsStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0619")); |
|
200 TestNoVFCallsToGlobalObjects(); |
|
201 break; |
|
202 case 24: |
|
203 ((CTFbsStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName); |
|
204 ((CTFbsStep*)iStep)->CloseTMSGraphicsStep(); |
|
205 TestComplete(); |
|
206 break; |
|
207 } |
|
208 ((CTFbsStep*)iStep)->RecordTestResultL(); |
|
209 } |
|
210 |
|
211 CFbsFontEx* CTFbs::SelectFont() |
|
212 { |
|
213 CFbsFontEx* font=NULL; |
|
214 TInt ret=iTs->GetNearestFontToDesignHeightInPixels((CFont*&)font, TFontSpec(KTypefaceName, 15)); |
|
215 TEST(ret==KErrNone); |
|
216 #ifdef __WINS__ |
|
217 CBitmapFont* bitmapFont = font->Address(); |
|
218 iFontCallCounter.iInjector.InjectShellcode(bitmapFont, &iFontCallCounter); |
|
219 if (bitmapFont->IsOpenFont()) |
|
220 { |
|
221 iOpenFontCallCounter.iInjector.InjectShellcode(bitmapFont->OpenFont(), &iOpenFontCallCounter); |
|
222 } |
|
223 #endif |
|
224 TEST(font->MaxCharWidthInPixels()>0); |
|
225 TEST(font->MaxNormalCharWidthInPixels()>0); |
|
226 return(font); |
|
227 } |
|
228 |
|
229 CFbsFontEx* CTFbs::SelectOpenTypeFont() |
|
230 { |
|
231 CFbsFontEx* font=NULL; |
|
232 TFontSpec fsp; |
|
233 fsp.iTypeface.iName=_L("Series 60 Sans"); |
|
234 fsp.iHeight=15; |
|
235 TInt ret=iTs->GetNearestFontToDesignHeightInPixels((CFont*&)font,fsp); |
|
236 TEST(ret==KErrNone); |
|
237 #ifdef __WINS__ |
|
238 CBitmapFont* bitmapFont = font->Address(); |
|
239 iFontCallCounter.iInjector.InjectShellcode(bitmapFont, &iFontCallCounter); |
|
240 if (bitmapFont->IsOpenFont()) |
|
241 { |
|
242 iOpenFontCallCounter.iInjector.InjectShellcode(bitmapFont->OpenFont(), &iOpenFontCallCounter); |
|
243 } |
|
244 #endif |
|
245 TEST(font->MaxCharWidthInPixels()>0); |
|
246 TEST(font->MaxNormalCharWidthInPixels()>0); |
|
247 return(font); |
|
248 } |
|
249 |
|
250 void CTFbs::TestConstruction() |
|
251 { |
|
252 CFbsBitmap bmp; |
|
253 iTestBitmapName = KTestBitmapOnZ; |
|
254 TInt ret=bmp.Load(iTestBitmapName,ETfbs,NULL); |
|
255 if (ret != KErrNone) |
|
256 User::Panic(_L("Could not load bitmap"),ret); |
|
257 bmp.Reset(); |
|
258 |
|
259 iFbs = RFbsSession::GetSession(); |
|
260 TRAP(ret,iTs = (CFbsTypefaceStore*)CFbsTypefaceStore::NewL(NULL)); |
|
261 TEST(iTs != NULL); |
|
262 CFbsFontEx* font = SelectFont(); |
|
263 iTs->ReleaseFont(font); |
|
264 } |
|
265 |
|
266 /** |
|
267 @SYMTestCaseID |
|
268 GRAPHICS-FBSERV-0555 |
|
269 |
|
270 @SYMTestCaseDesc |
|
271 Tests the connections to the FbsSession |
|
272 |
|
273 @SYMTestActions |
|
274 Allocates a 100 RFbsSession objects and |
|
275 connects to the server and checks if |
|
276 all connections succeeded. Frees the memory |
|
277 and checks the heap memory. |
|
278 |
|
279 @SYMTestExpectedResults |
|
280 Test should pass |
|
281 */ |
|
282 void CTFbs::TestConnection() |
|
283 { |
|
284 INFO_PRINTF1(_L("class RFbsSession")); |
|
285 __UHEAP_MARK; |
|
286 const TInt numconnects=100; |
|
287 RFbsSession* connections=(RFbsSession*)User::Alloc(sizeof(RFbsSession)*numconnects); |
|
288 TEST(connections!=NULL); |
|
289 TInt count=0; |
|
290 for(;count<numconnects;count++) |
|
291 new(&connections[count]) RFbsSession; |
|
292 TEST(iFbs->ResourceCount()==0); |
|
293 for(count=0;count<numconnects;count++) |
|
294 { |
|
295 TInt ret=connections[count].Connect(); |
|
296 if(ret!=KErrNone) |
|
297 break; |
|
298 } |
|
299 INFO_PRINTF2(_L(" %d connections created.\n"),count); |
|
300 TEST(iFbs->ResourceCount()==0); |
|
301 for(TInt count2=0;count2<count;count2++) |
|
302 connections[count2].Disconnect(); |
|
303 TEST(iFbs->ResourceCount()==0); |
|
304 User::Free(connections); |
|
305 User::Heap().Check(); |
|
306 __UHEAP_MARKEND; |
|
307 } |
|
308 |
|
309 /** |
|
310 @SYMTestCaseID |
|
311 GRAPHICS-FBSERV-0556 |
|
312 |
|
313 @SYMTestCaseDesc |
|
314 Tests if the flush callback function |
|
315 is called properly. |
|
316 |
|
317 @SYMTestActions |
|
318 Sets the flush callback, fills the cache with different |
|
319 fonts until the cache is full. |
|
320 Create one more font which forces an eviction of a font |
|
321 in the cache. |
|
322 Check call back is called. |
|
323 Reset the flush callback, create another new font, |
|
324 check that the callback was not called. |
|
325 Check for memory and resource leaks. |
|
326 |
|
327 @SYMTestExpectedResults |
|
328 Callback function should be called once at end of loop. |
|
329 */ |
|
330 void CTFbs::TestFlushCallBack() |
|
331 { |
|
332 INFO_PRINTF1(_L("Test Flush CallBack")); |
|
333 |
|
334 __UHEAP_MARK; |
|
335 CFbsTypefaceStore* tfs=NULL; |
|
336 TRAPD(ret,tfs=CFbsTypefaceStore::NewL(NULL)); |
|
337 TEST(ret==KErrNone); |
|
338 TEST(tfs!=NULL); |
|
339 |
|
340 UserSvr::DllSetTls(KTlsHandle, this); |
|
341 INFO_PRINTF1(_L("Testing Flush CallBack mechanism...")); |
|
342 iFbs->SetCallBack(TCallBack(FlushCallBack, NULL)); |
|
343 CFbsFontEx* font=NULL; |
|
344 |
|
345 // Fill up the fontcache so that on the final iteration, the first |
|
346 // font is evicted, thereby destroying it server-side and executing the |
|
347 // callback. |
|
348 iFlushCallbackReceived = EFalse; |
|
349 TInt fontSize = 10; |
|
350 for (TInt fontEntries = 0; fontEntries < KMaxFontCacheEntries+1; fontEntries++) |
|
351 { |
|
352 ret=tfs->GetNearestFontToDesignHeightInTwips((CFont*&)font, TFontSpec(KTypefaceName, fontSize)); |
|
353 TEST(ret==KErrNone); |
|
354 iResourceCount++; |
|
355 CheckResourceCount(); |
|
356 tfs->ReleaseFont(font); |
|
357 fontSize += 15; |
|
358 } |
|
359 TEST(iFlushCallbackReceived); |
|
360 |
|
361 // Now check callback is correctly reset and callback function is not executed |
|
362 // when another font is evicted from the cache. |
|
363 // Resource count wont increase as although a new font is being created, another |
|
364 // will be evicted from the cache. |
|
365 iFlushCallbackReceived = EFalse; |
|
366 iFbs->ResetCallBack(); |
|
367 ret=tfs->GetNearestFontToDesignHeightInTwips((CFont*&)font, TFontSpec(KTypefaceName, fontSize)); |
|
368 TEST(ret==KErrNone); |
|
369 tfs->ReleaseFont(font); |
|
370 TEST(!iFlushCallbackReceived); |
|
371 CheckResourceCount(); |
|
372 |
|
373 UserSvr::DllFreeTls(KTlsHandle); |
|
374 delete tfs; |
|
375 iResourceCount = 0; |
|
376 CheckResourceCount(); |
|
377 __UHEAP_MARKEND; |
|
378 } |
|
379 |
|
380 TInt CTFbs::FlushCallBack(TAny* /*aPtr*/) |
|
381 { |
|
382 CTFbs* tfbs = static_cast<CTFbs*>(UserSvr::DllTls(KTlsHandle)); |
|
383 tfbs->INFO_PRINTF1(_L(" ...Flush CallBack called successfully")); |
|
384 tfbs->iFlushCallbackReceived = ETrue; |
|
385 --tfbs->iResourceCount; |
|
386 return(0); |
|
387 } |
|
388 |
|
389 |
|
390 #ifdef __WINS__ |
|
391 _LIT(KCTFbsTestFont,"z:\\resource\\fonts\\eon14.gdr"); |
|
392 #else |
|
393 _LIT(KCTFbsTestFont,"z:\\resource\\fonts\\eon.gdr"); |
|
394 #endif |
|
395 |
|
396 /** |
|
397 @SYMTestCaseID |
|
398 GRAPHICS-FBSERV-0557 |
|
399 |
|
400 @SYMTestCaseDesc |
|
401 Tests adding of a font file |
|
402 to the font store |
|
403 |
|
404 @SYMTestActions |
|
405 Creates a type face store and adds |
|
406 font files to it. Checks if adding |
|
407 the files succeeded. Removes the files |
|
408 from the store. Checks if succeeded. |
|
409 |
|
410 @SYMTestExpectedResults |
|
411 Test should pass |
|
412 */ |
|
413 void CTFbs::TestAddFontFile() |
|
414 { |
|
415 INFO_PRINTF1(_L("Test Add File")); |
|
416 __UHEAP_MARK; |
|
417 CFbsTypefaceStore* tfs=NULL; |
|
418 TRAPD(ret,tfs=CFbsTypefaceStore::NewL(NULL)); |
|
419 TEST(ret==KErrNone); |
|
420 TEST(tfs!=NULL); |
|
421 TInt id1=0; |
|
422 TInt id2=0; |
|
423 TInt id3=0; |
|
424 TInt id4=0; |
|
425 ret=tfs->AddFile(KCTFbsTestFont,id1); |
|
426 TEST(ret==KErrNone); |
|
427 TEST(id1!=0); |
|
428 ret=tfs->AddFile(KCTFbsTestFont,id2); |
|
429 TEST(ret==KErrNone); |
|
430 TEST(id2==id1); |
|
431 ret=tfs->AddFile(KCTFbsTestFont,id3); |
|
432 TEST(ret==KErrNone); |
|
433 TEST(id3==id2); |
|
434 tfs->RemoveFile(id1); |
|
435 tfs->RemoveFile(id2); |
|
436 tfs->RemoveFile(id3); |
|
437 ret=tfs->AddFile(KCTFbsTestFont,id4); |
|
438 TEST(ret==KErrNone); |
|
439 TEST(id4==id1); |
|
440 tfs->RemoveFile(id4); |
|
441 delete tfs; |
|
442 __UHEAP_MARKEND; |
|
443 |
|
444 //test the sequence AddFile, GetNearestFont, ReleaseFont, RemoveFile |
|
445 CFbsTypefaceStore* tfs1=NULL; |
|
446 TRAPD(ret1,tfs1=CFbsTypefaceStore::NewL(NULL)); |
|
447 TEST(ret1==KErrNone); |
|
448 TEST(tfs1!=NULL); |
|
449 TInt id5=0; |
|
450 ret1=tfs1->AddFile(_L("z:\\resource\\fonts\\DejaVuSerifCondensed.ttf"),id5); |
|
451 TEST(ret1==KErrNone); |
|
452 TEST(id5!=0); |
|
453 |
|
454 TInt id6=0; |
|
455 ret1=tfs1->AddFile(_L("z:\\resource\\fonts\\DejaVuSansCondensed.ttf"), id6); |
|
456 TEST(ret1==KErrNone); |
|
457 TEST(id6!=0); |
|
458 |
|
459 TFontSpec fsp1; |
|
460 fsp1.iTypeface.iName=_L("DejaVu Serif Condensed"); |
|
461 fsp1.iHeight=15; |
|
462 CFont* font1; |
|
463 ret1=tfs1->GetNearestFontToDesignHeightInTwips((CFont*&)font1,fsp1); |
|
464 TEST(ret1==KErrNone); |
|
465 |
|
466 TFontSpec fsp2; |
|
467 fsp2.iTypeface.iName=_L("DejaVu Serif Condensed"); |
|
468 fsp2.iHeight=30; |
|
469 CFont *font2; |
|
470 ret1=tfs1->GetNearestFontToDesignHeightInTwips((CFont*&)font2,fsp2); |
|
471 TEST(ret1==KErrNone); |
|
472 |
|
473 TFontSpec fsp3; |
|
474 fsp3.iTypeface.iName=_L("DejaVu Sans Condensed"); |
|
475 fsp3.iHeight=20; |
|
476 CFont *font3; |
|
477 ret1=tfs1->GetNearestFontToDesignHeightInTwips((CFont*&)font3,fsp3); |
|
478 TEST(ret1==KErrNone); |
|
479 |
|
480 TFontSpec fsp4; |
|
481 fsp4.iTypeface.iName=_L("DejaVu Serif Condensed"); |
|
482 fsp4.iHeight=35; |
|
483 CFont *font4; |
|
484 ret1=tfs1->GetNearestFontToDesignHeightInTwips((CFont*&)font4,fsp4); |
|
485 TEST(ret1==KErrNone); |
|
486 |
|
487 if (font1) |
|
488 tfs1->ReleaseFont(font1); |
|
489 if (font2) |
|
490 tfs1->ReleaseFont(font2); |
|
491 if (font4) |
|
492 tfs1->ReleaseFont(font4); |
|
493 |
|
494 if (id6) |
|
495 tfs1->RemoveFile(id6); |
|
496 if (id5) |
|
497 tfs1->RemoveFile(id5); |
|
498 delete tfs1; |
|
499 } |
|
500 |
|
501 /** |
|
502 @SYMTestCaseID |
|
503 GRAPHICS-FBSERV-0558 |
|
504 |
|
505 @SYMTestCaseDesc |
|
506 Tries to add and load a nonexisting |
|
507 file to the FbsTypeFaceStore and checks |
|
508 if it fails. |
|
509 |
|
510 @SYMTestActions |
|
511 |
|
512 @SYMTestExpectedResults |
|
513 Test should pass |
|
514 */ |
|
515 void CTFbs::TestInvalidFiles() |
|
516 { |
|
517 INFO_PRINTF1(_L("Test Invalid Files")); |
|
518 __UHEAP_MARK; |
|
519 CFbsTypefaceStore* tfs=NULL; |
|
520 TRAPD(ret,tfs=CFbsTypefaceStore::NewL(NULL)); |
|
521 TEST(ret==KErrNone); |
|
522 TEST(tfs!=NULL); |
|
523 TInt id=0; |
|
524 ret=tfs->AddFile(_L("\\nonexist.gdr"),id); |
|
525 TEST(ret!=KErrNone); |
|
526 delete tfs; |
|
527 CFbsBitmapEx bmp; |
|
528 ret=bmp.Load(_L("\\nonexist.mbm"),0); |
|
529 TEST(ret!=KErrNone); |
|
530 User::Heap().Check(); |
|
531 __UHEAP_MARKEND; |
|
532 } |
|
533 |
|
534 /** |
|
535 @SYMTestCaseID |
|
536 GRAPHICS-FBSERV-0559 |
|
537 |
|
538 @SYMTestCaseDesc |
|
539 Gets a font and tests all its properties. |
|
540 |
|
541 @SYMTestActions |
|
542 Tests the char width, text width, handles, verifies |
|
543 the resource count and the heap for memory leaks |
|
544 CharWidthInPixels() and TextWidthInPixels() may return |
|
545 different values depending on the hardware used. |
|
546 Therefore, when comparing these values for the same character, |
|
547 allow a margin of 1 pixel difference. |
|
548 |
|
549 @SYMTestExpectedResults |
|
550 Test should pass |
|
551 */ |
|
552 void CTFbs::TestGetFont() |
|
553 { |
|
554 INFO_PRINTF1(_L("Test Get Font")); |
|
555 CFbsFontEx* font=SelectFont(); |
|
556 iResourceCount++; |
|
557 TEST(font->Handle()!=0); |
|
558 CheckResourceCount(); |
|
559 TUid uid; |
|
560 uid=KCFbsFontUid; |
|
561 TEST(font->TypeUid()==uid); |
|
562 TInt w=font->TextWidthInPixels(_L(" ")); |
|
563 TEST(w>0); |
|
564 // Now test the same use case with context |
|
565 CFont::TMeasureTextInput param; |
|
566 param.iStartInputChar = 34; |
|
567 TInt wContext=font->TextWidthInPixels(_L("->This text will not be measured<- "),¶m); |
|
568 TEST(wContext==w); |
|
569 // End of first use case with context |
|
570 |
|
571 TInt x=font->TextCount(_L(" "),10); |
|
572 TEST(10/w==x); |
|
573 TInt y,z; |
|
574 y=font->TextCount(_L(" "),10,z); |
|
575 TEST(y==x); |
|
576 TInt cwidth=font->CharWidthInPixels('i'); |
|
577 TInt twidth=font->TextWidthInPixels(_L("i")); |
|
578 TInt charTextdiff = cwidth - twidth; |
|
579 TEST(1>=charTextdiff && -1<=charTextdiff); |
|
580 TInt twidthContext=font->TextWidthInPixels(_L("->This text will not be measured<-i"),¶m); |
|
581 TEST(twidth==twidthContext); |
|
582 cwidth=font->CharWidthInPixels('p'); |
|
583 twidth=font->TextWidthInPixels(_L("p")); |
|
584 charTextdiff = cwidth - twidth; |
|
585 TEST(1>=charTextdiff && -1<=charTextdiff); |
|
586 twidthContext=font->TextWidthInPixels(_L("->This text will not be measured<-p"),¶m); |
|
587 TEST(twidth==twidthContext); |
|
588 cwidth=font->CharWidthInPixels('W'); |
|
589 twidth=font->TextWidthInPixels(_L("W")); |
|
590 charTextdiff = cwidth - twidth; |
|
591 TEST(1>=charTextdiff && -1<=charTextdiff); |
|
592 twidthContext=font->TextWidthInPixels(_L("->This text will not be measured<-W"),¶m); |
|
593 TEST(twidth==twidthContext); |
|
594 cwidth=font->CharWidthInPixels(' '); |
|
595 twidth=font->TextWidthInPixels(_L(" ")); |
|
596 charTextdiff = cwidth - twidth; |
|
597 TEST(1>=charTextdiff && -1<=charTextdiff); |
|
598 SCharWidth chwid; |
|
599 font->TextWidthInPixels(_L(" "),chwid); |
|
600 TEST(chwid.iMove==w); |
|
601 TEST(chwid.iWidth+chwid.iLeftAdjust+chwid.iRightAdjust==chwid.iMove); |
|
602 font->TextWidthInPixels(_L("->This text will not be measured<- "),¶m,chwid); |
|
603 TEST(chwid.iMove==w); |
|
604 TEST(chwid.iWidth+chwid.iLeftAdjust+chwid.iRightAdjust==chwid.iMove); |
|
605 |
|
606 // Now do all these tests with an OpenType font where the width with context is different from the |
|
607 // width without context |
|
608 // NOTE: These tests are performed for WINS and WINSCW only because we are using a TrueType font, and the bounds of |
|
609 // the text returned is different for different hardware devices, including different h4's and hence |
|
610 // cannot be measured. |
|
611 #if defined __WINS__ || defined __WINSCW__ |
|
612 CFbsFontEx* openFont = SelectOpenTypeFont(); |
|
613 iResourceCount++; |
|
614 TEST(font->Handle()!=0); |
|
615 CheckResourceCount(); |
|
616 uid=KCFbsFontUid; |
|
617 TEST(font->TypeUid()==uid); |
|
618 cwidth=openFont->CharWidthInPixels('.'); |
|
619 twidth=openFont->TextWidthInPixels(_L(".")); |
|
620 charTextdiff = cwidth - twidth; |
|
621 TEST(1>=charTextdiff && -1<=charTextdiff); |
|
622 param.iStartInputChar = 1; |
|
623 twidthContext=openFont->TextWidthInPixels(_L("\x0915."),¶m); |
|
624 TEST(twidth!=twidthContext); |
|
625 cwidth=openFont->CharWidthInPixels(','); |
|
626 twidth=openFont->TextWidthInPixels(_L(",")); |
|
627 charTextdiff = cwidth - twidth; |
|
628 TEST(1>=charTextdiff && -1<=charTextdiff); |
|
629 twidthContext=openFont->TextWidthInPixels(_L("\x0915,"),¶m); |
|
630 TEST(cwidth!=twidthContext); |
|
631 TEST(twidth!=twidthContext); |
|
632 openFont->TextWidthInPixels(_L("\x0915."),¶m,chwid); |
|
633 TEST(chwid.iMove!=cwidth); |
|
634 #endif |
|
635 |
|
636 CFbsFontEx* font2=SelectFont(); // Don't increment iResourceCount as the font is already in the cache |
|
637 CheckResourceCount(); |
|
638 iTs->ReleaseFont(font2); |
|
639 RFbsSession* fbsalt=RFbsSession::GetSession(); |
|
640 CFbsFontEx* font3=new CFbsFontEx; |
|
641 font3->Duplicate(font->Handle()); |
|
642 iResourceCount++; |
|
643 TEST(font3->Handle()); |
|
644 CheckResourceCount(); |
|
645 TEST(fbsalt->ResourceCount()==iResourceCount); |
|
646 iTs->ReleaseFont(font); |
|
647 iResourceCount--; |
|
648 TEST(w==font3->TextWidthInPixels(_L(" "))); |
|
649 CheckResourceCount(); |
|
650 TEST(fbsalt->ResourceCount()==iResourceCount); |
|
651 font3->Reset(); |
|
652 User::Free(font3); |
|
653 iResourceCount--; |
|
654 CheckResourceCount(); |
|
655 TEST(fbsalt->ResourceCount()==iResourceCount); |
|
656 User::Heap().Check(); |
|
657 } |
|
658 |
|
659 /** |
|
660 @SYMTestCaseID |
|
661 GRAPHICS-FBSERV-0560 |
|
662 |
|
663 @SYMTestCaseDesc |
|
664 Tests the font store. |
|
665 |
|
666 @SYMTestActions |
|
667 Allocates an array of pointers which is |
|
668 used to store the font height. It tests |
|
669 the font height and gets the nearest font |
|
670 available. The heap is checked for |
|
671 memory leaks. |
|
672 |
|
673 @SYMTestExpectedResults |
|
674 Test should pass |
|
675 */ |
|
676 void CTFbs::TestFontStore() |
|
677 { |
|
678 INFO_PRINTF1(_L("Test Font Store")); |
|
679 CFbsFontEx* font=NULL; |
|
680 TFontSpec fs; |
|
681 TInt typefaces=iTs->NumTypefaces(); |
|
682 TTypefaceSupport info; |
|
683 for(TInt count=0;count<typefaces;count++) |
|
684 { |
|
685 iTs->TypefaceSupport(info,count); |
|
686 INFO_PRINTF1(_L(" ")); |
|
687 TBuf<KMaxTypefaceNameLength> tname; |
|
688 tname.Copy(info.iTypeface.iName); |
|
689 INFO_PRINTF1(tname); |
|
690 INFO_PRINTF1(_L("\n")); |
|
691 TInt* heightarray=(TInt*)User::Alloc(info.iNumHeights*sizeof(TInt)); |
|
692 TInt index=0; |
|
693 for(;index<info.iNumHeights;index++) |
|
694 heightarray[index]=iTs->FontHeightInTwips(count,index); |
|
695 for(index=1;index<info.iNumHeights;index++) |
|
696 TEST(heightarray[index]>heightarray[index-1]); |
|
697 for(index=0;index<info.iNumHeights;index++) |
|
698 heightarray[index]=iTs->FontHeightInPixels(count,index); |
|
699 for(index=1;index<info.iNumHeights;index++) |
|
700 TEST(heightarray[index]>=heightarray[index-1]); |
|
701 delete [] heightarray; |
|
702 for(index=0;index<info.iNumHeights;index++) |
|
703 { |
|
704 TInt height=iTs->FontHeightInTwips(count,index); |
|
705 fs.iTypeface=info.iTypeface; |
|
706 fs.iHeight=height; |
|
707 TInt ret=iTs->GetNearestFontToDesignHeightInTwips((CFont*&)font,fs); |
|
708 TEST(ret==KErrNone); |
|
709 TEST(font->Handle()); |
|
710 iTs->ReleaseFont(font); |
|
711 |
|
712 height=iTs->FontHeightInPixels(count,index); |
|
713 fs.iTypeface=info.iTypeface; |
|
714 fs.iHeight=height; |
|
715 ret=iTs->GetNearestFontToDesignHeightInPixels((CFont*&)font,fs); |
|
716 TEST(ret==KErrNone); |
|
717 TEST(font->Handle()); |
|
718 iTs->ReleaseFont(font); |
|
719 } |
|
720 } |
|
721 iResourceCount = iFbs->ResourceCount(); // Allow for fonts left in the typeface store cache |
|
722 User::Heap().Check(); |
|
723 } |
|
724 |
|
725 /** |
|
726 @SYMTestCaseID |
|
727 GRAPHICS-FBSERV-0561 |
|
728 |
|
729 @SYMTestCaseDesc |
|
730 Tests the font name alias |
|
731 |
|
732 @SYMTestActions |
|
733 Creates three different font name alias with a |
|
734 mixture of caps and small letters. Checks the font |
|
735 name aliases using the different names. |
|
736 |
|
737 @SYMTestExpectedResults |
|
738 Test should pass |
|
739 */ |
|
740 void CTFbs::TestFontNameAlias() |
|
741 { |
|
742 INFO_PRINTF1(_L("Test Font Name Alias")); |
|
743 |
|
744 TInt size = 20; |
|
745 _LIT(KFontAlias0,"Font alias 0"); |
|
746 _LIT(KFontAlias1,"Font alias 1"); |
|
747 _LIT(KFontAlias2,"FOnT AlIaS 0");//Alias name in mixture of caps & small letters for KFontAlias0 |
|
748 |
|
749 TBuf<KMaxTypefaceNameLength> defaultName; |
|
750 TBuf<KMaxTypefaceNameLength> fontName[3]; |
|
751 |
|
752 CFbsFontEx* font = NULL; |
|
753 TFontSpec fs(KNullDesC,200); |
|
754 TInt ret = iTs->GetNearestFontToDesignHeightInTwips((CFont*&)font,fs); |
|
755 TEST(ret == KErrNone); |
|
756 TEST(font->Handle()); |
|
757 fs = font->FontSpecInTwips(); |
|
758 defaultName = fs.iTypeface.iName; |
|
759 iTs->ReleaseFont(font); |
|
760 |
|
761 TTypefaceSupport info; |
|
762 for (TInt index = 0, nameIndex = 0; nameIndex < 3; index++) |
|
763 { |
|
764 iTs->TypefaceSupport(info,index); |
|
765 if (info.iTypeface.iName != defaultName) |
|
766 fontName[nameIndex++] = info.iTypeface.iName; |
|
767 } |
|
768 |
|
769 TRAP(ret,iTs->SetFontNameAliasL(KFontAlias0,fontName[0])); |
|
770 TEST(ret == KErrNone); |
|
771 CheckFontNameAlias(KFontAlias0,fontName[0],size); |
|
772 //Testing if it works even if the alias name passed differs in case |
|
773 CheckFontNameAlias(KFontAlias2,fontName[0],size); |
|
774 |
|
775 TRAP(ret,iTs->SetFontNameAliasL(KFontAlias1,fontName[1])); |
|
776 TEST(ret == KErrNone); |
|
777 CheckFontNameAlias(KFontAlias0,fontName[0],size); |
|
778 CheckFontNameAlias(KFontAlias1,fontName[1],size); |
|
779 |
|
780 TRAP(ret,iTs->SetFontNameAliasL(KFontAlias0,fontName[2])); |
|
781 TEST(ret == KErrNone); |
|
782 CheckFontNameAlias(KFontAlias0,fontName[2],size); |
|
783 CheckFontNameAlias(KFontAlias1,fontName[1],size); |
|
784 |
|
785 TRAP(ret,iTs->SetFontNameAliasL(KFontAlias1,KNullDesC)); |
|
786 TEST(ret == KErrNone); |
|
787 CheckFontNameAlias(KFontAlias0,fontName[2],size); |
|
788 CheckFontNameAlias(KFontAlias1,defaultName,size); |
|
789 |
|
790 TRAP(ret,iTs->SetFontNameAliasL(KFontAlias0,KNullDesC)); |
|
791 TEST(ret == KErrNone); |
|
792 CheckFontNameAlias(KFontAlias0,defaultName,size); |
|
793 CheckFontNameAlias(KFontAlias1,defaultName,size); |
|
794 iResourceCount--; // Allow for a cache eviction because the last check fills the cache |
|
795 |
|
796 CheckResourceCount(); |
|
797 User::Heap().Check(); |
|
798 } |
|
799 |
|
800 void CTFbs::CheckFontNameAlias(const TDesC& aFontAlias, const TDesC& aFontName, TInt& aSize) |
|
801 { |
|
802 CFbsFontEx* font = NULL; |
|
803 TFontSpec fs(aFontAlias,aSize); |
|
804 aSize += 20; |
|
805 |
|
806 TInt ret = iTs->GetNearestFontToDesignHeightInTwips((CFont*&)font,fs); |
|
807 TEST(ret == KErrNone); |
|
808 TEST(font->Handle()); |
|
809 |
|
810 TFontSpec checkFS = font->FontSpecInTwips(); |
|
811 TEST(checkFS.iTypeface.iName == aFontName); |
|
812 |
|
813 iTs->ReleaseFont(font); |
|
814 } |
|
815 |
|
816 /** |
|
817 @SYMTestCaseID |
|
818 GRAPHICS-FBSERV-0562 |
|
819 |
|
820 @SYMTestCaseDesc |
|
821 Tests the width of a font stored in a buffer |
|
822 |
|
823 @SYMTestActions |
|
824 Gets how much of the specified descriptor can be |
|
825 displayed for a specified font without |
|
826 exceeding the specified width. |
|
827 |
|
828 @SYMTestExpectedResults |
|
829 Test should pass |
|
830 */ |
|
831 void CTFbs::TestBufferedFont() |
|
832 { |
|
833 INFO_PRINTF1(_L("Test Buffered Font")); |
|
834 CFbsFontEx* font=SelectFont(); |
|
835 TBuf<1280> largebuf; |
|
836 TInt count=0; |
|
837 for(;count<1280;count++) |
|
838 largebuf.Append(32); |
|
839 TInt width,lcount,rcount,lwidth,rwidth; |
|
840 width=font->TextWidthInPixels(largebuf); |
|
841 for(count=0;count<1280;count+=500) |
|
842 { |
|
843 lcount=font->TextCount(largebuf.Left(count),100000); |
|
844 TEST(lcount==count); |
|
845 rcount=font->TextCount(largebuf.Right(1280-count),100000); |
|
846 TEST(rcount==1280-count); |
|
847 lwidth=font->TextWidthInPixels(largebuf.Left(count)); |
|
848 rwidth=font->TextWidthInPixels(largebuf.Right(1280-count)); |
|
849 TEST(rwidth+lwidth==width); |
|
850 } |
|
851 iTs->ReleaseFont(font); |
|
852 CheckResourceCount(); |
|
853 User::Heap().Check(); |
|
854 } |
|
855 |
|
856 /** |
|
857 @SYMTestCaseID |
|
858 GRAPHICS-FBSERV-0563 |
|
859 |
|
860 @SYMTestCaseDesc |
|
861 Tests having multiple fonts allocated |
|
862 and deallocated |
|
863 |
|
864 @SYMTestActions |
|
865 Gets multiple font. Releases the hold of a |
|
866 typeface store client on a specified font. |
|
867 Decrements the access-count for the specified |
|
868 font by one. If this reduces the access-count |
|
869 to zero then the font is no longer needed by any |
|
870 client, and is deleted from the typeface store list. |
|
871 |
|
872 @SYMTestExpectedResults |
|
873 Test should pass |
|
874 */ |
|
875 void CTFbs::TestMultipleFont() |
|
876 { |
|
877 INFO_PRINTF1(_L("Test Multiple Font")); |
|
878 const TInt numfonts=100; |
|
879 CFbsFontEx* fonts[numfonts]; |
|
880 TInt count=0; |
|
881 for(;count<numfonts;count++) |
|
882 fonts[count]=SelectFont(); |
|
883 for(count=0;count<numfonts;count++) |
|
884 iTs->ReleaseFont(fonts[count]); |
|
885 INFO_PRINTF2(_L(" %d font handles created.\n"),numfonts); |
|
886 CheckResourceCount(); |
|
887 User::Heap().Check(); |
|
888 } |
|
889 |
|
890 /** |
|
891 @SYMTestCaseID |
|
892 GRAPHICS-FBSERV-0564 |
|
893 |
|
894 @SYMTestCaseDesc |
|
895 Tests creation of unique bitmaps with |
|
896 no handles already to them. Also tests |
|
897 and verifies defects DEF069571 and DEF076347. |
|
898 |
|
899 @SYMDEF DEF069571 DEF076347 |
|
900 |
|
901 @SYMTestActions |
|
902 Test creation of original bitmaps. Destroys |
|
903 existing bitmap and creates a new one. Tests |
|
904 creation of bitmap by duplicating an already |
|
905 existing bitmap. Tests creation of different |
|
906 sized bitmaps and resizes them. |
|
907 |
|
908 @SYMTestExpectedResults |
|
909 Test should pass |
|
910 */ |
|
911 void CTFbs::TestCreateBitmap() |
|
912 { |
|
913 INFO_PRINTF1(_L("Test Create Bitmap")); |
|
914 __UHEAP_MARK; |
|
915 |
|
916 CFbsBitmapEx bmp1; |
|
917 CFbsBitmapEx bmp2; |
|
918 |
|
919 // Test creation of original bitmaps (ie handles are unique) |
|
920 TInt ret=bmp1.Create(TSize(0,0),EGray2); |
|
921 TEST(ret==KErrNone); |
|
922 iResourceCount++; |
|
923 CheckResourceCount(); |
|
924 |
|
925 ret=bmp2.Load(iTestBitmapName,ETfbs); |
|
926 TEST(ret==KErrNone); |
|
927 iResourceCount++; |
|
928 TEST(bmp2.Handle()!=bmp1.Handle()); |
|
929 CheckResourceCount(); |
|
930 |
|
931 ret=bmp2.Create(TSize(0,0),EGray2); // Destroys existing and creates new |
|
932 TEST(ret==KErrNone); |
|
933 TEST(bmp2.Handle()!=bmp1.Handle()); |
|
934 CheckResourceCount(); |
|
935 bmp2.Reset(); |
|
936 iResourceCount--; |
|
937 CheckResourceCount(); |
|
938 |
|
939 // Test creation by duplication |
|
940 RFbsSession* fbsalt=RFbsSession::GetSession(); |
|
941 CFbsBitmapEx bmp3; |
|
942 |
|
943 ret=bmp3.Duplicate(bmp1.Handle()); |
|
944 TEST(ret==KErrNone); |
|
945 iResourceCount++; |
|
946 CheckResourceCount(); |
|
947 TEST(fbsalt->ResourceCount()==iResourceCount); |
|
948 TEST((TInt)bmp1.BitmapAddress()); |
|
949 CBitwiseBitmap* bmp3add=bmp3.BitmapAddress(); |
|
950 CBitwiseBitmap* bmp1add=bmp1.BitmapAddress(); |
|
951 TEST(bmp3add==bmp1add); |
|
952 TEST(bmp3.Handle()==bmp1.Handle()); |
|
953 bmp3.Reset(); |
|
954 iResourceCount--; |
|
955 CheckResourceCount(); |
|
956 TEST(fbsalt->ResourceCount()==iResourceCount); |
|
957 bmp1.Reset(); |
|
958 iResourceCount--; |
|
959 CheckResourceCount(); |
|
960 TEST(fbsalt->ResourceCount()==iResourceCount); |
|
961 |
|
962 //Testing the DEF069571 |
|
963 |
|
964 CFbsBitmapEx bmp0; |
|
965 //Test creation of large bitmaps (>65536) |
|
966 TInt ret0=bmp0.Create(TSize(65536,1),EGray256); |
|
967 bmp0.Reset(); |
|
968 |
|
969 //Testcode for DEF076347 |
|
970 CFbsBitmapEx bmp01; |
|
971 TInt ret01=bmp01.Create(TSize(65536,1),EColor16MU); |
|
972 TInt ret02=bmp01.SetDisplayMode(EColor16MA); |
|
973 bmp01.Reset(); |
|
974 |
|
975 |
|
976 |
|
977 // Test creation of different sizes and resizing them |
|
978 DoResizeBitmap(EGray2); |
|
979 DoResizeBitmap(EGray4); |
|
980 DoResizeBitmap(EGray16); |
|
981 DoResizeBitmap(EGray256); |
|
982 DoResizeBitmap(EColor16); |
|
983 DoResizeBitmap(EColor256); |
|
984 DoResizeBitmap(EColor4K); |
|
985 DoResizeBitmap(EColor64K); |
|
986 DoResizeBitmap(EColor16M); |
|
987 |
|
988 User::Heap().Check(); |
|
989 __UHEAP_MARKEND; |
|
990 } |
|
991 |
|
992 void CTFbs::DoResizeBitmap(TDisplayMode aDispMode) |
|
993 { |
|
994 const TInt numNewSizes = 5; |
|
995 const TSize newSizes[numNewSizes] = { TSize(0,0), TSize(1,1), TSize(17,20), TSize(32,32), TSize(32,1025) }; |
|
996 const TInt numTwipsSizes = 4; |
|
997 const TSize twipsSizes[numTwipsSizes] = { TSize(100,100), TSize(1440,1440), TSize(1000000,1000000), TSize(0,0) }; |
|
998 |
|
999 __UHEAP_MARK; |
|
1000 |
|
1001 CFbsBitmapEx bmp; |
|
1002 |
|
1003 TInt count; |
|
1004 for(count = 0; count < numNewSizes; count++) |
|
1005 { |
|
1006 TSize size = newSizes[count]; |
|
1007 TInt ret = bmp.Create(size,aDispMode); |
|
1008 TEST(ret == KErrNone); |
|
1009 TEST(bmp.Handle() != 0); |
|
1010 TEST(bmp.SizeInPixels() == size); |
|
1011 TEST(bmp.DisplayMode() == aDispMode); |
|
1012 } |
|
1013 |
|
1014 for(count = 0; count < numNewSizes; count++) |
|
1015 { |
|
1016 TInt ret = bmp.Create(TSize(0,0),aDispMode); |
|
1017 TSize size = newSizes[count]; |
|
1018 ret = bmp.Resize(size); |
|
1019 TEST(ret == KErrNone); |
|
1020 TEST(bmp.SizeInPixels() == size); |
|
1021 } |
|
1022 |
|
1023 for(count = 0; count < numTwipsSizes; count++) |
|
1024 { |
|
1025 TSize size = twipsSizes[count]; |
|
1026 bmp.SetSizeInTwips(size); |
|
1027 TEST(bmp.SizeInTwips() == size); |
|
1028 } |
|
1029 |
|
1030 bmp.Reset(); |
|
1031 CheckResourceCount(); |
|
1032 |
|
1033 User::Heap().Check(); |
|
1034 DeleteScanLineBuffer(); |
|
1035 __UHEAP_MARKEND; |
|
1036 } |
|
1037 |
|
1038 /** |
|
1039 @SYMTestCaseID |
|
1040 GRAPHICS-FBSERV-0565 |
|
1041 |
|
1042 @SYMTestCaseDesc |
|
1043 Tests loading of bitmaps |
|
1044 |
|
1045 @SYMTestActions |
|
1046 Loads a specific bitmap from a multi-bitmap |
|
1047 file. Retrieves the bitmap addresses for the |
|
1048 bitmap and check if they are valid. |
|
1049 |
|
1050 @SYMTestExpectedResults |
|
1051 Test should pass |
|
1052 */ |
|
1053 void CTFbs::TestLoadBitmap() |
|
1054 { |
|
1055 INFO_PRINTF1(_L("Test Load Bitmap")); |
|
1056 __UHEAP_MARK; |
|
1057 CFbsBitmapEx bmp1; |
|
1058 CFbsBitmapEx bmp2; |
|
1059 CFbsBitmapEx bmp3; |
|
1060 CFbsBitmapEx bmp4; |
|
1061 CFbsBitmapEx bmp5; |
|
1062 TInt ret=bmp1.Load(iTestBitmapName,ETfbs); |
|
1063 TEST(ret==KErrNone); |
|
1064 iResourceCount++; |
|
1065 TEST(bmp1.Handle()!=0); |
|
1066 ret=bmp2.Load(iTestBitmapName,ETfbs); |
|
1067 TEST(ret==KErrNone); |
|
1068 iResourceCount++; |
|
1069 CBitwiseBitmap* bmp1add=bmp1.BitmapAddress(); |
|
1070 TEST((TInt)bmp1add); |
|
1071 CBitwiseBitmap* bmp2add=bmp2.BitmapAddress(); |
|
1072 TEST(bmp1add==bmp2add); |
|
1073 TEST(bmp1.Handle()==bmp2.Handle()); |
|
1074 ret=bmp3.Load(iTestBitmapName,ETblank); |
|
1075 TEST(ret==KErrNone); |
|
1076 iResourceCount++; |
|
1077 TEST(bmp1.Handle()!=bmp3.Handle()); |
|
1078 bmp2.Reset(); |
|
1079 iResourceCount--; |
|
1080 ret=bmp4.Load(iTestBitmapName,ETfbs); |
|
1081 TEST(ret==KErrNone); |
|
1082 iResourceCount++; |
|
1083 CBitwiseBitmap* bmp4add=bmp4.BitmapAddress(); |
|
1084 TEST(bmp1add==bmp4add); |
|
1085 TEST(bmp4.Handle()==bmp1.Handle()); |
|
1086 ret=bmp5.Load(iTestBitmapName,ETblank); |
|
1087 TEST(ret==KErrNone); |
|
1088 iResourceCount++; |
|
1089 CBitwiseBitmap* bmp3add=bmp3.BitmapAddress(); |
|
1090 CBitwiseBitmap* bmp5add=bmp5.BitmapAddress(); |
|
1091 TEST((TInt)bmp3add); |
|
1092 TEST(bmp3add==bmp5add); |
|
1093 TEST(bmp5.Handle()==bmp3.Handle()); |
|
1094 CheckResourceCount(); |
|
1095 bmp3.Reset(); |
|
1096 iResourceCount--; |
|
1097 bmp4.Reset(); |
|
1098 iResourceCount--; |
|
1099 bmp5.Reset(); |
|
1100 iResourceCount--; |
|
1101 ret=bmp2.Load(iTestBitmapName,ETfbs); |
|
1102 TEST(ret==KErrNone); |
|
1103 iResourceCount++; |
|
1104 bmp2add=bmp2.BitmapAddress(); |
|
1105 TEST(bmp1add==bmp2add); |
|
1106 TEST(bmp1.Handle()==bmp2.Handle()); |
|
1107 CheckResourceCount(); |
|
1108 bmp1.Reset(); |
|
1109 iResourceCount--; |
|
1110 bmp2.Reset(); |
|
1111 iResourceCount--; |
|
1112 CheckResourceCount(); |
|
1113 |
|
1114 ret=bmp1.Load(iTestBitmapName,ETfbs,EFalse); |
|
1115 TEST(ret==KErrNone); |
|
1116 ret=bmp2.Load(iTestBitmapName,ETfbs,ETrue); |
|
1117 TEST(ret==KErrNone); |
|
1118 ret=bmp3.Load(iTestBitmapName,ETfbs,ETrue); |
|
1119 TEST(ret==KErrNone); |
|
1120 ret=bmp4.Load(iTestBitmapName,ETfbs,EFalse); |
|
1121 TEST(ret==KErrNone); |
|
1122 ret=bmp5.Load(iTestBitmapName,ETfbs,ETrue); |
|
1123 TEST(ret==KErrNone); |
|
1124 bmp1add=bmp1.BitmapAddress(); |
|
1125 bmp2add=bmp2.BitmapAddress(); |
|
1126 bmp3add=bmp3.BitmapAddress(); |
|
1127 bmp4add=bmp4.BitmapAddress(); |
|
1128 bmp5add=bmp5.BitmapAddress(); |
|
1129 TEST(bmp1add!=bmp2add); |
|
1130 TEST(bmp1add!=bmp3add); |
|
1131 TEST(bmp1add!=bmp4add); |
|
1132 TEST(bmp1add!=bmp5add); |
|
1133 TEST(bmp2add==bmp3add); |
|
1134 TEST(bmp2add!=bmp4add); |
|
1135 TEST(bmp2add==bmp5add); |
|
1136 TEST(bmp3add!=bmp4add); |
|
1137 TEST(bmp3add==bmp5add); |
|
1138 TEST(bmp4add!=bmp5add); |
|
1139 bmp1.Reset(); |
|
1140 bmp2.Reset(); |
|
1141 bmp3.Reset(); |
|
1142 bmp4.Reset(); |
|
1143 bmp5.Reset(); |
|
1144 User::Heap().Check(); |
|
1145 DeleteScanLineBuffer(); |
|
1146 __UHEAP_MARKEND; |
|
1147 } |
|
1148 |
|
1149 /** |
|
1150 @SYMTestCaseID |
|
1151 GRAPHICS-FBSERV-0566 |
|
1152 |
|
1153 @SYMTestCaseDesc |
|
1154 Checks the properties of a created bitmap. |
|
1155 |
|
1156 @SYMTestActions |
|
1157 Creates a bitmap. Checks the resource count. |
|
1158 Checks the handle, size, display mode and |
|
1159 conversion methods for twips to pixels. Checks |
|
1160 the heap for memory leaks. |
|
1161 |
|
1162 @SYMTestExpectedResults |
|
1163 Test should pass |
|
1164 */ |
|
1165 void CTFbs::TestQueryBitmap() |
|
1166 { |
|
1167 INFO_PRINTF1(_L("Test Query Bitmap")); |
|
1168 __UHEAP_MARK; |
|
1169 CheckResourceCount(); |
|
1170 CFbsBitmapEx bmp; |
|
1171 TInt ret=bmp.Create(TSize(100,100),EGray16); |
|
1172 TEST(ret==KErrNone); |
|
1173 iResourceCount++; |
|
1174 CheckResourceCount(); |
|
1175 TEST(bmp.Handle()!=0); |
|
1176 TEST(bmp.SizeInPixels()==TSize(100,100)); |
|
1177 TEST(bmp.DisplayMode()==EGray16); |
|
1178 bmp.SetSizeInTwips(TSize(1000,1000)); |
|
1179 TEST(bmp.SizeInTwips()==TSize(1000,1000)); |
|
1180 TEST(bmp.HorizontalPixelsToTwips(10)==100); |
|
1181 TEST(bmp.VerticalPixelsToTwips(10)==100); |
|
1182 TEST(bmp.HorizontalTwipsToPixels(100)==10); |
|
1183 TEST(bmp.VerticalTwipsToPixels(100)==10); |
|
1184 TEST(bmp.ScanLineLength(100,EGray16)==52); |
|
1185 bmp.Reset(); |
|
1186 iResourceCount--; |
|
1187 CheckResourceCount(); |
|
1188 User::Heap().Check(); |
|
1189 DeleteScanLineBuffer(); |
|
1190 __UHEAP_MARKEND; |
|
1191 } |
|
1192 |
|
1193 /** |
|
1194 @SYMTestCaseID |
|
1195 GRAPHICS-FBSERV-0567 |
|
1196 |
|
1197 @SYMTestCaseDesc |
|
1198 Extended test to check scan line buffer in |
|
1199 session allocated correctly for SetRomBitmapL |
|
1200 |
|
1201 @SYMTestActions |
|
1202 Loads a specific bitmap from a multi-bitmap |
|
1203 file. Reset the bitmap and checks the resource |
|
1204 count. Loads new bitmaps, checks the handle |
|
1205 the bitmap address and data address. |
|
1206 |
|
1207 @SYMTestExpectedResults |
|
1208 Test should pass |
|
1209 */ |
|
1210 void CTFbs::TestRomBitmapL() |
|
1211 { |
|
1212 _LIT(KBmpFile, "z:\\system\\data\\tfbs.rbm"); |
|
1213 INFO_PRINTF1(_L("Test Rom Bitmap")); |
|
1214 CheckResourceCount(); |
|
1215 CFbsBitmapEx bmpx; |
|
1216 TInt ret=bmpx.Load(KBmpFile,ETfbs); |
|
1217 if (ret != KErrNone) |
|
1218 { |
|
1219 INFO_PRINTF2(_L("Rom bitmap tfbs.mbm not loaded %d\r\n"),ret); |
|
1220 return; |
|
1221 } |
|
1222 bmpx.Reset(); |
|
1223 CheckResourceCount(); |
|
1224 __UHEAP_MARK; |
|
1225 CFbsBitmapEx bmp1; |
|
1226 CFbsBitmapEx bmp2; |
|
1227 CFbsBitmapEx bmp3; |
|
1228 CFbsBitmapEx bmp4; |
|
1229 CFbsBitmapEx bmp5; |
|
1230 ret=bmp1.Load(KBmpFile,ETfbs); |
|
1231 TEST(ret==KErrNone); |
|
1232 TEST(bmp1.Handle()!=0); |
|
1233 ret=bmp2.Load(KBmpFile,ETfbs); |
|
1234 TEST(ret==KErrNone); |
|
1235 CBitwiseBitmap* bmp1add=bmp1.BitmapAddress(); |
|
1236 TEST((TInt)bmp1add); |
|
1237 CBitwiseBitmap* bmp2add=bmp2.BitmapAddress(); |
|
1238 TEST(bmp1add==bmp2add); |
|
1239 TEST(bmp1.Handle()==bmp2.Handle()); |
|
1240 CheckResourceCount(); |
|
1241 |
|
1242 ret=bmp3.Load(KBmpFile,ETblank); |
|
1243 TEST(ret==KErrNone); |
|
1244 TEST(bmp1.Handle()!=bmp3.Handle()); |
|
1245 bmp2.Reset(); |
|
1246 ret=bmp4.Load(KBmpFile,ETfbs); |
|
1247 TEST(ret==KErrNone); |
|
1248 CBitwiseBitmap* bmp4add=bmp4.BitmapAddress(); |
|
1249 TEST(bmp1add==bmp4add); |
|
1250 TEST(bmp4.Handle()==bmp1.Handle()); |
|
1251 |
|
1252 ret=bmp5.Load(KBmpFile,ETblank); |
|
1253 TEST(ret==KErrNone); |
|
1254 CBitwiseBitmap* bmp3add=bmp3.BitmapAddress(); |
|
1255 CBitwiseBitmap* bmp5add=bmp5.BitmapAddress(); |
|
1256 TEST((TInt)bmp3add); |
|
1257 TEST(bmp3add==bmp5add); |
|
1258 TEST(bmp5.Handle()==bmp3.Handle()); |
|
1259 |
|
1260 CheckResourceCount(); |
|
1261 bmp3.Reset(); |
|
1262 bmp4.Reset(); |
|
1263 bmp5.Reset(); |
|
1264 ret=bmp2.Load(KBmpFile,ETfbs); |
|
1265 TEST(ret==KErrNone); |
|
1266 bmp2add=bmp2.BitmapAddress(); |
|
1267 TEST(bmp1add==bmp2add); |
|
1268 TEST(bmp1.Handle()==bmp2.Handle()); |
|
1269 |
|
1270 CheckResourceCount(); |
|
1271 bmp2.Reset(); |
|
1272 ret=bmp2.Load(iTestBitmapName,ETfbs); |
|
1273 TEST(ret==KErrNone); |
|
1274 bmp2add=bmp2.BitmapAddress(); |
|
1275 TSize bmpsize=bmp1.SizeInPixels(); |
|
1276 TInt sllen=CFbsBitmap::ScanLineLength(bmpsize.iWidth,bmp1.DisplayMode()); |
|
1277 sllen*=bmpsize.iHeight; |
|
1278 bmp1.LockHeap(); |
|
1279 TUint32* bmp1bits=bmp1.DataAddress(); |
|
1280 bmp1.UnlockHeap(); |
|
1281 bmp2.LockHeap(); |
|
1282 TUint32* bmp2bits=bmp2.DataAddress(); |
|
1283 bmp2.UnlockHeap(); |
|
1284 TEST(Mem::Compare((TUint8*)bmp1bits,sllen,(TUint8*)bmp2bits,sllen)==0); |
|
1285 bmp1.Reset(); |
|
1286 bmp2.Reset(); |
|
1287 |
|
1288 ret=bmp1.Load(KBmpFile,ETfbs); |
|
1289 TEST(ret==KErrNone); |
|
1290 // Extended test to check scan line buffer in session allocated |
|
1291 // correctly for SetRomBitmapL() |
|
1292 DeleteScanLineBuffer(); |
|
1293 TInt size = 0; |
|
1294 bmp2.SetRomBitmapL(bmp1.BitmapAddress(),size); |
|
1295 TEST(iFbs->iScanLineBuffer != 0); |
|
1296 TEST(Mem::Compare((TUint8*)bmp1.BitmapAddress(),size,(TUint8*)bmp2.BitmapAddress(),size)==0); |
|
1297 bmp1.Reset(); |
|
1298 bmp2.Reset(); |
|
1299 |
|
1300 User::Heap().Check(); |
|
1301 DeleteScanLineBuffer(); |
|
1302 __UHEAP_MARKEND; |
|
1303 } |
|
1304 |
|
1305 TInt AlternateThreadTest(TAny* aAny) |
|
1306 { |
|
1307 CTFbs* alt = static_cast<CTFbs*> (aAny); |
|
1308 __UHEAP_MARK; |
|
1309 |
|
1310 TInt ret=RFbsSession::Connect(); |
|
1311 alt->TEST(ret==KErrNone); |
|
1312 RFbsSession* fbs=RFbsSession::GetSession(); |
|
1313 alt->TEST(fbs!=NULL); |
|
1314 alt->TEST(fbs->ResourceCount()==0); |
|
1315 |
|
1316 CFbsFontEx* font=new CFbsFontEx; |
|
1317 ret=font->Duplicate(buffer[0]); |
|
1318 alt->TEST(ret==KErrNone); |
|
1319 alt->TEST(fbs->ResourceCount()==1); |
|
1320 |
|
1321 CFbsBitmapEx bmp; |
|
1322 ret=bmp.Duplicate(buffer[1]); |
|
1323 alt->TEST(ret==KErrNone); |
|
1324 #if defined(__WINS__) |
|
1325 alt->TEST(fbs->ResourceCount()==2); |
|
1326 #endif |
|
1327 |
|
1328 CFbsFontEx* font2=new CFbsFontEx; |
|
1329 ret=font2->Duplicate(buffer[0]); |
|
1330 alt->TEST(ret==KErrNone); |
|
1331 font->Reset(); |
|
1332 User::Free(font); |
|
1333 font2->Reset(); |
|
1334 User::Free(font2); |
|
1335 #if defined(__WINS__) |
|
1336 alt->TEST(fbs->ResourceCount()==1); |
|
1337 #endif |
|
1338 CFbsBitmapEx bmp2; |
|
1339 ret=bmp2.Duplicate(buffer[1]); |
|
1340 alt->TEST(ret==KErrNone); |
|
1341 bmp.Reset(); |
|
1342 bmp2.Reset(); |
|
1343 alt->TEST(fbs->ResourceCount()==0); |
|
1344 RFbsSession::Disconnect(); |
|
1345 __UHEAP_MARKEND; |
|
1346 return(KErrNone); |
|
1347 } |
|
1348 |
|
1349 /** |
|
1350 @SYMTestCaseID |
|
1351 GRAPHICS-FBSERV-0568 |
|
1352 |
|
1353 @SYMTestCaseDesc |
|
1354 Tests the resource counting of font objects |
|
1355 during multi threading |
|
1356 |
|
1357 @SYMTestActions |
|
1358 |
|
1359 @SYMTestExpectedResults |
|
1360 Test should pass |
|
1361 */ |
|
1362 void CTFbs::TestMultiThread() |
|
1363 { |
|
1364 INFO_PRINTF1(_L("Test Multiple Threads")); |
|
1365 CFbsFontEx* font=SelectFont(); |
|
1366 TEST(font->Handle()!=0); |
|
1367 iResourceCount++; |
|
1368 CheckResourceCount(); |
|
1369 |
|
1370 CFbsBitmapEx bmp; |
|
1371 TInt ret=bmp.Load(iTestBitmapName,ETfbs); |
|
1372 TEST(ret==KErrNone); |
|
1373 iResourceCount++; |
|
1374 CheckResourceCount(); |
|
1375 |
|
1376 buffer[0]=font->Handle(); |
|
1377 buffer[1]=bmp.Handle(); |
|
1378 RThread thrd; |
|
1379 TRequestStatus stat; |
|
1380 thrd.Create(_L("AlternateThreadTest"),AlternateThreadTest,KDefaultStackSize,0x2000,0x2000,this); |
|
1381 thrd.SetPriority(EPriorityMuchMore); |
|
1382 thrd.Logon(stat); |
|
1383 thrd.Resume(); |
|
1384 User::WaitForRequest(stat); |
|
1385 thrd.Close(); |
|
1386 bmp.Reset(); |
|
1387 iResourceCount--; |
|
1388 iTs->ReleaseFont(font); |
|
1389 iResourceCount--; |
|
1390 CheckResourceCount(); |
|
1391 User::Heap().Check(); |
|
1392 } |
|
1393 |
|
1394 /** |
|
1395 @SYMTestCaseID |
|
1396 GRAPHICS-FBSERV-0569 |
|
1397 |
|
1398 @SYMTestCaseDesc |
|
1399 Tests compression of bitmaps on the heap. |
|
1400 |
|
1401 @SYMTestActions |
|
1402 Creates a bitmap. Checks the resource count. |
|
1403 Allocates memory on the heap. Locks the heap and |
|
1404 stores the bitmaps data address. The heap is unlocked. |
|
1405 Copies data from the stored data address and compares |
|
1406 the copied data with the original data. The heap is |
|
1407 checked for memory leaks. |
|
1408 |
|
1409 @SYMTestExpectedResults |
|
1410 Test should pass |
|
1411 */ |
|
1412 void CTFbs::TestHeapCompression() |
|
1413 { |
|
1414 INFO_PRINTF1(_L("Test Heap Compression")); |
|
1415 __UHEAP_MARK; |
|
1416 CheckResourceCount(); |
|
1417 CFbsBitmapEx bmp1; |
|
1418 TInt ret=bmp1.Create(TSize(100,100),EGray16); |
|
1419 TEST(ret==KErrNone); |
|
1420 iResourceCount++; |
|
1421 CheckResourceCount(); |
|
1422 CFbsBitmapEx bmp2; |
|
1423 ret=bmp2.Create(TSize(100,100),EGray16); |
|
1424 TEST(ret==KErrNone); |
|
1425 iResourceCount++; |
|
1426 CheckResourceCount(); |
|
1427 TUint32* data=(TUint32*)User::Alloc(5200); |
|
1428 TEST(data!=NULL); |
|
1429 bmp2.LockHeap(); |
|
1430 TUint32* sladd=bmp2.DataAddress(); |
|
1431 bmp2.UnlockHeap(); |
|
1432 TUint32* slptr=sladd; |
|
1433 for(TInt count=0;count<1300;count++) |
|
1434 *slptr++=count; |
|
1435 Mem::Copy(data,sladd,5200); |
|
1436 bmp1.Reset(); |
|
1437 iResourceCount--; |
|
1438 CheckResourceCount(); |
|
1439 bmp2.LockHeap(); |
|
1440 TUint32* newdata=bmp2.DataAddress(); |
|
1441 bmp2.UnlockHeap(); |
|
1442 TEST(Mem::Compare((TUint8*)data,5200,(TUint8*)newdata,5200)==0); |
|
1443 bmp2.Reset(); |
|
1444 iResourceCount--; |
|
1445 CheckResourceCount(); |
|
1446 delete data; |
|
1447 User::Heap().Check(); |
|
1448 DeleteScanLineBuffer(); |
|
1449 __UHEAP_MARKEND; |
|
1450 } |
|
1451 |
|
1452 void CTFbs::ExpandCleanupStackL() |
|
1453 { |
|
1454 TInt count=0; |
|
1455 for(;count<10;count++) |
|
1456 CleanupStack::PushL((TUint32*)0x1); |
|
1457 CleanupStack::Pop(count); |
|
1458 } |
|
1459 |
|
1460 void CTFbs::CheckResourceCount() |
|
1461 { |
|
1462 const TInt serverResourceCount = iFbs->ResourceCount(); |
|
1463 TEST(serverResourceCount == iResourceCount); |
|
1464 } |
|
1465 |
|
1466 // |
|
1467 // DoCreateBitmap(), CreateBitmap(), DoAllocScanLineBufL(), CTFbs::AllocScanLineBuf() are |
|
1468 // used to show "INC044388 SymbianOS week 12 Fbserv crashes (on HW only)" defect |
|
1469 // (problem with NULL scanline buffer) and to prove its fix. |
|
1470 // The idea of the test: |
|
1471 // A second thread ("CreateBitmap" is the thread name) is created and when resumed it |
|
1472 // creates a bitmap and initializes ComprBitmap pointer to point to it. |
|
1473 // The "CreateBitmap" thread signals the main thread, that the bitmap has been created, |
|
1474 // and waits until receiving "Die" signal and then dies. |
|
1475 // The main thread waits for a signal from the second thread and then duplicates the bitmap and |
|
1476 // calls GetScanLine() on duplicated bitmap object. If the call fails, the defect is not fixed! |
|
1477 |
|
1478 CFbsBitmap* ComprBitmap = NULL;//Shared between threads bitmap pointer. |
|
1479 _LIT(KRamComprBitmap, "z:\\system\\data\\16bit20col.mbm"); |
|
1480 RSemaphore BitmapCreatedSyncObj;//It is used to signal when the bitmap, created by the thread, |
|
1481 //is ready for use |
|
1482 RSemaphore DieSyncObj;//It is used to signal that "CreateBitmapThread" can die. |
|
1483 |
|
1484 //Thread function. It is used by AllocScanLineBuf() test to create a test bitmap and share |
|
1485 //it with the main thread. This function is called from CreateBitmap(). |
|
1486 static TInt DoCreateBitmapL(CTFbs* aTest) |
|
1487 { |
|
1488 aTest->TEST(::ComprBitmap == NULL); |
|
1489 |
|
1490 ComprBitmap = new (ELeave) CFbsBitmap; |
|
1491 |
|
1492 CleanupStack::PushL(::ComprBitmap); |
|
1493 User::LeaveIfError(::ComprBitmap->Load(KRamComprBitmap, 0)); |
|
1494 CleanupStack::Pop(::ComprBitmap); |
|
1495 |
|
1496 return KErrNone; |
|
1497 } |
|
1498 |
|
1499 //Thread function. It prepares the cleanup stack and traps the call to DoCreateBitmap(). |
|
1500 static TInt CreateBitmap(TAny* aTest) |
|
1501 { |
|
1502 CTFbs* test = static_cast <CTFbs*> (aTest); |
|
1503 |
|
1504 CTrapCleanup* trapCleanup = CTrapCleanup::New(); |
|
1505 test->TEST(trapCleanup != NULL); |
|
1506 TInt err = RFbsSession::Connect(); |
|
1507 test->TEST(err == KErrNone); |
|
1508 |
|
1509 TRAP(err, DoCreateBitmapL(test)); |
|
1510 |
|
1511 ::BitmapCreatedSyncObj.Signal();//Signal the main thread, that the bitmap has been created |
|
1512 ::DieSyncObj.Wait();//Wait "Die" command from the main thread |
|
1513 |
|
1514 delete ::ComprBitmap; |
|
1515 ::ComprBitmap = NULL; |
|
1516 RFbsSession::Disconnect(); |
|
1517 delete trapCleanup; |
|
1518 return err; |
|
1519 } |
|
1520 |
|
1521 static void DoAllocScanLineBufL(CTFbs& aTest) |
|
1522 { |
|
1523 aTest.TEST(::ComprBitmap == NULL); |
|
1524 //Create semaphores |
|
1525 ::CleanupClosePushL(::BitmapCreatedSyncObj); |
|
1526 ::CleanupClosePushL(::DieSyncObj); |
|
1527 User::LeaveIfError(::BitmapCreatedSyncObj.CreateLocal(0)); |
|
1528 User::LeaveIfError(::DieSyncObj.CreateLocal(0)); |
|
1529 //Create "CreateBitmap" thread. The tread will create "ComprBitmap" bitmap. |
|
1530 RThread createBitmapThread; |
|
1531 _LIT(KName, "CreateBitmap"); |
|
1532 User::LeaveIfError(createBitmapThread.Create(KName, |
|
1533 (TThreadFunction)CreateBitmap, KDefaultStackSize, KMinHeapSize, 0x00100000, &aTest)); |
|
1534 RDebug::Print(_L("CreateBitmap thread started\r\n")); |
|
1535 //Request notification when the tread dies. |
|
1536 TRequestStatus status; |
|
1537 createBitmapThread.Logon(status); |
|
1538 //Resume the thread |
|
1539 createBitmapThread.Resume(); |
|
1540 ::BitmapCreatedSyncObj.Wait();//Wait "bitmap created" signal |
|
1541 //The bitmap "ComprBitmap" should be already created |
|
1542 aTest.TEST(::ComprBitmap != NULL); |
|
1543 //Duplicate the bitmap |
|
1544 CFbsBitmap* bmp = new (ELeave) CFbsBitmap; |
|
1545 CleanupStack::PushL(bmp); |
|
1546 TInt err = bmp->Duplicate(::ComprBitmap->Handle()); |
|
1547 aTest.TEST(err == KErrNone); |
|
1548 //Call GetScanLine(). It will fail if the defect is not fixed. |
|
1549 TBuf8<100> buf; |
|
1550 bmp->GetScanLine(buf, TPoint(0, 0), 10, EColor256); |
|
1551 //Cleanup |
|
1552 CleanupStack::PopAndDestroy(bmp); |
|
1553 //Signal & Wait until "CreateBitmap" thread dies. |
|
1554 ::DieSyncObj.Signal(); |
|
1555 User::WaitForRequest(status); |
|
1556 aTest.TEST(::ComprBitmap == NULL); |
|
1557 CleanupStack::PopAndDestroy(&::DieSyncObj); |
|
1558 CleanupStack::PopAndDestroy(&::BitmapCreatedSyncObj); |
|
1559 } |
|
1560 |
|
1561 //INC044388 - SymbianOS week 12 Fbserv crashes (on HW only) |
|
1562 void CTFbs::AllocScanLineBuf() |
|
1563 { |
|
1564 TRAPD(err, ::DoAllocScanLineBufL(*this)); |
|
1565 TEST(err == KErrNone); |
|
1566 } |
|
1567 // End of INC044388 test. |
|
1568 |
|
1569 |
|
1570 int CTFbs::LoadOpenFontLibraries() |
|
1571 { |
|
1572 RImplInfoPtrArray implementationArray; |
|
1573 TInt error = KErrNone; |
|
1574 TUid uid = {KUidOpenFontRasterizerPlunginInterface}; |
|
1575 |
|
1576 TRAPD(ecomerror,REComSession::ListImplementationsL(uid,implementationArray)); |
|
1577 TEST(ecomerror==KErrNone); |
|
1578 |
|
1579 const TInt availCount = implementationArray.Count(); |
|
1580 for (TInt count=0;count<availCount;++count) |
|
1581 { |
|
1582 const CImplementationInformation* info = implementationArray[count]; |
|
1583 TUid rasterizerUid = info->ImplementationUid(); |
|
1584 // Create a rasterizer |
|
1585 COpenFontRasterizer* rasterizer=0; |
|
1586 TRAP(error,rasterizer = COpenFontRasterizer::NewL(rasterizerUid)); |
|
1587 if (!error) |
|
1588 { |
|
1589 // Install it in the font store. |
|
1590 TRAP(error,iFs->InstallRasterizerL(rasterizer)); |
|
1591 if (error) |
|
1592 delete rasterizer; |
|
1593 } |
|
1594 } |
|
1595 implementationArray.ResetAndDestroy(); |
|
1596 return error; |
|
1597 } |
|
1598 |
|
1599 TBool CTFbs::CheckTypefacesSupport(const TTypefaceSupport& aInfo1, const TTypefaceSupport& aInfo2) |
|
1600 { |
|
1601 if ((aInfo1.iTypeface == aInfo2.iTypeface) && |
|
1602 (aInfo1.iIsScalable == aInfo2.iIsScalable) && |
|
1603 (aInfo1.iMaxHeightInTwips == aInfo2.iMaxHeightInTwips) && |
|
1604 (aInfo1.iMinHeightInTwips == aInfo2.iMinHeightInTwips) && |
|
1605 (aInfo1.iNumHeights == aInfo2.iNumHeights)) |
|
1606 { |
|
1607 return ETrue; |
|
1608 } |
|
1609 return EFalse; |
|
1610 } |
|
1611 |
|
1612 void CTFbs::LoadFontsL(const TDesC& aFontsDir) |
|
1613 { |
|
1614 TUid id1 = TUid::Uid(0); |
|
1615 |
|
1616 RFs fileSys; |
|
1617 User::LeaveIfError(fileSys.Connect()); |
|
1618 |
|
1619 TFindFile fileFinder(fileSys); |
|
1620 CDir* foundFileList = NULL; |
|
1621 |
|
1622 _LIT(KFBSERVFontFilePattern, "*"); |
|
1623 TInt findFileComplete = fileFinder.FindWildByDir(KFBSERVFontFilePattern,aFontsDir,foundFileList); |
|
1624 |
|
1625 while (!findFileComplete) |
|
1626 { |
|
1627 CleanupStack::PushL(foundFileList); |
|
1628 |
|
1629 const TInt foundFileCount = foundFileList->Count(); |
|
1630 for (TInt i = 0; i < foundFileCount; i++) |
|
1631 { |
|
1632 TParse parse; |
|
1633 if (parse.Set((*foundFileList)[i].iName,&fileFinder.File(),NULL) == KErrNone) |
|
1634 { |
|
1635 // Get filename and extension of font proposing to be loaded |
|
1636 TPtrC fontFilename = parse.NameAndExt(); |
|
1637 INFO_PRINTF2(_L("CTFbs::LoadFontsL to load font filename: %S\r\n"), &fontFilename); |
|
1638 TRAPD(addFileError,id1=iFs->AddFileL(parse.FullName())); |
|
1639 if (addFileError != KErrNone) |
|
1640 { |
|
1641 // Log error in the "corrupt font" file |
|
1642 User::Panic(_L("Wrong font file"), addFileError); |
|
1643 } |
|
1644 } |
|
1645 } |
|
1646 CleanupStack::PopAndDestroy(foundFileList); |
|
1647 findFileComplete = fileFinder.FindWild(foundFileList); |
|
1648 } |
|
1649 fileSys.Close(); |
|
1650 } |
|
1651 |
|
1652 /** |
|
1653 @SYMTestCaseID GRAPHICS-PREQ807_1_Load_all_fonts-0001 |
|
1654 |
|
1655 @SYMPREQ REQ4723 |
|
1656 |
|
1657 @SYMTestCaseDesc The test manually scans the font folders and loads all font files available. |
|
1658 Once all the fonts have been loaded and stored in a CFontStore, the TTypefaces stored in this |
|
1659 CFontStore object are compared to the TTypefaces stored in an existing CFbsTypefaceStore. |
|
1660 |
|
1661 @SYMTestPriority High |
|
1662 |
|
1663 @SYMTestStatus Implemented |
|
1664 |
|
1665 @SYMTestActions \n |
|
1666 API Calls:\n |
|
1667 |
|
1668 @SYMTestExpectedResults The test expects that all the font files loaded by the test matches the ones |
|
1669 that FBserv loaded during the startup initialisation. |
|
1670 */ |
|
1671 void CTFbs::TestAllFontsLoaded() |
|
1672 { |
|
1673 INFO_PRINTF1(_L("Test Load all fonts files")); |
|
1674 __UHEAP_MARK; |
|
1675 |
|
1676 iHeap=UserHeap::ChunkHeap(NULL,0x10000,0x10000); |
|
1677 TRAPD(ret,iFs=CFontStore::NewL(iHeap)); |
|
1678 TEST(ret==KErrNone); |
|
1679 TEST(iFs != NULL); |
|
1680 |
|
1681 ret = LoadOpenFontLibraries(); |
|
1682 TEST(ret==KErrNone); |
|
1683 |
|
1684 TRAP(ret, LoadFontsL(KFBSERVFontFileDir)); |
|
1685 TEST(ret==KErrNone); |
|
1686 |
|
1687 // Check the Typefaces are the same both in the newly CFontStore and existing CFbsTypefaceStore |
|
1688 TInt fsTypefaceNum = iFs->NumTypefaces(); |
|
1689 TInt tsTypefaceNum = iTs->NumTypefaces(); |
|
1690 TEST(fsTypefaceNum == tsTypefaceNum); |
|
1691 |
|
1692 TBool equal = EFalse; |
|
1693 for (TInt i = 0; i < fsTypefaceNum; i++) |
|
1694 { |
|
1695 TTypefaceSupport infoFs; |
|
1696 iFs->TypefaceSupport(infoFs,i); |
|
1697 for (TInt j = 0; j < tsTypefaceNum; j++) |
|
1698 { |
|
1699 TTypefaceSupport infoTs; |
|
1700 iTs->TypefaceSupport(infoTs,j); |
|
1701 |
|
1702 equal = CheckTypefacesSupport(infoFs, infoTs); |
|
1703 if (equal) |
|
1704 { |
|
1705 break; |
|
1706 } |
|
1707 } |
|
1708 // Check if the CFontStore typeface has been found in the CFbsTypefaceStore |
|
1709 TEST(equal); |
|
1710 } |
|
1711 |
|
1712 delete iFs; |
|
1713 iHeap->Close(); |
|
1714 |
|
1715 REComSession::FinalClose(); |
|
1716 |
|
1717 User::Heap().Check(); |
|
1718 __UHEAP_MARKEND; |
|
1719 } |
|
1720 |
|
1721 /** |
|
1722 @SYMTestCaseID |
|
1723 GRAPHICS-FBSERV-0570 |
|
1724 |
|
1725 @SYMTestCaseDesc |
|
1726 Tests default language for metrics. |
|
1727 |
|
1728 @SYMTestActions |
|
1729 Constructs a TFontSpec object with the specified |
|
1730 typeface and height. Gets the font which is the |
|
1731 nearest to the given font specification. Checks |
|
1732 that the maximum font height is correct for a |
|
1733 specified language. |
|
1734 |
|
1735 @SYMTestExpectedResults |
|
1736 Test should pass |
|
1737 */ |
|
1738 void CTFbs::TestDefaultLanguageForMetrics() |
|
1739 { |
|
1740 static const TInt KRequiredHeight = 24; |
|
1741 static const TInt KReturnedMaxHeight = 36; |
|
1742 TInt rc = KErrGeneral; |
|
1743 |
|
1744 // Case 00 |
|
1745 // No languages are set on font spec and typeface store |
|
1746 // |
|
1747 TFontSpec fontSpec0(KTypefaceName, KRequiredHeight); |
|
1748 CFont* font0 = NULL; |
|
1749 rc = iTs->GetNearestFontToDesignHeightInPixels(font0, fontSpec0); |
|
1750 TEST(KErrNone == rc); |
|
1751 TEST(NULL != font0); |
|
1752 TEST(KReturnedMaxHeight == font0->FontMaxHeight()); |
|
1753 INFO_PRINTF2(_L("FontMaxHeight returns %d"), font0->FontMaxHeight()); |
|
1754 |
|
1755 // Case 01 |
|
1756 // Set language on font spec will suppress that on typeface store |
|
1757 // |
|
1758 fontSpec0.SetScriptTypeForMetrics(ELangGreek); |
|
1759 CFont* font1 = NULL; |
|
1760 rc = iTs->GetNearestFontToDesignHeightInPixels(font1, fontSpec0); |
|
1761 TEST(KErrNone == rc); |
|
1762 TEST(NULL != font1); |
|
1763 TEST(KReturnedMaxHeight == font1->FontMaxHeight()); |
|
1764 INFO_PRINTF2(_L("FontMaxHeight returns %d"), font1->FontMaxHeight()); |
|
1765 |
|
1766 // Set language on typeface store |
|
1767 iTs->SetDefaultLanguageForMetrics(ELangEnglish); |
|
1768 |
|
1769 // Case 10 |
|
1770 // Language on typeface store will suppress that on font spec |
|
1771 // _if_ its not specified |
|
1772 // |
|
1773 TFontSpec fontSpec1(KTypefaceName, KRequiredHeight); |
|
1774 CFont* font2 = NULL; |
|
1775 rc = iTs->GetNearestFontToDesignHeightInPixels(font2, fontSpec1); |
|
1776 TEST(KErrNone == rc); |
|
1777 TEST(NULL != font2); |
|
1778 TEST(KReturnedMaxHeight == font2->FontMaxHeight()); |
|
1779 INFO_PRINTF2(_L("FontMaxHeight returns %d"), font2->FontMaxHeight()); |
|
1780 |
|
1781 // Case 11 - Negative test of case 10 |
|
1782 // |
|
1783 fontSpec1.SetScriptTypeForMetrics(ELangRussian); |
|
1784 CFont* font3 = NULL; |
|
1785 rc = iTs->GetNearestFontToDesignHeightInPixels(font3, fontSpec1); |
|
1786 TEST(KErrNone == rc); |
|
1787 TEST(NULL != font3); |
|
1788 TEST(KReturnedMaxHeight == font3->FontMaxHeight()); |
|
1789 INFO_PRINTF2(_L("FontMaxHeight returns %d"), font3->FontMaxHeight()); |
|
1790 |
|
1791 iTs->ReleaseFont(font0); |
|
1792 iTs->ReleaseFont(font1); |
|
1793 iTs->ReleaseFont(font2); |
|
1794 iTs->ReleaseFont(font3); |
|
1795 |
|
1796 CheckResourceCount(); |
|
1797 User::Heap().Check(); |
|
1798 } |
|
1799 |
|
1800 |
|
1801 //The "bad" versions of these standard fonts have been hacked to give specific results |
|
1802 _LIT(KFBSERVFontFileOpen, "Z:\\resource\\fonts\\DejaVuSansCondensed.ttf"); |
|
1803 |
|
1804 //This file is identical to DejaVuSansCondensed.ttf |
|
1805 _LIT(KFBSERVFontFileBadOpen, "Z:\\PlatTest\\Graphics\\TestData\\uniquified_fonts\\xx_dejavusanscondensed.ttf"); |
|
1806 |
|
1807 /** |
|
1808 @SYMTestCaseID GRAPHICS-CTFbs-TestDuplicateFontFileEntries-0001 |
|
1809 |
|
1810 @SYMDEF DEF094692 |
|
1811 |
|
1812 @SYMTestCaseDesc If Open fonts are loaded that are marginally unique compared to the |
|
1813 existing fonts then they are not actually added to the typeface system, and may even be discarded. |
|
1814 The fix is actually in FNTSTORE, but I need to test in an environment with full Open font support, |
|
1815 which is not provided in the fontstore test code. |
|
1816 Bi9tmap fon ts are tested in fntstore\tfs\t_fntmem.cpp |
|
1817 |
|
1818 @SYMTestPriority Med |
|
1819 |
|
1820 @SYMTestStatus Implemented |
|
1821 |
|
1822 @SYMTestActions \n |
|
1823 The original versions of the Open fonts are first loaded to ensure that they have actually been loaded. |
|
1824 The original versions of the Open fonts are loaded again to demobnstrate they have the same IDs. |
|
1825 A version of the open font which is identical except for a different filename should be rejected |
|
1826 |
|
1827 |
|
1828 API Calls: AddFile\n |
|
1829 |
|
1830 @SYMTestExpectedResults The test expects: |
|
1831 The original versions should load without changing the number of typefaces |
|
1832 The second load should return the same UID for the font |
|
1833 The identical fonts should return captured fail codes, and not change the typeface counts |
|
1834 The semi-identical font should perform a single increase to UIDs and typefaces |
|
1835 */ |
|
1836 void CTFbs::TestDuplicateFontFileEntries() |
|
1837 { |
|
1838 |
|
1839 INFO_PRINTF1(_L("Test Load semi-duplicate fonts files")); |
|
1840 TInt numFacesBefore=iTs->NumTypefaces(); |
|
1841 TInt aIdOpen1=0; |
|
1842 TInt aIdOpen1b=0; |
|
1843 TInt aIdOpen2=0; |
|
1844 //make sure the originals of these fonts were safely opened |
|
1845 //both should simply cause a reference-count increase on the originator files. |
|
1846 TInt err2=iTs->AddFile(KFBSERVFontFileOpen,aIdOpen1); |
|
1847 TEST(err2==KErrNone); |
|
1848 if (err2) |
|
1849 { |
|
1850 INFO_PRINTF1(_L("One of the expected fonts was missing. Test abandoned.")); |
|
1851 } |
|
1852 else |
|
1853 { |
|
1854 TInt numFacesAfterLoadOriginals=iTs->NumTypefaces(); |
|
1855 //TEST(numFacesBefore==numFacesAfterLoadOriginals); |
|
1856 if (numFacesBefore!=numFacesAfterLoadOriginals) |
|
1857 INFO_PRINTF2(_L("Warning: reinstalling the system fonts added %d typefaces!"), numFacesAfterLoadOriginals-numFacesBefore); |
|
1858 |
|
1859 //load the originals again just to prove the UIDs are re-used - only makes sense for open font where UID is generated! |
|
1860 TInt err2=iTs->AddFile(KFBSERVFontFileOpen,aIdOpen1b); |
|
1861 TEST(err2==KErrNone); |
|
1862 TEST(aIdOpen1==aIdOpen1b); |
|
1863 |
|
1864 TInt numFacesAfterLoadBadFile3=iTs->NumTypefaces(); |
|
1865 TEST(numFacesBefore==numFacesAfterLoadBadFile3); |
|
1866 |
|
1867 //This open font file contains no new fonts, so will ultimately be discarded |
|
1868 //The pathname is different so it won't be considered identical to its originator |
|
1869 TInt err4=iTs->AddFile(KFBSERVFontFileBadOpen,aIdOpen2); |
|
1870 TEST(err4==KErrAlreadyExists && aIdOpen2==0); |
|
1871 if (err4!=KErrAlreadyExists) |
|
1872 INFO_PRINTF2(_L("Unexpected error code was %d"),err4); |
|
1873 |
|
1874 TInt numFacesAfterLoadBadFile4=iTs->NumTypefaces(); |
|
1875 TEST(numFacesBefore==numFacesAfterLoadBadFile4); |
|
1876 |
|
1877 } |
|
1878 |
|
1879 if (aIdOpen1) iTs->RemoveFile(aIdOpen1); |
|
1880 if (aIdOpen1b) iTs->RemoveFile(aIdOpen1b); |
|
1881 if (aIdOpen2) iTs->RemoveFile(aIdOpen2); |
|
1882 |
|
1883 //The added typeface should have been uninstalled |
|
1884 TInt numFacesAfterUninstall=iTs->NumTypefaces(); |
|
1885 TEST(numFacesAfterUninstall==numFacesBefore); |
|
1886 |
|
1887 |
|
1888 } |
|
1889 |
|
1890 |
|
1891 /* |
|
1892 COMMENTED OUT FOR NOW BECAUSE DEF084095 FIX MAKES THIS TEST REDUNDANT |
|
1893 //DEF078039: Workwer function: Hindi - Risk of memory leak (RShapeInfo) if client thread dies |
|
1894 TInt TShapeHeaderMemoryLeakTest(TAny* aTest) |
|
1895 { |
|
1896 _LIT16(KHindi1,"\x0915\x094D\x0937\x0924\x094D\x0930\x093F\x092F\x0020\x0909\x0926\x094D\x0926\x0947\x0936\x094D\x0020\x0915\x094D\x0937\x093F\x092A\x094D\x0930"); |
|
1897 _LIT(KDevFontFace, "Devanagari OT Eval"); |
|
1898 |
|
1899 CTFbs* test = static_cast<CTFbs*> (aTest); |
|
1900 |
|
1901 __UHEAP_MARK; |
|
1902 |
|
1903 const TDesC16& Hindi1 = KHindi1; |
|
1904 RShapeInfo shapeInfo; |
|
1905 TBool isOpen = EFalse; |
|
1906 |
|
1907 // Create a cleanup stack for this thread |
|
1908 CTrapCleanup* trapCleanup = CTrapCleanup::New(); |
|
1909 test->TEST(trapCleanup != NULL); |
|
1910 |
|
1911 // Create a new session with FBSERV |
|
1912 TInt ret=RFbsSession::Connect(); |
|
1913 test->TEST(ret==KErrNone); |
|
1914 RFbsSession* fbs=RFbsSession::GetSession(); |
|
1915 test->TEST(fbs!=NULL); |
|
1916 |
|
1917 // Create a FbsFont to use for shaping |
|
1918 TFontSpec testFontSpec(KDevFontFace,200); |
|
1919 CFbsBitmap* bmp = new(ELeave) CFbsBitmap; |
|
1920 ret = bmp->Create(TSize(100,100),EGray2); |
|
1921 if (ret == KErrNotSupported) |
|
1922 return ret; |
|
1923 else |
|
1924 User::LeaveIfError(ret); |
|
1925 |
|
1926 CFbsBitmapDevice* device = NULL; |
|
1927 TRAPD(err,device = CFbsBitmapDevice::NewL(bmp)); |
|
1928 User::LeaveIfError(err); |
|
1929 |
|
1930 CFbsBitGc* gc = NULL; |
|
1931 User::LeaveIfError(device->CreateContext(gc)); |
|
1932 |
|
1933 CFbsFont* font = NULL; |
|
1934 User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(font,testFontSpec)); |
|
1935 gc->UseFont(font); |
|
1936 |
|
1937 // Open shapeInfo by calling GetCharacterPosition2. This makes an IPC call to the |
|
1938 // server and shapes Hindi, resulting in memory being allocated for a TShapeHeader object |
|
1939 CFont::TPositionParam param; |
|
1940 param.iDirection = CFont::EHorizontal; |
|
1941 param.iFlags = CFont::TPositionParam::EFLogicalOrder; |
|
1942 param.iText.Set(Hindi1); |
|
1943 param.iPosInText = 0; |
|
1944 param.iPen.iX = param.iPen.iY = 0; |
|
1945 TBool r = font->GetCharacterPosition2(param, shapeInfo); |
|
1946 |
|
1947 // Test is memory was allocated to a TShapeHeader object |
|
1948 isOpen = shapeInfo.IsOpen(); |
|
1949 test->TEST(isOpen == 1); |
|
1950 |
|
1951 // Tidy up and close |
|
1952 delete bmp; |
|
1953 delete device; |
|
1954 delete gc; |
|
1955 |
|
1956 // Disconnect from the server. i.e. end ther session, without calling |
|
1957 // RShapeInfo::Close(), to simulate a client death |
|
1958 RFbsSession::Disconnect(); |
|
1959 |
|
1960 // Check to see is TShapeHeader has been freed. |
|
1961 // Since a pointer the the TShapeHeader object is stored with the |
|
1962 // COpenFontSessionCache, when the client disconnects, the TShapeHeader |
|
1963 // object is freed along with the session cache. |
|
1964 isOpen = shapeInfo.IsOpen(); |
|
1965 test->TEST(isOpen == 0); |
|
1966 |
|
1967 delete trapCleanup; |
|
1968 |
|
1969 __UHEAP_MARKEND; |
|
1970 return(KErrNone); |
|
1971 } |
|
1972 */ |
|
1973 /* |
|
1974 COMMENTED OUT FOR NOW BECAUSE DEF084095 FIX MAKES THIS TEST REDUNDANT |
|
1975 |
|
1976 //DEF078039: Hindi - Risk of memory leak (RShapeInfo) if client thread dies |
|
1977 void CTFbs::TestShapeHeaderMemoryLeakAtClientDeath() |
|
1978 { |
|
1979 INFO_PRINTF1(_L("Test Shape Header Memory Leak At Client Death")); |
|
1980 RThread shaperThread; |
|
1981 TRequestStatus stat; |
|
1982 shaperThread.Create(_L("Shaper Thread"),TShapeHeaderMemoryLeakTest,KDefaultStackSize, KMinHeapSize, 0x00100000,this); |
|
1983 shaperThread.SetPriority(EPriorityMuchMore); |
|
1984 shaperThread.Logon(stat); |
|
1985 shaperThread.Resume(); |
|
1986 User::WaitForRequest(stat); |
|
1987 shaperThread.Close(); |
|
1988 User::Heap().Check(); |
|
1989 } |
|
1990 // End of DEF078039 test. |
|
1991 */ |
|
1992 |
|
1993 /** |
|
1994 @SYMTestCaseID GRAPHICS-FBSERV-0506 |
|
1995 |
|
1996 @SYMDEF INC103815 |
|
1997 |
|
1998 @SYMTestCaseDesc Tests that the value returned by CFbsBitmap::Handle() |
|
1999 does not change after resizing or compression |
|
2000 |
|
2001 @SYMTestPriority High |
|
2002 |
|
2003 @SYMTestType UT |
|
2004 |
|
2005 @SYMTestStatus Implemented |
|
2006 |
|
2007 @SYMTestActions 1. Create a bitmap and store its handle number |
|
2008 2. Resize the bitmap and compare its handle number with the stored value |
|
2009 3. Compress the bitmap and compare its handle number with the stored value |
|
2010 |
|
2011 @SYMTestExpectedResults All the handle numbers returned should be the same |
|
2012 */ |
|
2013 void CTFbs::TestBitmapHandleImmutable() |
|
2014 { |
|
2015 INFO_PRINTF1(_L("Test fix for INC103815")); |
|
2016 CFbsBitmap *bmp = new CFbsBitmap; |
|
2017 TEST(bmp != NULL); |
|
2018 if (bmp == NULL) |
|
2019 return; |
|
2020 TEST(bmp->Create(TSize(200, 200), EColor256) == KErrNone); |
|
2021 TInt handle = bmp->Handle(); |
|
2022 TEST(bmp->Resize(TSize(400, 400)) == KErrNone); |
|
2023 TEST(handle == bmp->Handle()); |
|
2024 TEST(bmp->Compress() == KErrNone); |
|
2025 TEST(handle == bmp->Handle()); |
|
2026 delete bmp; |
|
2027 } |
|
2028 |
|
2029 |
|
2030 /** |
|
2031 @SYMTestCaseID GRAPHICS-FBSERV-0507 |
|
2032 @SYMTestPriority High |
|
2033 @SYMTestType UT |
|
2034 @SYMTestStatus Implemented |
|
2035 @SYMDEF PDEF102570 |
|
2036 |
|
2037 @SYMTestCaseDesc |
|
2038 Tests that the attributes and the data address of a bitmap do not change between |
|
2039 calls to CFbsBitmap::BeginDataAccess() and CFbsBitmap::EndDataAccess() due to resizing |
|
2040 or compression by other clients |
|
2041 |
|
2042 @SYMTestActions |
|
2043 1: Create a bitmap and a second CFbsBitmap object that refers to the same bitmap. |
|
2044 2: Call BeginDataAccess() on the first CFbsBitmap object. |
|
2045 3: Call Resize() on the second CFbsBitmap object. |
|
2046 4: Call EndDataAccess() on the first CFbsBitmap object checking its state before and after. |
|
2047 5: Call BeginDataAccess() on the first CFbsBitmap object. |
|
2048 6: Call Compress() on the second CFbsBitmap object. |
|
2049 7: Call EndDataAccess() on the first CFbsBitmap object checking its state before and after. |
|
2050 |
|
2051 @SYMTestExpectedResults |
|
2052 The affected attributes and the data address of the bitmap should change only |
|
2053 after the calls to EndDataAccess() |
|
2054 */ |
|
2055 void CTFbs::TestBitmapBeginEnd() |
|
2056 { |
|
2057 INFO_PRINTF1(_L("Test CFbsBitmap::BeginDataAccess()-EndDataAccess()")); |
|
2058 CFbsBitmap *bmp1 = new CFbsBitmap; |
|
2059 CFbsBitmap *bmp2 = new CFbsBitmap; |
|
2060 TEST(bmp1 != NULL && bmp2 != NULL); |
|
2061 if (bmp1 == NULL || bmp2 == NULL) |
|
2062 return; |
|
2063 TEST(bmp1->Create(TSize(200, 200), EColor256) == KErrNone); |
|
2064 TEST(bmp2->Duplicate(bmp1->Handle()) == KErrNone); |
|
2065 TUint32* dataAddress1 = bmp1->DataAddress(); |
|
2066 TUint32* dataAddress2 = bmp2->DataAddress(); |
|
2067 TEST(dataAddress1 == dataAddress2); |
|
2068 bmp1->BeginDataAccess(); |
|
2069 TEST(bmp2->Resize(TSize(400, 400)) == KErrNone); |
|
2070 dataAddress2 = bmp2->DataAddress(); |
|
2071 TEST(bmp1->SizeInPixels() == TSize(200, 200)); |
|
2072 TEST(bmp1->DataAddress() == dataAddress1); |
|
2073 bmp1->EndDataAccess(); |
|
2074 TEST(bmp1->SizeInPixels() == TSize(400, 400)); |
|
2075 dataAddress1 = bmp1->DataAddress(); |
|
2076 TEST(dataAddress1 == dataAddress2); |
|
2077 bmp1->BeginDataAccess(); |
|
2078 TEST(bmp2->Compress() == KErrNone); |
|
2079 dataAddress2 = bmp2->DataAddress(); |
|
2080 TEST(bmp1->Header().iCompression == ENoBitmapCompression); |
|
2081 TEST(bmp1->DataAddress() == dataAddress1); |
|
2082 bmp1->EndDataAccess(); |
|
2083 TEST(bmp1->Header().iCompression != ENoBitmapCompression); |
|
2084 dataAddress1 = bmp1->DataAddress(); |
|
2085 TEST(dataAddress1 == dataAddress2); |
|
2086 delete bmp1; |
|
2087 delete bmp2; |
|
2088 } |
|
2089 |
|
2090 |
|
2091 /** |
|
2092 @SYMTestCaseID GRAPHICS-FBSERV-0508 |
|
2093 @SYMTestPriority High |
|
2094 @SYMTestType UT |
|
2095 @SYMTestStatus Implemented |
|
2096 @SYMDEF DEF104752 |
|
2097 |
|
2098 @SYMTestCaseDesc |
|
2099 Tests that trying to launch a second instance of FBServ fails gracefully |
|
2100 |
|
2101 @SYMTestActions |
|
2102 Start a new instance of FBSERV.EXE. Since the Font and Bitmap Server should |
|
2103 already be running, the created process should panic immediately. |
|
2104 |
|
2105 @SYMTestExpectedResults |
|
2106 Panic FBSERV 5 |
|
2107 */ |
|
2108 void CTFbs::TestSingletonServer() |
|
2109 { |
|
2110 INFO_PRINTF1(_L("Test singleton FBServ process")); |
|
2111 _LIT(KFBSERVServerExe, "z:\\sys\\bin\\fbserv.exe"); |
|
2112 RProcess fbs; |
|
2113 TInt ret = fbs.Create(KFBSERVServerExe, KNullDesC); |
|
2114 #ifdef __WINS__ |
|
2115 // On the emulator it's not possible to load the same EXEXP twice |
|
2116 // DWin32CodeSeg::DoCreate() returns KErrAlreadyExists in that case |
|
2117 if (ret == KErrAlreadyExists) |
|
2118 return; |
|
2119 #endif |
|
2120 TEST(ret == KErrNone); |
|
2121 TRequestStatus status; |
|
2122 fbs.Logon(status); |
|
2123 TEST(status == KRequestPending); |
|
2124 fbs.Resume(); |
|
2125 User::WaitForRequest(status); |
|
2126 TExitType exitType = fbs.ExitType(); |
|
2127 TExitCategoryName exitCategory = fbs.ExitCategory(); |
|
2128 TInt exitReason = fbs.ExitReason(); |
|
2129 TEST(exitType == EExitPanic); |
|
2130 TEST(exitCategory == KFBSERVPanicCategory); |
|
2131 TEST(exitReason == EFbsPanicStartupFailed); |
|
2132 fbs.Close(); |
|
2133 } |
|
2134 |
|
2135 /** |
|
2136 @SYMTestCaseID GRAPHICS-FBSERV-0620 |
|
2137 @SYMTestPriority High |
|
2138 @SYMTestStatus Implemented |
|
2139 @SYMDEF DEF140138 |
|
2140 |
|
2141 @SYMTestCaseDesc |
|
2142 A positive test that shows in cases where the font glyph cache is full and the |
|
2143 session cache becomes used, client-side CFbsFont calls that query the session cache |
|
2144 successfully find the glyph, proving that the session handles used client-side and server-side |
|
2145 are the same, thereby avoiding any unneccessary IPC calls. |
|
2146 |
|
2147 @SYMTestActions |
|
2148 Create a large font which consumes a lot of memory. |
|
2149 Create a CFbsBitGc and a CFbsBitmap target. |
|
2150 Use the CFbsBitGc to render some text, thereby filling the font glyph cache. |
|
2151 Renders enough glyphs to fill up the font glyph cache, so that the session cache is used |
|
2152 for later characters. |
|
2153 Call CBitmapFont::CharacterNeedsToBeRasterized() with a NULL session handle. |
|
2154 Call CBitmapFont::CharacterNeedsToBeRasterized() with the RFbsSession handle. |
|
2155 Call CFbsFont::GetCharacterData() to retrieve a pointer to the bitmap data. Compare this with the data |
|
2156 returned from CBitmapFont::GetCharacterData(). |
|
2157 |
|
2158 @SYMTestExpectedResults |
|
2159 When using KNullHandle, CharacterNeedsToBeRasterized() with the first character, is expected to pass |
|
2160 proving that the font cache is working as expected when glyphs can fit into it. |
|
2161 When using KNullHandle, CharacterNeedsToBeRasterized() with the last character, it expected to fail, |
|
2162 proving that the glyph has not been cached in the font glyph cache. (If it had, it would find a |
|
2163 match regardless of the session handle as it looks in the font cache before the session cache). |
|
2164 When using the correct session handle with CharacterNeedsToBeRasterized() with the last character, |
|
2165 should return ETrue, proving that the glyph has been cached, and was found because the correct |
|
2166 session handle was supplied, therefore must be in the session cache. |
|
2167 The bitmap pointers returned by CFbsFont::GetCharacterData() and CBitmapFont::GetCharacterData() should match, |
|
2168 proving the public API CFbsFont::GetCharacterData() is correctly using the data stored in the session cache, |
|
2169 and not returning the data of a separately-rasterized glyph. |
|
2170 */ |
|
2171 void CTFbs::TestFontSessionCacheLookupL() |
|
2172 { |
|
2173 INFO_PRINTF1(_L("Test Font Session-cache Lookup")); |
|
2174 |
|
2175 User::LeaveIfError(RFbsSession::Connect()); |
|
2176 RFbsSession* fbsSession = RFbsSession::GetSession(); |
|
2177 CFbsTypefaceStore* ts = CFbsTypefaceStore::NewL(NULL); |
|
2178 CleanupStack::PushL(ts); |
|
2179 |
|
2180 TFontSpec fs(_L("DejaVu Sans Mono"), 80); |
|
2181 fs.iFontStyle.SetBitmapType(EAntiAliasedGlyphBitmap); |
|
2182 CFbsFont* font = NULL; |
|
2183 TEST(KErrNone == ts->GetNearestFontToDesignHeightInPixels((CFont*&)font, fs)); |
|
2184 |
|
2185 CFbsBitmap* target = new (ELeave) CFbsBitmap; |
|
2186 CleanupStack::PushL(target); |
|
2187 User::LeaveIfError(target->Create(TSize(100, 100), EColor16MU)); |
|
2188 CFbsBitmapDevice* bgDevice = CFbsBitmapDevice::NewL(target); |
|
2189 CleanupStack::PushL(bgDevice); |
|
2190 CFbsBitGc* bgGc = NULL; |
|
2191 User::LeaveIfError(bgDevice->CreateContext(bgGc)); |
|
2192 bgGc->UseFont(font); |
|
2193 CleanupStack::PushL(bgGc); |
|
2194 _LIT(KTestText, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJLKMNOPQRSTUVWXYZ"); |
|
2195 |
|
2196 // Draw the text, forcing the glyphs into the font and session caches. |
|
2197 bgGc->DrawText(KTestText, TPoint(0, 10)); |
|
2198 |
|
2199 CBitmapFont* bmFont = CTFbsFont::FontAddress(font); |
|
2200 |
|
2201 // Check that the first character in KTestText has been rasterized, and is in the font cache. |
|
2202 TBool glyphIsInFontCache = !bmFont->CharacterNeedsToBeRasterized(KNullHandle, KTestText()[0]); |
|
2203 TEST(glyphIsInFontCache); |
|
2204 |
|
2205 // Check that the last character in KTestText has been rasterized, and is not in the font cache |
|
2206 // because it did not fit, therefore it should be in the session cache. |
|
2207 const TChar KTestChar = KTestText()[KTestText().Length() - 1]; |
|
2208 glyphIsInFontCache = !bmFont->CharacterNeedsToBeRasterized(KNullHandle, KTestChar); |
|
2209 TEST(!glyphIsInFontCache); |
|
2210 TBool glyphIsInSessionCache = !bmFont->CharacterNeedsToBeRasterized(fbsSession->iHelper->iServerSessionHandle, KTestChar); |
|
2211 TEST(glyphIsInSessionCache); |
|
2212 |
|
2213 // Test that when calling GetCharacterData() on CFbsFont, it returns the same rasterized data as |
|
2214 // the bitmap in the session cache, proving that the client API is using the session cache handle correctly. |
|
2215 TSize bitmapSize; |
|
2216 const TUint8* bitmapDataClient; |
|
2217 const TUint8* bitmapDataSessionCache; |
|
2218 TOpenFontCharMetrics metrics; |
|
2219 font->GetCharacterData(KTestChar,metrics,bitmapDataClient,bitmapSize); |
|
2220 bmFont->GetCharacterData(fbsSession->iHelper->iServerSessionHandle, KTestChar, metrics, bitmapDataSessionCache); |
|
2221 TEST(bitmapDataClient != NULL && bitmapDataClient == bitmapDataSessionCache); |
|
2222 |
|
2223 bgGc->DiscardFont(); |
|
2224 CleanupStack::PopAndDestroy(4); // bgGc, bgDevice, target, ts |
|
2225 RFbsSession::Disconnect(); |
|
2226 } |
|
2227 |
|
2228 /** |
|
2229 @SYMTestCaseID GRAPHICS-FBSERV-0650 |
|
2230 @SYMTestPriority High |
|
2231 @SYMTestStatus Implemented |
|
2232 @SYMDEF DEF141816 |
|
2233 |
|
2234 @SYMTestCaseDesc |
|
2235 A negative test that shows that IPC calls from CFbsBitmap which uses a |
|
2236 CFbsFont handle fail and that IPC calls from CFbsFont which use a |
|
2237 CFbsBitmap handle fail. |
|
2238 |
|
2239 @SYMTestActions |
|
2240 i. Create a bitmap. |
|
2241 ii. Create a font. |
|
2242 iii. Send a bitmap-related IPC message to server with bitmap handle. |
|
2243 iv. Send a bitmap-related IPC message to server with font handle. |
|
2244 v. Send a font-related IPC message to server with font handle. |
|
2245 vi. In a separate thread, send a font-related IPC message to server with |
|
2246 bitmap handle. |
|
2247 |
|
2248 @SYMTestExpectedResults |
|
2249 Steps iii. and v. should return KErrNone. |
|
2250 Step iv. should return KErrUnknown. |
|
2251 Step vi. should panic with FBSERV -6. |
|
2252 */ |
|
2253 void CTFbs::TestInvalidHandlesInIpcCallsL() |
|
2254 { |
|
2255 INFO_PRINTF1(_L("Test Bitmap and Font IPC calls with invalid handles")); |
|
2256 CFbsFontEx* font = SelectFont(); |
|
2257 |
|
2258 CFbsBitmapEx* bmp = new(ELeave) CFbsBitmapEx(); |
|
2259 TEST(KErrNone == bmp->Create(TSize(1,1),EGray2)); |
|
2260 |
|
2261 TInt fontHandle = font->FontHandle(); |
|
2262 TInt bitmapHandle = bmp->BitmapHandle(); |
|
2263 |
|
2264 // Send a IPC command to resize a bitmap with a font handle |
|
2265 TPckgBuf<TBmpHandles> handlebuf; |
|
2266 TIpcArgs args1(fontHandle, 2, 2, &handlebuf); |
|
2267 // Send a IPC command to resize a bitmap with the bitmap's handle |
|
2268 TEST(KErrNone == iFbs->SendCommand(EFbsMessBitmapBgCompress, bitmapHandle)); |
|
2269 // Send a IPC command to resize a bitmap with the font's handle |
|
2270 TEST(KErrUnknown == iFbs->SendCommand(EFbsMessBitmapBgCompress, fontHandle)); |
|
2271 |
|
2272 // Send a IPC command to set the font's height with the font's handle |
|
2273 TEST(KErrNone == iFbs->SendCommand(EFbsMessSetTwipsHeight, fontHandle, 49)); |
|
2274 // In a second thread, send a IPC command to set the font's height with the |
|
2275 // bitmap's handle. Should panic with FBServ -6. |
|
2276 TFbsTestThreadInfo threadInfo = {EFbsSecondThreadInvalidHandleInIpcCall}; |
|
2277 TExitCategoryName exitCategoryName(KFbsPanicCategory); |
|
2278 _LIT(KTestName, "TestInvalidHandlesInIpcCall"); |
|
2279 CreateSecondThreadAndCheckPanicL(threadInfo, -6, exitCategoryName, KTestName); |
|
2280 |
|
2281 iTs->ReleaseFont(font); |
|
2282 delete bmp; |
|
2283 } |
|
2284 |
|
2285 /** |
|
2286 Creates a second thread and do some panic tests in it. |
|
2287 @param aTestInfo The information for the tests |
|
2288 @param aPanicCode The expected panic code |
|
2289 @param aExitCategory The expected panic category |
|
2290 @param aThreadName The name of the new thread |
|
2291 @leave Gets system wide error code |
|
2292 */ |
|
2293 void CTFbs::CreateSecondThreadAndCheckPanicL(TFbsTestThreadInfo& aTestInfo, TInt aPanicCode, TExitCategoryName aExitCategory, const TDesC &aThreadName) |
|
2294 { |
|
2295 RThread secondThread; |
|
2296 User::LeaveIfError(secondThread.Create(aThreadName, SecondThreadStart, KDefaultStackSize, 0x1000, 0x1000, &aTestInfo)); |
|
2297 // Launch second thread |
|
2298 TRequestStatus statusSecondThread; |
|
2299 secondThread.Logon(statusSecondThread); |
|
2300 secondThread.SetPriority(EPriorityLess); |
|
2301 secondThread.Resume(); |
|
2302 |
|
2303 User::WaitForRequest(statusSecondThread); |
|
2304 |
|
2305 if(EExitPanic != secondThread.ExitType()) |
|
2306 { |
|
2307 ERR_PRINTF3(_L("Expected exit type: %d, Actual exit type: %d"), EExitPanic, secondThread.ExitType()); |
|
2308 TEST(EFalse); |
|
2309 } |
|
2310 |
|
2311 if(aPanicCode != secondThread.ExitReason()) |
|
2312 { |
|
2313 ERR_PRINTF3(_L("Expected panic code: %d, Actual panic code: %d"), aPanicCode, secondThread.ExitReason()); |
|
2314 TEST(EFalse); |
|
2315 } |
|
2316 |
|
2317 TExitCategoryName secondThreadExitCategory = secondThread.ExitCategory(); |
|
2318 if(aExitCategory != secondThreadExitCategory) |
|
2319 { |
|
2320 ERR_PRINTF3(_L("Expected panic category: %S, Actual panic category: %S"), &aExitCategory, &secondThreadExitCategory); |
|
2321 TEST(EFalse); |
|
2322 } |
|
2323 |
|
2324 //Close the handle |
|
2325 secondThread.Close(); |
|
2326 } |
|
2327 |
|
2328 /** |
|
2329 Second thread entry function. |
|
2330 */ |
|
2331 TInt CTFbs::SecondThreadStart(TAny* aTestInfo) |
|
2332 { |
|
2333 |
|
2334 __UHEAP_MARK; |
|
2335 TInt procHandles1 =0; |
|
2336 TInt threadHandles1=0; |
|
2337 RThread().HandleCount(procHandles1, threadHandles1); |
|
2338 CTrapCleanup* cleanupStack = CTrapCleanup::New(); |
|
2339 |
|
2340 if (!cleanupStack) |
|
2341 { |
|
2342 __UHEAP_MARKEND; |
|
2343 return KErrNoMemory; |
|
2344 } |
|
2345 |
|
2346 TInt result = KErrNone; |
|
2347 TRAP(result, SecondThreadMainL(static_cast<TFbsTestThreadInfo*>(aTestInfo))); |
|
2348 |
|
2349 delete cleanupStack; |
|
2350 |
|
2351 TInt procHandles2 =0; |
|
2352 TInt threadHandles2=0; |
|
2353 RThread().HandleCount(procHandles2,threadHandles2); |
|
2354 if (threadHandles1 != threadHandles2) |
|
2355 { |
|
2356 result = KErrGeneral; // Thread-owned handles not closed |
|
2357 } |
|
2358 __UHEAP_MARKEND; |
|
2359 |
|
2360 return result; |
|
2361 } |
|
2362 |
|
2363 /** |
|
2364 Run the test contained within the TFbsTestThreadInfo object. A new thread is |
|
2365 created for each test and only one of the cases in the switch statements |
|
2366 below will be used. |
|
2367 |
|
2368 @param aTestInfo The parameters for the test |
|
2369 @return One of the system wide error codes or an enumeration of passed tests. |
|
2370 */ |
|
2371 TInt CTFbs::SecondThreadMainL(TFbsTestThreadInfo* aTestInfo) |
|
2372 { |
|
2373 TInt result = 0; |
|
2374 TFbsMultiThreadTestCase testcase = aTestInfo->iTestCase; |
|
2375 |
|
2376 //test cases without the need of an initialised driver |
|
2377 switch (testcase) |
|
2378 { |
|
2379 case EFbsSecondThreadInvalidHandleInIpcCall: |
|
2380 result = SecondThreadPanicInvalidHandleInIpcCall(); |
|
2381 break; |
|
2382 } |
|
2383 return result; |
|
2384 } |
|
2385 |
|
2386 /** |
|
2387 Implementation of SecondThread test EFbsSecondThreadInvalidHandleInIpcCall |
|
2388 |
|
2389 @panic FBSERV -6 If the test is successful |
|
2390 |
|
2391 @return One of the system wide error codes. |
|
2392 */ |
|
2393 TInt CTFbs::SecondThreadPanicInvalidHandleInIpcCall() |
|
2394 { |
|
2395 TInt result = RFbsSession::Connect(); |
|
2396 if (KErrNone != result) |
|
2397 { |
|
2398 return result; |
|
2399 } |
|
2400 RFbsSession* fbs = RFbsSession::GetSession(); |
|
2401 CFbsBitmapEx* bmp = new CFbsBitmapEx(); |
|
2402 if (!bmp) |
|
2403 { |
|
2404 return KErrGeneral; |
|
2405 } |
|
2406 result = bmp->Create(TSize(1,1),EGray2); |
|
2407 if(KErrNone != result) |
|
2408 { |
|
2409 delete bmp; |
|
2410 return KErrGeneral; |
|
2411 } |
|
2412 |
|
2413 CFbsTypefaceStore* ts = NULL; |
|
2414 ts = (CFbsTypefaceStore*)CFbsTypefaceStore::NewL(NULL); |
|
2415 if (!ts) |
|
2416 { |
|
2417 delete bmp; |
|
2418 return KErrGeneral; |
|
2419 } |
|
2420 |
|
2421 CFbsFontEx* font=NULL; |
|
2422 result = ts->GetNearestFontToDesignHeightInPixels((CFont*&)font, TFontSpec(KTypefaceName, 15)); |
|
2423 if (!font) |
|
2424 { |
|
2425 delete bmp; |
|
2426 delete ts; |
|
2427 return KErrGeneral; |
|
2428 } |
|
2429 |
|
2430 TInt fontHandle = font->FontHandle(); |
|
2431 TInt bitmapHandle = bmp->BitmapHandle(); |
|
2432 |
|
2433 // Send a IPC command to set twips height of font with a bitmap handle |
|
2434 result = fbs->SendCommand(EFbsMessSetTwipsHeight, bitmapHandle, 49); |
|
2435 |
|
2436 ts->ReleaseFont(font); |
|
2437 delete bmp; |
|
2438 delete ts; |
|
2439 return result; |
|
2440 } |
|
2441 |
|
2442 /** |
|
2443 @SYMTestCaseID GRAPHICS-FBSERV-0619 |
|
2444 @SYMTestPriority High |
|
2445 @SYMTestType UT |
|
2446 @SYMTestStatus Implemented |
|
2447 @SYMDEF EI0014 |
|
2448 |
|
2449 @SYMTestCaseDesc |
|
2450 Tests that there are no virtual function calls to objects in FBServ's shared heap from outside |
|
2451 the FBServ process. Such function calls only work if DLLs are guaranteed to be mapped at the |
|
2452 same logical address in every process. This is not necessarily true for all memory models. |
|
2453 |
|
2454 @SYMTestActions |
|
2455 Selects a font, intercepts the VF table in the corresponding CBitmapFont and COpenFont objects |
|
2456 to record virtual function calls from outside the FBServ process, calls the vulnerable functions |
|
2457 on the created CFbsFont object and releases the font. |
|
2458 |
|
2459 @SYMTestExpectedResults |
|
2460 Number of virtual function calls to CBitmapFont and COpenFont from outside FBServ is 0 |
|
2461 */ |
|
2462 void CTFbs::TestNoVFCallsToGlobalObjects() |
|
2463 { |
|
2464 #ifdef __WINS__ |
|
2465 INFO_PRINTF1(_L("Test no virtual function calls to objects in FBServ's shared heap from outside FBServ process")); |
|
2466 CFbsFontEx* font = SelectFont(); |
|
2467 (void)font->TypeUid(); |
|
2468 (void)font->HeightInPixels(); |
|
2469 (void)font->AscentInPixels(); |
|
2470 (void)font->DescentInPixels(); |
|
2471 (void)font->CharWidthInPixels('A'); |
|
2472 (void)font->TextWidthInPixels(_L("A")); |
|
2473 (void)font->BaselineOffsetInPixels(); |
|
2474 (void)font->TextCount(_L("A"), 10); |
|
2475 TInt excess; |
|
2476 (void)font->TextCount(_L("A"), 10, excess); |
|
2477 (void)font->MaxCharWidthInPixels(); |
|
2478 (void)font->MaxNormalCharWidthInPixels(); |
|
2479 (void)font->FontSpecInTwips(); |
|
2480 TOpenFontCharMetrics metrics; |
|
2481 const TUint8* bitmap; |
|
2482 TSize size; |
|
2483 (void)font->GetCharacterData('A', metrics, bitmap, size); |
|
2484 CFont::TPositionParam param; |
|
2485 param.iText.Set(_L("A")); |
|
2486 (void)font->GetCharacterPosition(param); |
|
2487 (void)font->FontCapitalAscent(); |
|
2488 (void)font->FontMaxAscent(); |
|
2489 (void)font->FontStandardDescent(); |
|
2490 (void)font->FontMaxDescent(); |
|
2491 (void)font->FontLineGap(); |
|
2492 iTs->ReleaseFont(font); |
|
2493 TEST(iFontCallCounter.iVFCallsOutsideFBServ == 0); |
|
2494 TEST(iOpenFontCallCounter.iVFCallsOutsideFBServ == 0); |
|
2495 #else |
|
2496 INFO_PRINTF1(_L("Test no virtual function calls to objects in FBServ's shared heap from outside FBServ process - skipped on target")); |
|
2497 #endif |
|
2498 } |
|
2499 |
|
2500 //-------------- |
|
2501 __CONSTRUCT_STEP__(Fbs) |