[Tizen] Ensure join of font thread
[platform/core/uifw/dali-adaptor.git] / dali / internal / text / text-abstraction / font-client-impl.h
1 #ifndef DALI_INTERNAL_TEXT_ABSTRACTION_FONT_CLIENT_IMPL_H
2 #define DALI_INTERNAL_TEXT_ABSTRACTION_FONT_CLIENT_IMPL_H
3
4 /*
5  * Copyright (c) 2023 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.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
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  */
20
21 // EXTERNAL INCLUDES
22 #include <dali/public-api/object/base-object.h>
23
24 // INTERNAL INCLUDES
25 #include <dali/devel-api/text-abstraction/font-client.h>
26
27 struct FT_FaceRec_;
28
29 namespace Dali
30 {
31 namespace TextAbstraction
32 {
33 namespace Internal
34 {
35 using HarfBuzzFontHandle = void*; ///< @note We don't want to make other class include harfbuzz header. So we will keep harfbuzz font data as HarfBuzzFontHandle.
36
37 /**
38  * Implementation of the FontClient
39  */
40 class FontClient : public BaseObject
41 {
42 public:
43   /**
44    * Constructor
45    */
46   FontClient();
47
48   /**
49    * Destructor
50    */
51   ~FontClient();
52
53 public: // API for Dali::TextAbstraction::FontClient used.
54   /**
55    * @copydoc Dali::TextAbstraction::FontClient::Get()
56    */
57   static Dali::TextAbstraction::FontClient Get();
58
59   /**
60    * @brief This is used to improve application launch performance
61    *
62    * @return A pre-initialized FontClient
63    */
64   static Dali::TextAbstraction::FontClient PreInitialize();
65
66   /**
67    * @brief This is used to pre-cache FontConfig in order to improve the runtime performance of the application.
68    *
69    * @see Dali::TextAbstraction::FontClientPreCache(const FontFamilyList& fallbackFamilyList, const FontFamilyList& extraFamilyList, const FontFamily& localeFamily, bool useThread, bool syncCreation);
70    */
71   static void PreCache(const FontFamilyList& fallbackFamilyList, const FontFamilyList& extraFamilyList, const FontFamily& localeFamily, bool useThread, bool syncCreation);
72
73   /**
74    * @brief This is used to creates a global font client and pre-caches the FontConfig.
75    */
76   static void PreCacheRun(const FontFamilyList& fallbackFamilyList, const FontFamilyList& extraFamilyList, const FontFamily& localeFamily, bool syncCreation);
77
78   /**
79    * @brief This is used to pre-load FreeType font face in order to improve the runtime performance of the application.
80    *
81    * @see Dali::TextAbstraction:FontClientFontPreLoad(const FontPathList& fontPathList, const FontPathList& memoryFontPathList, bool useThread, bool syncCreation);
82    */
83   static void PreLoad(const FontPathList& fontPathList, const FontPathList& memoryFontPathList, bool useThread, bool syncCreation);
84
85   /**
86    * @brief This is used to creates a global font client and pre-loads the FreeType font face.
87    */
88   static void PreLoadRun(const FontPathList& fontPathList, const FontPathList& memoryFontPathList, bool syncCreation);
89
90   /**
91    * @brief Joins font threads, waiting for their execution to complete.
92    */
93   static void JoinFontThreads();
94
95   /**
96    * @copydoc Dali::TextAbstraction::FontClient::ClearCache()
97    */
98   void ClearCache();
99
100   /**
101    * @copydoc Dali::TextAbstraction::FontClient::SetDpi()
102    */
103   void SetDpi(unsigned int horizontalDpi, unsigned int verticalDpi);
104
105   /**
106    * @copydoc Dali::TextAbstraction::FontClient::GetDpi()
107    */
108   void GetDpi(unsigned int& horizontalDpi, unsigned int& verticalDpi);
109
110   /**
111    * @copydoc Dali::TextAbstraction::FontClient::GetDefaultFontSize()
112    */
113   int GetDefaultFontSize();
114
115   /**
116    * @copydoc Dali::TextAbstraction::FontClient::ResetSystemDefaults()
117    */
118   void ResetSystemDefaults();
119
120   /**
121    * @copydoc Dali::TextAbstraction::FontClient::GetDefaultFonts()
122    */
123   void GetDefaultFonts(FontList& defaultFonts);
124
125   /**
126    * @copydoc Dali::TextAbstraction::FontClient::InitDefaultFontDescription()
127    */
128   void InitDefaultFontDescription();
129
130   /**
131    * @copydoc Dali::TextAbstraction::FontClient::GetDefaultPlatformFontDescription()
132    */
133   void GetDefaultPlatformFontDescription(FontDescription& fontDescription);
134
135   /**
136    * @copydoc Dali::TextAbstraction::FontClient::GetSystemFonts()
137    */
138   void GetSystemFonts(FontList& systemFonts);
139
140   /**
141    * @copydoc Dali::TextAbstraction::FontClient::GetDescription()
142    */
143   void GetDescription(FontId fontId, FontDescription& fontDescription);
144
145   /**
146    * @copydoc Dali::TextAbstraction::FontClient::GetPointSize()
147    */
148   PointSize26Dot6 GetPointSize(FontId fontId);
149
150   /**
151    * @copydoc Dali::TextAbstraction::FontClient::IsCharacterSupportedByFont()
152    */
153   bool IsCharacterSupportedByFont(FontId fontId, Character character);
154
155   /**
156    * @copydoc Dali::TextAbstraction::FontClient::FindDefaultFont()
157    */
158   FontId FindDefaultFont(Character       charcode,
159                          PointSize26Dot6 requestedPointSize,
160                          bool            preferColor);
161
162   /**
163    * @copydoc Dali::TextAbstraction::FontClient::FindFallbackFont()
164    */
165   FontId FindFallbackFont(Character              charcode,
166                           const FontDescription& preferredFontDescription,
167                           PointSize26Dot6        requestedPointSize,
168                           bool                   preferColor);
169
170   /**
171    * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const FontPath& path, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex )
172    */
173   FontId GetFontId(const FontPath& path, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex);
174
175   /**
176    * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const FontDescription& fontDescription, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex )
177    */
178   FontId GetFontId(const FontDescription& fontDescription,
179                    PointSize26Dot6        requestedPointSize,
180                    FaceIndex              faceIndex);
181
182   /**
183    * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const BitmapFont& bitmapFont )
184    */
185   FontId GetFontId(const BitmapFont& bitmapFont);
186
187   /**
188    * @copydoc Dali::TextAbstraction::FontClient::IsScalable( const FontPath& path )
189    */
190   bool IsScalable(const FontPath& path);
191
192   /**
193    * @copydoc Dali::TextAbstraction::FontClient::IsScalable( const FontDescription& fontDescription )
194    */
195   bool IsScalable(const FontDescription& fontDescription);
196
197   /**
198    * @copydoc Dali::TextAbstraction::FontClient::GetFixedSizes( const FontPath& path, Dali::Vector< PointSize26Dot6>& sizes )
199    */
200   void GetFixedSizes(const FontPath& path, Dali::Vector<PointSize26Dot6>& sizes);
201
202   /**
203    * @copydoc Dali::TextAbstraction::FontClient::GetFixedSizes()
204    */
205   void GetFixedSizes(const FontDescription&         fontDescription,
206                      Dali::Vector<PointSize26Dot6>& sizes);
207
208   /**
209    * @copydoc Dali::TextAbstraction::FontClient::HasItalicStyle()
210    */
211   bool HasItalicStyle(FontId fontId) const;
212
213   /**
214    * @copydoc Dali::TextAbstraction::FontClient::GetFontMetrics()
215    */
216   void GetFontMetrics(FontId fontId, FontMetrics& metrics);
217
218   /**
219    * @copydoc Dali::TextAbstraction::FontClient::GetGlyphIndex()
220    */
221   GlyphIndex GetGlyphIndex(FontId fontId, Character charcode);
222
223   /**
224    * @copydoc Dali::TextAbstraction::FontClient::GetGlyphIndex()
225    */
226   GlyphIndex GetGlyphIndex(FontId fontId, Character charcode, Character variantSelector);
227
228   /**
229    * @copydoc Dali::TextAbstraction::FontClient::GetGlyphMetrics()
230    */
231   bool GetGlyphMetrics(GlyphInfo* array, uint32_t size, GlyphType type, bool horizontal);
232
233   /**
234    * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, bool isItalicRequired, bool isBoldRequired, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth )
235    */
236   void CreateBitmap(FontId fontId, GlyphIndex glyphIndex, bool isItalicRequired, bool isBoldRequired, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth);
237
238   /**
239    * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth )
240    */
241   PixelData CreateBitmap(FontId fontId, GlyphIndex glyphIndex, int outlineWidth);
242
243   /**
244    * @copydoc Dali::TextAbstraction::FontClient::CreateVectorBlob()
245    */
246   void CreateVectorBlob(FontId fontId, GlyphIndex glyphIndex, VectorBlob*& blob, unsigned int& blobLength, unsigned int& nominalWidth, unsigned int& nominalHeight);
247
248   /**
249    * @copydoc Dali::TextAbstraction::FontClient::GetEllipsisGlyph()
250    */
251   const GlyphInfo& GetEllipsisGlyph(PointSize26Dot6 requestedPointSize);
252
253   /**
254    * @copydoc Dali::TextAbstraction::FontClient::IsColorGlyph()
255    */
256   bool IsColorGlyph(FontId fontId, GlyphIndex glyphIndex);
257
258   /**
259    * @copydoc Dali::TextAbstraction::FontClient::CreateEmbeddedItem()
260    */
261   GlyphIndex CreateEmbeddedItem(const TextAbstraction::FontClient::EmbeddedItemDescription& description, Pixel::Format& pixelFormat);
262
263   /**
264    * @copydoc Dali::TextAbstraction::FontClient::EnableAtlasLimitation(bool enabled)
265    */
266   void EnableAtlasLimitation(bool enabled);
267
268   /**
269    * @copydoc Dali::TextAbstraction::FontClient::IsAtlasLimitationEnabled()
270    */
271   bool IsAtlasLimitationEnabled() const;
272
273   /**
274    * @copydoc Dali::TextAbstraction::FontClient::GetMaximumTextAtlasSize()
275    */
276   Size GetMaximumTextAtlasSize() const;
277
278   /**
279    * @copydoc Dali::TextAbstraction::FontClient::GetDefaultTextAtlasSize()
280    */
281   Size GetDefaultTextAtlasSize() const;
282
283   /**
284    * @copydoc Dali::TextAbstraction::FontClient::GetCurrentMaximumBlockSizeFitInAtlas()
285    */
286   Size GetCurrentMaximumBlockSizeFitInAtlas() const;
287
288   /**
289    * @copydoc Dali::TextAbstraction::FontClient::SetCurrentMaximumBlockSizeFitInAtlas(const Size& currentMaximumBlockSizeFitInAtlas)
290    */
291   bool SetCurrentMaximumBlockSizeFitInAtlas(const Size& currentMaximumBlockSizeFitInAtlas);
292
293   /**
294    * @copydoc Dali::TextAbstraction::FontClient::GetNumberOfPointsPerOneUnitOfPointSize()
295    */
296   uint32_t GetNumberOfPointsPerOneUnitOfPointSize() const;
297
298   /**
299    * @copydoc Dali::TextAbstraction::FontClient::AddCustomFontDirectory()
300    */
301   bool AddCustomFontDirectory(const FontPath& path);
302
303 public: // API for Dali::TextAbstraction::Internal::FontClient used.
304   /**
305    * @brief Retrieves the pointer to the FreeType Font Face for the given @p fontId.
306    *
307    * @param[in] fontId The font id.
308    *
309    * @return The pointer to the FreeType Font Face.
310    */
311   FT_FaceRec_* GetFreetypeFace(FontId fontId);
312
313   /**
314    * @brief Retrieves the type of font.
315    *
316    * @param[in] fontId The font id.
317    *
318    * @return FACE_FONT if the font has been loaded by FreeType, BITMAP_FONT if it's a font that has been loaded from images or INVALID if it's a non valid font.
319    */
320   FontDescription::Type GetFontType(FontId fontId);
321
322   /**
323    * @brief Get the harfbuzz font data of font.
324    *
325    * @param fontId The font id.
326    * @return The harfbuzz font data, or nullptr if failed.
327    */
328   HarfBuzzFontHandle GetHarfBuzzFont(FontId fontId);
329
330   /**
331    * @brief This is used to pre-cache fonts in order to improve the runtime performance of the application.
332    *
333    * @param[in] fallbackFamilyList A list of fallback font families to be pre-cached.
334    * @param[in] extraFamilyList A list of additional font families to be pre-cached.
335    * @param[in] localeFamily A locale font family to be pre-cached.
336    */
337   void FontPreCache(const FontFamilyList& fallbackFamilyList, const FontFamilyList& extraFamilyList, const FontFamily& localeFamily);
338
339   /**
340    * @brief This is used to pre-load FreeType font face in order to improve the runtime performance of the application.
341    *
342    * @param[in] fontPathList A list of font paths to be pre-loaded.
343    * @param[in] memoryFontPathList A list of memory font paths to be pre-loaded.
344    * @param[in] useThread True if the font client should create thread and perform font pre-loading, false otherwise.
345    */
346   void FontPreLoad(const FontPathList& fontPathList, const FontPathList& memoryFontPathList);
347
348
349 private:
350   /**
351    * Helper for lazy initialization.
352    */
353   void CreatePlugin();
354
355   // Undefined copy constructor.
356   FontClient(const FontClient&);
357
358   // Undefined assignment constructor.
359   FontClient& operator=(const FontClient&);
360
361 private:
362   struct Plugin;
363   Plugin* mPlugin;
364
365   // Allows DPI to be set without loading plugin
366   unsigned int mDpiHorizontal;
367   unsigned int mDpiVertical;
368
369   static Dali::TextAbstraction::FontClient gPreCreatedFontClient;
370
371 }; // class FontClient
372
373 } // namespace Internal
374
375 inline static Internal::FontClient& GetImplementation(FontClient& fontClient)
376 {
377   DALI_ASSERT_ALWAYS(fontClient && "fontClient handle is empty");
378   BaseObject& handle = fontClient.GetBaseObject();
379   return static_cast<Internal::FontClient&>(handle);
380 }
381
382 inline static const Internal::FontClient& GetImplementation(const FontClient& fontClient)
383 {
384   DALI_ASSERT_ALWAYS(fontClient && "fontClient handle is empty");
385   const BaseObject& handle = fontClient.GetBaseObject();
386   return static_cast<const Internal::FontClient&>(handle);
387 }
388
389 } // namespace TextAbstraction
390
391 } // namespace Dali
392
393 #endif // DALI_INTERNAL_TEXT_ABSTRACTION_FONT_CLIENT_IMPL_H