2 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <dali/devel-api/text-abstraction/bidirectional-support.h>
18 #include <dali/devel-api/text-abstraction/font-client.h>
19 #include <dali/devel-api/text-abstraction/font-metrics.h>
20 #include <dali/devel-api/text-abstraction/glyph-info.h>
21 #include <dali/devel-api/text-abstraction/script.h>
22 #include <dali/devel-api/text-abstraction/segmentation.h>
23 #include <dali/devel-api/text-abstraction/shaping.h>
24 #include <dali/public-api/object/base-object.h>
25 #include <dali/devel-api/adaptor-framework/singleton-service.h>
34 namespace TextAbstraction
39 class BidirectionalSupport : public BaseObject
42 BidirectionalSupport()
46 ~BidirectionalSupport()
50 static TextAbstraction::BidirectionalSupport Get()
52 TextAbstraction::BidirectionalSupport bidirectionalSupportHandle;
54 Dali::SingletonService service( Dali::SingletonService::Get() );
57 // Check whether the singleton is already created
58 BaseHandle handle = service.GetSingleton( typeid( TextAbstraction::BidirectionalSupport ) );
61 // If so, downcast the handle
62 BidirectionalSupport* impl = dynamic_cast< Internal::BidirectionalSupport* >( handle.GetObjectPtr() );
63 bidirectionalSupportHandle = TextAbstraction::BidirectionalSupport( impl );
65 else // create and register the object
67 bidirectionalSupportHandle = TextAbstraction::BidirectionalSupport( new BidirectionalSupport );
68 service.Register( typeid( bidirectionalSupportHandle ), bidirectionalSupportHandle );
71 return bidirectionalSupportHandle;
73 BidiInfoIndex CreateInfo( const Character* const paragraph, Length numberOfCharacters,
74 bool matchSystemLanguageDirection, LayoutDirection::Type layoutDirection ){return 0;}
76 void DestroyInfo( BidiInfoIndex bidiInfoIndex )
80 void Reorder( BidiInfoIndex bidiInfoIndex,CharacterIndex firstCharacterIndex,Length numberOfCharacters,CharacterIndex* visualToLogicalMap )
84 bool GetMirroredText( Character* text,CharacterDirection* directions,Length numberOfCharacters )
89 bool GetParagraphDirection( BidiInfoIndex bidiInfoIndex ) const
94 void GetCharactersDirection( BidiInfoIndex bidiInfoIndex, CharacterDirection* directions, Length numberOfCharacters )
97 }; // class BidirectionalSupport
100 class FontClient : public BaseObject
104 : mDpiHorizontal( 0 ),
111 static Dali::TextAbstraction::FontClient Get()
113 Dali::TextAbstraction::FontClient fontClientHandle;
115 Dali::SingletonService service( SingletonService::Get() );
118 // Check whether the singleton is already created
119 Dali::BaseHandle handle = service.GetSingleton( typeid( Dali::TextAbstraction::FontClient ) );
122 // If so, downcast the handle
123 FontClient* impl = dynamic_cast< Dali::TextAbstraction::Internal::FontClient* >( handle.GetObjectPtr() );
124 fontClientHandle = Dali::TextAbstraction::FontClient( impl );
126 else // create and register the object
128 fontClientHandle = Dali::TextAbstraction::FontClient( new FontClient );
129 service.Register( typeid( fontClientHandle ), fontClientHandle );
133 return fontClientHandle;
136 void SetDpi( unsigned int horizontalDpi, unsigned int verticalDpi ){}
137 void GetDpi( unsigned int& horizontalDpi, unsigned int& verticalDpi ){horizontalDpi=verticalDpi=96;}
139 void ResetSystemDefaults(){}
140 void GetDefaultFonts( FontList& defaultFonts ){}
141 void GetDefaultPlatformFontDescription( FontDescription& fontDescription ){}
142 void GetSystemFonts( FontList& systemFonts ){}
143 void GetDescription( FontId id, FontDescription& fontDescription ){}
144 PointSize26Dot6 GetPointSize( FontId id ){return 9;}
145 FontId FindDefaultFont( Character charcode, PointSize26Dot6 pointSize, bool preferColor ){return 0;}
146 FontId FindFallbackFont( Character charcode, const FontDescription& fontDescription, PointSize26Dot6 pointSize, bool preferColor ){return 0;}
147 FontId GetFontId( const FontPath& path, PointSize26Dot6 pointSize, FaceIndex faceIndex ){return 0;}
148 FontId GetFontId( const FontDescription& fontDescription,PointSize26Dot6 pointSize, FaceIndex faceIndex ){return 0;}
149 bool IsScalable( const FontPath& path ){return true;}
150 bool IsScalable( const FontDescription& fontDescription ){return true;}
151 void GetFixedSizes( const FontPath& path, Dali::Vector< PointSize26Dot6>& sizes ){}
152 void GetFixedSizes( const FontDescription& fontDescription, Dali::Vector< PointSize26Dot6 >& sizes ){}
153 void GetFontMetrics( FontId fontId, FontMetrics& metrics ){}
154 GlyphIndex GetGlyphIndex( FontId fontId, Character charcode ){return 0;}
155 bool GetGlyphMetrics( GlyphInfo* array, uint32_t size, bool horizontal ){return true;}
156 void CreateBitmap( FontId fontId, GlyphIndex glyphIndex, bool softwareItailc, bool softwareBold, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth ){}
157 PixelData CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth ){return PixelData();}
158 void CreateVectorBlob( FontId fontId, GlyphIndex glyphIndex, VectorBlob*& blob,
159 unsigned int& blobLength, unsigned int& nominalWidth, unsigned int& nominalHeight )
163 const GlyphInfo& GetEllipsisGlyph( PointSize26Dot6 pointSize ){return mGlyphInfo;}
164 bool IsColorGlyph( FontId fontId, GlyphIndex glyphIndex ){return false;}
166 unsigned int mDpiHorizontal;
167 unsigned int mDpiVertical;
168 GlyphInfo mGlyphInfo;
169 }; // class FontClient
172 class Shaping : public BaseObject
175 Shaping() : mText(NULL)
183 static Dali::TextAbstraction::Shaping Get()
185 Dali::TextAbstraction::Shaping shapingHandle;
187 Dali::SingletonService service( SingletonService::Get() );
190 // Check whether the singleton is already created
191 Dali::BaseHandle handle = service.GetSingleton( typeid( Dali::TextAbstraction::Shaping ) );
194 // If so, downcast the handle
195 Shaping* impl = dynamic_cast< Dali::TextAbstraction::Internal::Shaping* >( handle.GetObjectPtr() );
196 shapingHandle = Dali::TextAbstraction::Shaping( impl );
198 else // create and register the object
200 shapingHandle = Dali::TextAbstraction::Shaping( new Shaping );
201 service.Register( typeid( shapingHandle ), shapingHandle );
204 return shapingHandle;
207 void GetGlyphs(GlyphInfo* glyphStore, unsigned int*mappingTable)
209 // Return store & mapping table (0, 1, 2, 3... N-1))
212 memcpy( glyphStore, mText, mNumChars );
214 for( unsigned int i=0; i<mNumChars ; ++i )
220 Length Shape(unsigned int const* text, unsigned int numChars, unsigned int fontId, Script script)
222 mText = new unsigned char[numChars];
223 mNumChars = numChars;
225 memcpy( mText, text, numChars );
230 unsigned char* mText;
231 unsigned int mNumChars;
237 inline static TextAbstraction::Internal::BidirectionalSupport& GetImplementation( TextAbstraction::BidirectionalSupport& bidirectionalSupport )
239 DALI_ASSERT_ALWAYS( bidirectionalSupport && "bidirectional support handle is empty" );
240 BaseObject& object = bidirectionalSupport.GetBaseObject();
241 return static_cast<TextAbstraction::Internal::BidirectionalSupport&>(object);
244 inline static const TextAbstraction::Internal::BidirectionalSupport& GetImplementation( const TextAbstraction::BidirectionalSupport& bidirectionalSupport )
246 DALI_ASSERT_ALWAYS( bidirectionalSupport && "bidirectional support handle is empty" );
247 const BaseObject& object = bidirectionalSupport.GetBaseObject();
248 return static_cast<const TextAbstraction::Internal::BidirectionalSupport&>(object);
251 inline static TextAbstraction::Internal::FontClient& GetImplementation(TextAbstraction::FontClient& fontClient)
253 DALI_ASSERT_ALWAYS( fontClient && "fontClient handle is empty" );
254 BaseObject& handle = fontClient.GetBaseObject();
255 return static_cast<TextAbstraction::Internal::FontClient&>(handle);
258 inline static const TextAbstraction::Internal::FontClient& GetImplementation(const TextAbstraction::FontClient& fontClient)
260 DALI_ASSERT_ALWAYS( fontClient && "fontClient handle is empty" );
261 const BaseObject& handle = fontClient.GetBaseObject();
262 return static_cast<const TextAbstraction::Internal::FontClient&>(handle);
265 inline static TextAbstraction::Internal::Shaping& GetImplementation(TextAbstraction::Shaping& shaping)
267 DALI_ASSERT_ALWAYS( shaping && "shaping handle is empty" );
268 BaseObject& handle = shaping.GetBaseObject();
269 return static_cast<TextAbstraction::Internal::Shaping&>(handle);
272 inline static const TextAbstraction::Internal::Shaping& GetImplementation(const TextAbstraction::Shaping& shaping)
274 DALI_ASSERT_ALWAYS( shaping && "shaping handle is empty" );
275 const BaseObject& handle = shaping.GetBaseObject();
276 return static_cast<const TextAbstraction::Internal::Shaping&>(handle);
280 ////////////////////////////////////////////////////////////////////////////////
281 /******************************************************************************/
283 namespace TextAbstraction
285 const PointSize26Dot6 FontClient::DEFAULT_POINT_SIZE = 768u; // 12*64
287 BidirectionalSupport::BidirectionalSupport()
291 BidirectionalSupport::~BidirectionalSupport()
295 BidirectionalSupport::BidirectionalSupport( Internal::BidirectionalSupport* implementation )
296 : BaseHandle( implementation )
300 BidirectionalSupport BidirectionalSupport::Get()
302 return Internal::BidirectionalSupport::Get();
305 BidiInfoIndex BidirectionalSupport::CreateInfo( const Character* const paragraph,
306 Length numberOfCharacters,
307 bool matchSystemLanguageDirection,
308 LayoutDirection::Type layoutDirection )
310 return GetImplementation( *this ).CreateInfo( paragraph, numberOfCharacters, matchSystemLanguageDirection, layoutDirection );
313 void BidirectionalSupport::DestroyInfo( BidiInfoIndex bidiInfoIndex )
315 GetImplementation( *this ).DestroyInfo( bidiInfoIndex );
318 void BidirectionalSupport::Reorder( BidiInfoIndex bidiInfoIndex,
319 CharacterIndex firstCharacterIndex,
320 Length numberOfCharacters,
321 CharacterIndex* visualToLogicalMap )
323 GetImplementation( *this ).Reorder( bidiInfoIndex, firstCharacterIndex, numberOfCharacters, visualToLogicalMap );
326 bool BidirectionalSupport::GetMirroredText( Character* text,
327 CharacterDirection* directions,
328 Length numberOfCharacters )
330 return GetImplementation( *this ).GetMirroredText( text, directions, numberOfCharacters );
333 bool BidirectionalSupport::GetParagraphDirection( BidiInfoIndex bidiInfoIndex ) const
335 return GetImplementation( *this ).GetParagraphDirection( bidiInfoIndex );
338 void BidirectionalSupport::GetCharactersDirection( BidiInfoIndex bidiInfoIndex,
339 CharacterDirection* directions,
340 Length numberOfCharacters )
342 GetImplementation( *this ).GetCharactersDirection( bidiInfoIndex, directions, numberOfCharacters );
346 FontClient FontClient::Get()
348 return Internal::FontClient::Get();
351 FontClient::FontClient()
355 FontClient::~FontClient()
359 FontClient::FontClient( const FontClient& handle )
360 : BaseHandle( handle )
364 FontClient::GlyphBufferData::GlyphBufferData()
368 FontClient::GlyphBufferData::~GlyphBufferData()
372 FontClient& FontClient::operator=( const FontClient& handle )
374 BaseHandle::operator=( handle );
378 void FontClient::SetDpi( unsigned int horizontalDpi, unsigned int verticalDpi )
380 GetImplementation(*this).SetDpi( horizontalDpi, verticalDpi );
383 void FontClient::GetDpi( unsigned int& horizontalDpi, unsigned int& verticalDpi )
385 GetImplementation(*this).GetDpi( horizontalDpi, verticalDpi );
388 void FontClient::ResetSystemDefaults()
390 GetImplementation(*this).ResetSystemDefaults();
393 void FontClient::GetDefaultFonts( FontList& defaultFonts )
395 GetImplementation(*this).GetDefaultFonts( defaultFonts );
398 void FontClient::GetDefaultPlatformFontDescription( FontDescription& fontDescription )
400 GetImplementation(*this).GetDefaultPlatformFontDescription( fontDescription );
403 void FontClient::GetSystemFonts( FontList& systemFonts )
405 GetImplementation(*this).GetSystemFonts( systemFonts );
408 void FontClient::GetDescription( FontId id, FontDescription& fontDescription )
410 GetImplementation(*this).GetDescription( id, fontDescription );
413 PointSize26Dot6 FontClient::GetPointSize( FontId id )
415 return GetImplementation(*this).GetPointSize( id );
418 FontId FontClient::FindDefaultFont( Character charcode, PointSize26Dot6 pointSize, bool preferColor )
420 return GetImplementation(*this).FindDefaultFont( charcode, pointSize, preferColor );
423 FontId FontClient::FindFallbackFont( Character charcode, const FontDescription& fontDescription, PointSize26Dot6 pointSize, bool preferColor )
425 return GetImplementation(*this).FindFallbackFont( charcode, fontDescription, pointSize, preferColor );
428 FontId FontClient::GetFontId( const FontPath& path, PointSize26Dot6 pointSize, FaceIndex faceIndex )
430 return GetImplementation(*this).GetFontId( path, pointSize, faceIndex );
433 FontId FontClient::GetFontId( const FontDescription& fontDescription,
434 PointSize26Dot6 pointSize,
435 FaceIndex faceIndex )
437 return GetImplementation(*this).GetFontId( fontDescription,
442 bool FontClient::IsScalable( const FontPath& path )
444 return GetImplementation(*this).IsScalable( path );
447 bool FontClient::IsScalable( const FontDescription& fontDescription )
449 return GetImplementation(*this).IsScalable( fontDescription );
452 void FontClient::GetFixedSizes( const FontPath& path, Dali::Vector< PointSize26Dot6>& sizes )
454 GetImplementation(*this).GetFixedSizes( path, sizes );
457 void FontClient::GetFixedSizes( const FontDescription& fontDescription,
458 Dali::Vector< PointSize26Dot6 >& sizes )
460 GetImplementation(*this).GetFixedSizes( fontDescription, sizes );
463 void FontClient::GetFontMetrics( FontId fontId, FontMetrics& metrics )
465 GetImplementation(*this).GetFontMetrics( fontId, metrics );
468 GlyphIndex FontClient::GetGlyphIndex( FontId fontId, Character charcode )
470 return GetImplementation(*this).GetGlyphIndex( fontId, charcode );
473 bool FontClient::GetGlyphMetrics( GlyphInfo* array, uint32_t size, GlyphType type, bool horizontal )
475 return GetImplementation(*this).GetGlyphMetrics( array, size, horizontal );
478 void FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, bool softwareItailc, bool softwareBold, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth )
480 GetImplementation(*this).CreateBitmap( fontId, glyphIndex, softwareItailc, softwareBold, data, outlineWidth );
483 PixelData FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth )
485 return GetImplementation(*this).CreateBitmap( fontId, glyphIndex, outlineWidth );
488 void FontClient::CreateVectorBlob( FontId fontId,
489 GlyphIndex glyphIndex,
491 unsigned int& blobLength,
492 unsigned int& nominalWidth,
493 unsigned int& nominalHeight )
495 GetImplementation(*this).CreateVectorBlob( fontId, glyphIndex, blob, blobLength, nominalWidth, nominalHeight );
498 const GlyphInfo& FontClient::GetEllipsisGlyph( PointSize26Dot6 pointSize )
500 return GetImplementation(*this).GetEllipsisGlyph( pointSize );
503 bool FontClient::IsColorGlyph( FontId fontId, GlyphIndex glyphIndex )
505 return GetImplementation(*this).IsColorGlyph( fontId, glyphIndex );
508 FontClient::FontClient( Internal::FontClient* internal )
509 : BaseHandle( internal )
513 FontMetrics::FontMetrics()
517 underlinePosition( 0.f ),
518 underlineThickness( 0.f )
522 GlyphInfo::GlyphInfo()
526 Script GetCharacterScript(unsigned int x)
530 bool HasLigatureMustBreak(Script x){return false;}
531 bool IsCommonScript(unsigned int character){ return false;}
532 bool IsNewParagraph(unsigned int character){return false;}
533 bool IsRightToLeftScript(Script){return false;}
534 bool IsWhiteSpace(unsigned int character)
536 return character < 0x21;
539 Segmentation Segmentation::Get(){ return Segmentation();}
540 Segmentation::Segmentation(){}
541 Segmentation::~Segmentation(){}
542 void Segmentation::GetLineBreakPositions(unsigned int const*, unsigned int, char*){}
543 void Segmentation::GetWordBreakPositions(unsigned int const*, unsigned int, char*){}
545 Shaping Shaping::Get()
547 return TextAbstraction::Internal::Shaping::Get();
554 Shaping::Shaping( Internal::Shaping* internal )
555 : BaseHandle( internal )
563 void Shaping::GetGlyphs(GlyphInfo* glyphStore, unsigned int*mappingTable)
565 // Return store & mapping table (0, 1, 2, 3... N-1))
566 GetImplementation(*this).GetGlyphs(glyphStore, mappingTable);
569 Length Shaping::Shape(unsigned int const* text, unsigned int numChars, unsigned int fontId, Script script)
571 return GetImplementation(*this).Shape( text, numChars, fontId, script );