1 #ifndef __DALI_TEST_PLATFORM_ABSTRACTION_H__
2 #define __DALI_TEST_PLATFORM_ABSTRACTION_H__
5 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
7 // Licensed under the Flora License, Version 1.0 (the License);
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://floralicense.org/license/
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an AS IS BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
26 #include <dali/integration-api/platform-abstraction.h>
28 #include <dali/integration-api/glyph-set.h>
29 #include <test-trace-call-stack.h>
35 * Concrete implementation of the platform abstraction class.
37 class DALI_IMPORT_API TestPlatformAbstraction : public Dali::Integration::PlatformAbstraction
45 Integration::ResourceId loadedId;
46 Integration::ResourceTypeId loadedType;
47 Integration::ResourcePointer loadedResource;
50 Integration::ResourceId loadFailedId;
51 Integration::ResourceFailure loadFailure;
54 Integration::ResourceId savedId;
55 Integration::ResourceTypeId savedType;
58 Integration::ResourceId saveFailedId;
59 Integration::ResourceFailure saveFailure;
71 std::vector< unsigned char> buffer;
78 TestPlatformAbstraction() : mRequest(0)
86 virtual ~TestPlatformAbstraction()
91 * @copydoc PlatformAbstraction::GetTimeMicroseconds()
93 virtual void GetTimeMicroseconds(unsigned int &seconds, unsigned int µSeconds)
96 microSeconds = mMicroSeconds;
97 mTrace.PushCall("GetTimeMicroseconds", "");
101 * @copydoc PlatformAbstraction::Suspend()
103 virtual void Suspend()
105 mTrace.PushCall("Suspend", "");
109 * @copydoc PlatformAbstraction::Resume()
111 virtual void Resume()
113 mTrace.PushCall("Resume", "");
116 virtual void GetClosestImageSize( const std::string& filename,
117 const ImageAttributes& attributes,
118 Vector2& closestSize)
120 closestSize = mClosestSize;
121 mTrace.PushCall("GetClosestImageSize", "");
124 virtual void GetClosestImageSize( Integration::ResourcePointer resourceBuffer,
125 const ImageAttributes& attributes,
126 Vector2& closestSize)
128 closestSize = mClosestSize;
129 mTrace.PushCall("GetClosestImageSize", "");
134 * @copydoc PlatformAbstraction::LoadResource()
136 virtual void LoadResource(const Integration::ResourceRequest& request)
138 mTrace.PushCall("LoadResource", "");
142 tet_infoline ("Warning: multiple resource requests not handled by Test Suite. You may see unexpected errors");
144 mRequest = new Integration::ResourceRequest(request);
148 * @copydoc PlatformAbstraction::SaveResource()
150 virtual void SaveResource(const Integration::ResourceRequest& request)
152 mTrace.PushCall("SaveResource", "");
156 tet_infoline ("Warning: multiple resource requests not handled by Test Suite. You may see unexpected errors");
158 mRequest = new Integration::ResourceRequest(request);
162 * @copydoc PlatformAbstraction::CancelLoad()
164 virtual void CancelLoad(Integration::ResourceId id, Integration::ResourceTypeId typeId)
166 mTrace.PushCall("CancelLoad", "");
170 * @copydoc PlatformAbstraction::GetResources()
172 virtual void GetResources(Integration::ResourceCache& cache)
174 mTrace.PushCall("GetResources", "");
176 if(mResources.loaded)
178 cache.LoadResponse( mResources.loadedId, mResources.loadedType, mResources.loadedResource, Integration::RESOURCE_COMPLETELY_LOADED );
180 if(mResources.loadFailed)
182 cache.LoadFailed( mResources.loadFailedId, mResources.loadFailure );
186 cache.SaveComplete( mResources.savedId, mResources.savedType );
188 if(mResources.saveFailed)
190 cache.SaveFailed( mResources.saveFailedId, mResources.saveFailure );
195 * @copydoc PlatformAbstraction::IsLoading()
197 virtual bool IsLoading()
199 mTrace.PushCall("IsLoading", "");
200 return mIsLoadingResult;
204 * @copydoc PlatformAbstraction::GetDefaultFontFamily()
206 virtual std::string GetDefaultFontFamily() const
208 mTrace.PushCall("GetDefaultFontFamily", "");
209 return mGetDefaultFontFamilyResult;
213 * @copydoc PlatformAbstraction::GetDefaultFontSize()
215 virtual const float GetDefaultFontSize() const
217 mTrace.PushCall("GetDefaultFontSize", "");
218 return mGetDefaultFontSizeResult;
221 virtual const PixelSize GetFontLineHeightFromCapsHeight(const std::string fontFamily, const std::string& fontStyle, const CapsHeight& capsHeight) const
223 mTrace.PushCall("GetFontLineHeightFromCapsHeight", "");
224 // LineHeight will be bigger than CapsHeight, so return capsHeight + 1
225 return PixelSize(capsHeight + 1);
229 * @copydoc PlatformAbstraction::GetGlyphData()
232 virtual Integration::GlyphSet* GetGlyphData ( const Integration::TextResourceType& textRequest,
233 const std::string& fontFamily,
234 bool getBitmap) const
238 mTrace.PushCall("GetGlyphData", "getBitmap:true");
242 mTrace.PushCall("GetGlyphData", "getBitmap:false");
245 // It creates fake metrics for the received characters.
247 Integration::GlyphSet* set = new Dali::Integration::GlyphSet();
248 Integration::BitmapPtr bitmapData;
250 std::set<uint32_t> characters;
252 for( Integration::TextResourceType::CharacterList::const_iterator it = textRequest.mCharacterList.begin(), endIt = textRequest.mCharacterList.end(); it != endIt; ++it )
254 if( characters.find( it->character ) == characters.end() )
256 characters.insert( it->character );
257 Integration::GlyphMetrics character = {it->character, Integration::GlyphMetrics::LOW_QUALITY, 10.0f, 10.0f, 9.0f, 1.0f, 10.0f, it->xPosition, it->yPosition };
261 bitmapData = Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true);
262 bitmapData->GetPackedPixelsProfile()->ReserveBuffer(Pixel::A8, 64, 64);
263 PixelBuffer* pixelBuffer = bitmapData->GetBuffer();
264 memset( pixelBuffer, it->character, 64*64 );
267 set->AddCharacter(bitmapData, character);
271 set->mLineHeight = 10.0f;
272 set->mAscender = 9.0f;
273 set->mUnitsPerEM = 2048.0f/64.0f;
274 set->SetAtlasResourceId( textRequest.mTextureAtlasId );
275 set->mFontHash = textRequest.mFontHash;
281 * @copydoc PlatformAbstraction::GetCachedGlyphData()
284 virtual Integration::GlyphSet* GetCachedGlyphData( const Integration::TextResourceType& textRequest,
285 const std::string& fontFamily ) const
287 mTrace.PushCall("GetCachedGlyphData", "");
289 // It creates fake metrics and bitmap for received numeric characters '0' through '9'.
290 Integration::GlyphSet* set = new Dali::Integration::GlyphSet();
291 Integration::BitmapPtr bitmapData;
293 std::set<uint32_t> characters;
295 for( Integration::TextResourceType::CharacterList::const_iterator it = textRequest.mCharacterList.begin(), endIt = textRequest.mCharacterList.end(); it != endIt; ++it )
297 if( it->character >= '0' && it->character <= '9' && characters.find( it->character ) == characters.end() )
299 characters.insert( it->character );
300 Integration::GlyphMetrics character = {it->character, Integration::GlyphMetrics::HIGH_QUALITY, 10.0f, 10.0f, 9.0f, 1.0f, 10.0f, it->xPosition, it->yPosition };
302 bitmapData = Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true);
303 bitmapData->GetPackedPixelsProfile()->ReserveBuffer(Pixel::A8, 64, 64);
304 PixelBuffer* pixelBuffer = bitmapData->GetBuffer();
305 memset( pixelBuffer, it->character, 64*64 );
306 set->AddCharacter(bitmapData, character);
310 set->mLineHeight = 10.0f;
311 set->mAscender = 9.0f;
312 set->mUnitsPerEM = 2048.0f/64.0f;
313 set->SetAtlasResourceId( textRequest.mTextureAtlasId );
314 set->mFontHash = textRequest.mFontHash;
321 * @copydoc PlatformAbstraction::GetGlobalMetrics()
323 virtual void GetGlobalMetrics( const std::string& fontFamily,
324 const std::string& fontStyle,
325 Integration::GlobalMetrics& globalMetrics ) const
327 globalMetrics.lineHeight = 10.0f;
328 globalMetrics.ascender = 9.0f;
329 globalMetrics.unitsPerEM = 2048.0f/64.0f;
330 globalMetrics.underlineThickness = 2.f;
331 globalMetrics.underlinePosition = 1.f;
335 * @copydoc PlatformAbstraction::GetFontPath()
337 virtual std::string GetFontPath(const std::string& family, bool bold, bool italic) const
339 mTrace.PushCall("GetFontPath", "");
340 return mGetFontPathResult;
342 // Do nothing with arguments
346 * @copydoc PlatformAbstraction::SetDpi()
348 virtual void SetDpi (unsigned int dpiHorizontal, unsigned int dpiVertical)
350 mTrace.PushCall("SetDpi", "");
354 * @copydoc PlatformAbstraction::GetFontFamilyForChars()
356 virtual std::string GetFontFamilyForChars(const TextArray& charsRequested) const
358 mTrace.PushCall("GetFontFamilyForChars", "");
359 return mGetDefaultFontFamilyResult;
363 * @copydoc PlatformAbstraction::AllGlyphsSupported()
365 virtual bool AllGlyphsSupported(const std::string& name, const std::string& fontStyle, const TextArray& text) const
367 mTrace.PushCall("AllGlyphsSupported", "");
372 * @copydoc PlatformAbstraction::ValidateFontFamilyName()
374 virtual bool ValidateFontFamilyName(const std::string& fontFamily, const std::string& fontStyle, bool& isDefaultSystemFont, std::string& closestMatch, std::string& closestStyleMatch) const
376 mTrace.PushCall("ValidateFontFamilyName", "");
381 * @copydoc PlatformAbstraction::GetFontList()
383 virtual std::vector<std::string> GetFontList( FontListMode mode ) const
385 mFontListMode = mode;
386 mTrace.PushCall("ValidateGetFontList", "");
387 std::vector<std::string> fontList;
392 * @copydoc PlatformAbstraction::LoadFile()
394 virtual bool LoadFile( const std::string& filename, std::vector< unsigned char >& buffer ) const
396 mTrace.PushCall("LoadFile", "");
397 if( mLoadFileResult.loadResult )
399 buffer = mLoadFileResult.buffer;
402 return mLoadFileResult.loadResult;
406 * @copydoc PlatformAbstraction::SaveFile()
408 virtual bool SaveFile(const std::string& filename, std::vector< unsigned char >& buffer) const
410 mTrace.PushCall("SaveFile", "");
414 virtual void JoinLoaderThreads()
416 mTrace.PushCall("JoinLoaderThreads", "");
419 virtual void UpdateDefaultsFromDevice()
421 mTrace.PushCall("UpdateDefaultsFromDevice", "");
422 mGetDefaultFontFamilyResult+=1.0f;
425 virtual Integration::DynamicsFactory* GetDynamicsFactory()
427 mTrace.PushCall("GetDynamicsFactory", "");
431 virtual bool ReadGlobalMetricsFromCache( const std::string& fontFamily,
432 const std::string& fontStyle,
433 Integration::GlobalMetrics& globalMetrics )
435 mTrace.PushCall("ReadGlobalMetricsFromCacheFile", "");
436 globalMetrics = mReadGlobalMetrics; // Want to copy contents...
437 return mReadGlobalMetricsResult; // Default false (will be set to true on subsequent write)
440 virtual void WriteGlobalMetricsToCache( const std::string& fontFamily,
441 const std::string& fontStyle,
442 const Integration::GlobalMetrics& globalMetrics )
444 // Copy so next read uses written values. TODO: Could add method
445 // to turn this behaviour off for more extensive testing.
446 mReadGlobalMetrics = globalMetrics;
447 mReadGlobalMetricsResult = true;
449 mTrace.PushCall("WriteGlobalMetricsToCacheFile", "");
452 virtual bool ReadMetricsFromCache( const std::string& fontFamily,
453 const std::string& fontStyle,
454 std::vector<Integration::GlyphMetrics>& glyphMetricsContainer )
456 mTrace.PushCall("ReadMetricsFromCacheFile", "");
457 glyphMetricsContainer = mReadMetrics;
458 return mReadMetricsResult; // Default false (will be set to true on subsequent write)
461 virtual void WriteMetricsToCache( const std::string& fontFamily,
462 const std::string& fontStyle,
463 const Integration::GlyphSet& glyphSet )
465 // Copy so next read uses written values. TODO: Could add method
466 // to turn this behaviour off for more extensive testing.
467 const Integration::GlyphSet::CharacterList& charList = glyphSet.GetCharacterList();
468 mReadMetrics.clear();
469 for(std::size_t i=0, end=charList.size(); i<end; ++i)
471 mReadMetrics.push_back(charList[i].second);
473 mReadMetricsResult = true;
475 mTrace.PushCall("WriteMetricsToCacheFile", "");
478 public: // TEST FUNCTIONS
480 // Enumeration of Platform Abstraction methods
483 GetTimeMicrosecondsFunc,
493 GetDefaultFontFamilyFunc,
494 GetDefaultFontSizeFunc,
495 GetFontLineHeightFromCapsHeightFunc,
497 GetCachedGlyphDataFunc,
500 JoinLoaderThreadsFunc,
501 GetFontFamilyForCharsFunc,
502 AllGlyphsSupportedFunc,
503 ValidateFontFamilyNameFunc,
504 UpdateDefaultsFromDeviceFunc,
505 GetDynamicsFactoryFunc,
506 ValidateGetFontListFunc,
507 ReadGlobalMetricsFromCacheFileFunc,
508 WriteGlobalMetricsToCacheFileFunc,
509 ReadMetricsFromCacheFileFunc,
510 WriteMetricsToCacheFileFunc,
513 /** Call this every test */
518 memset(&mResources, 0, sizeof(Resources));
519 memset(&mReadGlobalMetrics, 0, sizeof(Integration::GlobalMetrics));
522 mIsLoadingResult=false;
523 mGetDefaultFontFamilyResult = "HelveticaNeue";
524 mGetDefaultFontSizeResult=12.0f;
525 mGetFontPathResult="helvetica-12";
526 mReadMetricsResult=false;
527 mReadGlobalMetricsResult=false;
536 void EnableTrace(bool enable) { mTrace.Enable(enable); }
537 void ResetTrace() { mTrace.Reset(); }
538 TraceCallStack& GetTrace() { return mTrace; }
540 bool WasCalled(TestFuncEnum func)
544 case GetTimeMicrosecondsFunc: return mTrace.FindMethod("GetTimeMicroseconds");
545 case SuspendFunc: return mTrace.FindMethod("Suspend");
546 case ResumeFunc: return mTrace.FindMethod("Resume");
547 case LoadResourceFunc: return mTrace.FindMethod("LoadResource");
548 case SaveResourceFunc: return mTrace.FindMethod("SaveResource");
549 case LoadFileFunc: return mTrace.FindMethod("LoadFile");
550 case SaveFileFunc: return mTrace.FindMethod("SaveFile");
551 case CancelLoadFunc: return mTrace.FindMethod("CancelLoad");
552 case GetResourcesFunc: return mTrace.FindMethod("GetResources");
553 case IsLoadingFunc: return mTrace.FindMethod("IsLoading");
554 case GetDefaultFontFamilyFunc: return mTrace.FindMethod("GetDefaultFontFamily");
555 case GetDefaultFontSizeFunc: return mTrace.FindMethod("GetDefaultFontSize");
556 case GetFontLineHeightFromCapsHeightFunc: return mTrace.FindMethod("GetFontLineHeightFromCapsHeight");
557 case GetGlyphDataFunc: return mTrace.FindMethod("GetGlyphData");
558 case GetCachedGlyphDataFunc: return mTrace.FindMethod("GetCachedGlyphData");
559 case GetFontPathFunc: return mTrace.FindMethod("GetFontPath");
560 case SetDpiFunc: return mTrace.FindMethod("SetDpi");
561 case JoinLoaderThreadsFunc: return mTrace.FindMethod("JoinLoaderThreads");
562 case GetFontFamilyForCharsFunc: return mTrace.FindMethod("GetFontFamilyForChars");
563 case AllGlyphsSupportedFunc: return mTrace.FindMethod("AllGlyphsSupported");
564 case ValidateFontFamilyNameFunc: return mTrace.FindMethod("ValidateFontFamilyName");
565 case UpdateDefaultsFromDeviceFunc: return mTrace.FindMethod("UpdateDefaultsFromDevice");
566 case GetDynamicsFactoryFunc: return mTrace.FindMethod("GetDynamicsFactory");
567 case ValidateGetFontListFunc: return mTrace.FindMethod("ValidateGetFontList");
568 case ReadGlobalMetricsFromCacheFileFunc: return mTrace.FindMethod("ReadGlobalMetricsFromCacheFile");
569 case WriteGlobalMetricsToCacheFileFunc: return mTrace.FindMethod("WriteGlobalMetricsToCacheFile");
570 case ReadMetricsFromCacheFileFunc: return mTrace.FindMethod("ReadMetricsFromCacheFile");
571 case WriteMetricsToCacheFileFunc: return mTrace.FindMethod("WriteMetricsToCacheFile");
576 void SetGetTimeMicrosecondsResult(size_t sec, size_t usec)
579 mMicroSeconds = usec;
582 void IncrementGetTimeResult(size_t milliseconds)
584 mMicroSeconds += milliseconds * 1000u;
585 unsigned int additionalSeconds = mMicroSeconds / 1000000u;
587 mSeconds += additionalSeconds;
588 mMicroSeconds -= additionalSeconds * 1000000u;
591 void SetIsLoadingResult(bool result)
593 mIsLoadingResult = result;
596 void SetGetDefaultFontFamilyResult(std::string result)
598 mGetDefaultFontFamilyResult = result;
601 void SetGetDefaultFontSizeResult(float result)
603 mGetDefaultFontSizeResult = result;
606 void SetGetFontPathResult(std::string& result)
608 mGetFontPathResult = result;
611 void ClearReadyResources()
613 memset(&mResources, 0, sizeof(Resources));
616 void SetResourceLoaded(Integration::ResourceId loadedId,
617 Integration::ResourceTypeId loadedType,
618 Integration::ResourcePointer loadedResource)
620 mResources.loaded = true;
621 mResources.loadedId = loadedId;
622 mResources.loadedType = loadedType;
623 mResources.loadedResource = loadedResource;
626 void SetResourceLoadFailed(Integration::ResourceId id,
627 Integration::ResourceFailure failure)
629 mResources.loadFailed = true;
630 mResources.loadFailedId = id;
631 mResources.loadFailure = failure;
634 void SetResourceSaved(Integration::ResourceId savedId,
635 Integration::ResourceTypeId savedType)
637 mResources.saved = true;
638 mResources.savedId = savedId;
639 mResources.savedType = savedType;
642 void SetResourceSaveFailed(Integration::ResourceId id,
643 Integration::ResourceFailure failure)
645 mResources.saveFailed = true;
646 mResources.saveFailedId = id;
647 mResources.saveFailure = failure;
650 Integration::ResourceRequest* GetRequest()
655 void DiscardRequest()
661 void SetClosestImageSize(const Vector2& size)
666 void SetLoadFileResult( bool result, std::vector< unsigned char >& buffer )
668 mLoadFileResult.loadResult = result;
671 mLoadFileResult.buffer = buffer;
675 void SetSaveFileResult( bool result )
677 mSaveFileResult = result;
680 FontListMode GetLastFontListMode( )
682 return mFontListMode;
685 void SetReadGlobalMetricsResult( bool success, Integration::GlobalMetrics& globalMetrics )
687 mReadGlobalMetricsResult = success;
688 mReadGlobalMetrics = globalMetrics;
691 void SetReadMetricsResult( bool success, std::vector<Integration::GlyphMetrics>& glyphMetricsContainer )
693 mReadMetricsResult = success;
694 mReadMetrics = glyphMetricsContainer; // copy
698 mutable TraceCallStack mTrace;
700 size_t mMicroSeconds;
701 bool mIsLoadingResult;
702 std::string mGetDefaultFontFamilyResult;
703 float mGetDefaultFontSizeResult;
704 std::string mGetFontPathResult;
705 Resources mResources;
706 Integration::ResourceRequest* mRequest;
708 Vector2 mClosestSize;
709 bool mReadGlobalMetricsResult;
710 bool mReadMetricsResult;
711 Integration::GlobalMetrics mReadGlobalMetrics;
712 std::vector<Integration::GlyphMetrics> mReadMetrics;
714 LoadFileResult mLoadFileResult;
715 bool mSaveFileResult;
716 mutable FontListMode mFontListMode;
721 #endif /* __DALI_TET_PLATFORM_ABSTRACTION_H__ */