79e1ab9d1c2eff1a2eca316c63f4f51223cef6cf
[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    * @copydoc Dali::TextAbstraction::FontClient::ClearCache()
92    */
93   void ClearCache();
94
95   /**
96    * @copydoc Dali::TextAbstraction::FontClient::SetDpi()
97    */
98   void SetDpi(unsigned int horizontalDpi, unsigned int verticalDpi);
99
100   /**
101    * @copydoc Dali::TextAbstraction::FontClient::GetDpi()
102    */
103   void GetDpi(unsigned int& horizontalDpi, unsigned int& verticalDpi);
104
105   /**
106    * @copydoc Dali::TextAbstraction::FontClient::GetDefaultFontSize()
107    */
108   int GetDefaultFontSize();
109
110   /**
111    * @copydoc Dali::TextAbstraction::FontClient::ResetSystemDefaults()
112    */
113   void ResetSystemDefaults();
114
115   /**
116    * @copydoc Dali::TextAbstraction::FontClient::GetDefaultFonts()
117    */
118   void GetDefaultFonts(FontList& defaultFonts);
119
120   /**
121    * @copydoc Dali::TextAbstraction::FontClient::InitDefaultFontDescription()
122    */
123   void InitDefaultFontDescription();
124
125   /**
126    * @copydoc Dali::TextAbstraction::FontClient::GetDefaultPlatformFontDescription()
127    */
128   void GetDefaultPlatformFontDescription(FontDescription& fontDescription);
129
130   /**
131    * @copydoc Dali::TextAbstraction::FontClient::GetSystemFonts()
132    */
133   void GetSystemFonts(FontList& systemFonts);
134
135   /**
136    * @copydoc Dali::TextAbstraction::FontClient::GetDescription()
137    */
138   void GetDescription(FontId fontId, FontDescription& fontDescription);
139
140   /**
141    * @copydoc Dali::TextAbstraction::FontClient::GetPointSize()
142    */
143   PointSize26Dot6 GetPointSize(FontId fontId);
144
145   /**
146    * @copydoc Dali::TextAbstraction::FontClient::IsCharacterSupportedByFont()
147    */
148   bool IsCharacterSupportedByFont(FontId fontId, Character character);
149
150   /**
151    * @copydoc Dali::TextAbstraction::FontClient::FindDefaultFont()
152    */
153   FontId FindDefaultFont(Character       charcode,
154                          PointSize26Dot6 requestedPointSize,
155                          bool            preferColor);
156
157   /**
158    * @copydoc Dali::TextAbstraction::FontClient::FindFallbackFont()
159    */
160   FontId FindFallbackFont(Character              charcode,
161                           const FontDescription& preferredFontDescription,
162                           PointSize26Dot6        requestedPointSize,
163                           bool                   preferColor);
164
165   /**
166    * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const FontPath& path, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex )
167    */
168   FontId GetFontId(const FontPath& path, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex);
169
170   /**
171    * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const FontDescription& fontDescription, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex )
172    */
173   FontId GetFontId(const FontDescription& fontDescription,
174                    PointSize26Dot6        requestedPointSize,
175                    FaceIndex              faceIndex);
176
177   /**
178    * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const BitmapFont& bitmapFont )
179    */
180   FontId GetFontId(const BitmapFont& bitmapFont);
181
182   /**
183    * @copydoc Dali::TextAbstraction::FontClient::IsScalable( const FontPath& path )
184    */
185   bool IsScalable(const FontPath& path);
186
187   /**
188    * @copydoc Dali::TextAbstraction::FontClient::IsScalable( const FontDescription& fontDescription )
189    */
190   bool IsScalable(const FontDescription& fontDescription);
191
192   /**
193    * @copydoc Dali::TextAbstraction::FontClient::GetFixedSizes( const FontPath& path, Dali::Vector< PointSize26Dot6>& sizes )
194    */
195   void GetFixedSizes(const FontPath& path, Dali::Vector<PointSize26Dot6>& sizes);
196
197   /**
198    * @copydoc Dali::TextAbstraction::FontClient::GetFixedSizes()
199    */
200   void GetFixedSizes(const FontDescription&         fontDescription,
201                      Dali::Vector<PointSize26Dot6>& sizes);
202
203   /**
204    * @copydoc Dali::TextAbstraction::FontClient::HasItalicStyle()
205    */
206   bool HasItalicStyle(FontId fontId) const;
207
208   /**
209    * @copydoc Dali::TextAbstraction::FontClient::GetFontMetrics()
210    */
211   void GetFontMetrics(FontId fontId, FontMetrics& metrics);
212
213   /**
214    * @copydoc Dali::TextAbstraction::FontClient::GetGlyphIndex()
215    */
216   GlyphIndex GetGlyphIndex(FontId fontId, Character charcode);
217
218   /**
219    * @copydoc Dali::TextAbstraction::FontClient::GetGlyphIndex()
220    */
221   GlyphIndex GetGlyphIndex(FontId fontId, Character charcode, Character variantSelector);
222
223   /**
224    * @copydoc Dali::TextAbstraction::FontClient::GetGlyphMetrics()
225    */
226   bool GetGlyphMetrics(GlyphInfo* array, uint32_t size, GlyphType type, bool horizontal);
227
228   /**
229    * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, bool isItalicRequired, bool isBoldRequired, Dali::TextAbstraction::GlyphBufferData& data, int outlineWidth )
230    */
231   void CreateBitmap(FontId fontId, GlyphIndex glyphIndex, bool isItalicRequired, bool isBoldRequired, Dali::TextAbstraction::GlyphBufferData& data, int outlineWidth);
232
233   /**
234    * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth )
235    */
236   PixelData CreateBitmap(FontId fontId, GlyphIndex glyphIndex, int outlineWidth);
237
238   /**
239    * @copydoc Dali::TextAbstraction::FontClient::CreateVectorBlob()
240    */
241   void CreateVectorBlob(FontId fontId, GlyphIndex glyphIndex, VectorBlob*& blob, unsigned int& blobLength, unsigned int& nominalWidth, unsigned int& nominalHeight);
242
243   /**
244    * @copydoc Dali::TextAbstraction::FontClient::GetEllipsisGlyph()
245    */
246   const GlyphInfo& GetEllipsisGlyph(PointSize26Dot6 requestedPointSize);
247
248   /**
249    * @copydoc Dali::TextAbstraction::FontClient::IsColorGlyph()
250    */
251   bool IsColorGlyph(FontId fontId, GlyphIndex glyphIndex);
252
253   /**
254    * @copydoc Dali::TextAbstraction::FontClient::CreateEmbeddedItem()
255    */
256   GlyphIndex CreateEmbeddedItem(const TextAbstraction::FontClient::EmbeddedItemDescription& description, Pixel::Format& pixelFormat);
257
258   /**
259    * @copydoc Dali::TextAbstraction::FontClient::EnableAtlasLimitation(bool enabled)
260    */
261   void EnableAtlasLimitation(bool enabled);
262
263   /**
264    * @copydoc Dali::TextAbstraction::FontClient::IsAtlasLimitationEnabled()
265    */
266   bool IsAtlasLimitationEnabled() const;
267
268   /**
269    * @copydoc Dali::TextAbstraction::FontClient::GetMaximumTextAtlasSize()
270    */
271   Size GetMaximumTextAtlasSize() const;
272
273   /**
274    * @copydoc Dali::TextAbstraction::FontClient::GetDefaultTextAtlasSize()
275    */
276   Size GetDefaultTextAtlasSize() const;
277
278   /**
279    * @copydoc Dali::TextAbstraction::FontClient::GetCurrentMaximumBlockSizeFitInAtlas()
280    */
281   Size GetCurrentMaximumBlockSizeFitInAtlas() const;
282
283   /**
284    * @copydoc Dali::TextAbstraction::FontClient::SetCurrentMaximumBlockSizeFitInAtlas(const Size& currentMaximumBlockSizeFitInAtlas)
285    */
286   bool SetCurrentMaximumBlockSizeFitInAtlas(const Size& currentMaximumBlockSizeFitInAtlas);
287
288   /**
289    * @copydoc Dali::TextAbstraction::FontClient::GetNumberOfPointsPerOneUnitOfPointSize()
290    */
291   uint32_t GetNumberOfPointsPerOneUnitOfPointSize() const;
292
293   /**
294    * @copydoc Dali::TextAbstraction::FontClient::AddCustomFontDirectory()
295    */
296   bool AddCustomFontDirectory(const FontPath& path);
297
298 public: // API for Dali::TextAbstraction::Internal::FontClient used.
299   /**
300    * @brief Retrieves the pointer to the FreeType Font Face for the given @p fontId.
301    *
302    * @param[in] fontId The font id.
303    *
304    * @return The pointer to the FreeType Font Face.
305    */
306   FT_FaceRec_* GetFreetypeFace(FontId fontId);
307
308   /**
309    * @brief Retrieves the type of font.
310    *
311    * @param[in] fontId The font id.
312    *
313    * @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.
314    */
315   FontDescription::Type GetFontType(FontId fontId);
316
317   /**
318    * @brief Get the harfbuzz font data of font.
319    *
320    * @param fontId The font id.
321    * @return The harfbuzz font data, or nullptr if failed.
322    */
323   HarfBuzzFontHandle GetHarfBuzzFont(FontId fontId);
324
325   /**
326    * @brief This is used to pre-cache fonts in order to improve the runtime performance of the application.
327    *
328    * @param[in] fallbackFamilyList A list of fallback font families to be pre-cached.
329    * @param[in] extraFamilyList A list of additional font families to be pre-cached.
330    * @param[in] localeFamily A locale font family to be pre-cached.
331    */
332   void FontPreCache(const FontFamilyList& fallbackFamilyList, const FontFamilyList& extraFamilyList, const FontFamily& localeFamily);
333
334   /**
335    * @brief This is used to pre-load FreeType font face in order to improve the runtime performance of the application.
336    *
337    * @param[in] fontPathList A list of font paths to be pre-loaded.
338    * @param[in] memoryFontPathList A list of memory font paths to be pre-loaded.
339    * @param[in] useThread True if the font client should create thread and perform font pre-loading, false otherwise.
340    */
341   void FontPreLoad(const FontPathList& fontPathList, const FontPathList& memoryFontPathList);
342
343
344 private:
345   /**
346    * Helper for lazy initialization.
347    */
348   void CreatePlugin();
349
350   // Undefined copy constructor.
351   FontClient(const FontClient&);
352
353   // Undefined assignment constructor.
354   FontClient& operator=(const FontClient&);
355
356 private:
357   struct Plugin;
358   Plugin* mPlugin;
359
360   // Allows DPI to be set without loading plugin
361   unsigned int mDpiHorizontal;
362   unsigned int mDpiVertical;
363
364   static Dali::TextAbstraction::FontClient gPreCreatedFontClient;
365
366 }; // class FontClient
367
368 } // namespace Internal
369
370 inline static Internal::FontClient& GetImplementation(FontClient& fontClient)
371 {
372   DALI_ASSERT_ALWAYS(fontClient && "fontClient handle is empty");
373   BaseObject& handle = fontClient.GetBaseObject();
374   return static_cast<Internal::FontClient&>(handle);
375 }
376
377 inline static const Internal::FontClient& GetImplementation(const FontClient& fontClient)
378 {
379   DALI_ASSERT_ALWAYS(fontClient && "fontClient handle is empty");
380   const BaseObject& handle = fontClient.GetBaseObject();
381   return static_cast<const Internal::FontClient&>(handle);
382 }
383
384 } // namespace TextAbstraction
385
386 } // namespace Dali
387
388 #endif // DALI_INTERNAL_TEXT_ABSTRACTION_FONT_CLIENT_IMPL_H