1 #ifndef DALI_INTERNAL_TEXT_ABSTRACTION_FONT_CLIENT_IMPL_H
2 #define DALI_INTERNAL_TEXT_ABSTRACTION_FONT_CLIENT_IMPL_H
5 * Copyright (c) 2023 Samsung Electronics Co., Ltd.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
22 #include <dali/public-api/object/base-object.h>
25 #include <dali/devel-api/text-abstraction/font-client.h>
31 namespace TextAbstraction
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.
38 * Implementation of the FontClient
40 class FontClient : public BaseObject
53 public: // API for Dali::TextAbstraction::FontClient used.
55 * @copydoc Dali::TextAbstraction::FontClient::Get()
57 static Dali::TextAbstraction::FontClient Get();
60 * @brief This is used to improve application launch performance
62 * @return A pre-initialized FontClient
64 static Dali::TextAbstraction::FontClient PreInitialize();
67 * @brief This is used to pre-cache FontConfig in order to improve the runtime performance of the application.
69 * @see Dali::TextAbstraction::FontClientPreCache(const FontFamilyList& fallbackFamilyList, const FontFamilyList& extraFamilyList, const FontFamily& localeFamily, bool useThread, bool syncCreation);
71 static void PreCache(const FontFamilyList& fallbackFamilyList, const FontFamilyList& extraFamilyList, const FontFamily& localeFamily, bool useThread, bool syncCreation);
74 * @brief This is used to creates a global font client and pre-caches the FontConfig.
76 static void PreCacheRun(const FontFamilyList& fallbackFamilyList, const FontFamilyList& extraFamilyList, const FontFamily& localeFamily, bool syncCreation);
79 * @brief This is used to pre-load FreeType font face in order to improve the runtime performance of the application.
81 * @see Dali::TextAbstraction:FontClientFontPreLoad(const FontPathList& fontPathList, const FontPathList& memoryFontPathList, bool useThread, bool syncCreation);
83 static void PreLoad(const FontPathList& fontPathList, const FontPathList& memoryFontPathList, bool useThread, bool syncCreation);
86 * @brief This is used to creates a global font client and pre-loads the FreeType font face.
88 static void PreLoadRun(const FontPathList& fontPathList, const FontPathList& memoryFontPathList, bool syncCreation);
91 * @brief Joins font threads, waiting for their execution to complete.
93 static void JoinFontThreads();
96 * @copydoc Dali::TextAbstraction::FontClient::ClearCache()
101 * @copydoc Dali::TextAbstraction::FontClient::ClearCacheOnLocaleChanged()
103 void ClearCacheOnLocaleChanged();
106 * @copydoc Dali::TextAbstraction::FontClient::SetDpi()
108 void SetDpi(unsigned int horizontalDpi, unsigned int verticalDpi);
111 * @copydoc Dali::TextAbstraction::FontClient::GetDpi()
113 void GetDpi(unsigned int& horizontalDpi, unsigned int& verticalDpi);
116 * @copydoc Dali::TextAbstraction::FontClient::GetDefaultFontSize()
118 int GetDefaultFontSize();
121 * @copydoc Dali::TextAbstraction::FontClient::ResetSystemDefaults()
123 void ResetSystemDefaults();
126 * @copydoc Dali::TextAbstraction::FontClient::GetDefaultFonts()
128 void GetDefaultFonts(FontList& defaultFonts);
131 * @copydoc Dali::TextAbstraction::FontClient::InitDefaultFontDescription()
133 void InitDefaultFontDescription();
136 * @copydoc Dali::TextAbstraction::FontClient::GetDefaultPlatformFontDescription()
138 void GetDefaultPlatformFontDescription(FontDescription& fontDescription);
141 * @copydoc Dali::TextAbstraction::FontClient::GetSystemFonts()
143 void GetSystemFonts(FontList& systemFonts);
146 * @copydoc Dali::TextAbstraction::FontClient::GetDescription()
148 void GetDescription(FontId fontId, FontDescription& fontDescription);
151 * @copydoc Dali::TextAbstraction::FontClient::GetPointSize()
153 PointSize26Dot6 GetPointSize(FontId fontId);
156 * @copydoc Dali::TextAbstraction::FontClient::IsCharacterSupportedByFont()
158 bool IsCharacterSupportedByFont(FontId fontId, Character character);
161 * @copydoc Dali::TextAbstraction::FontClient::FindDefaultFont()
163 FontId FindDefaultFont(Character charcode,
164 PointSize26Dot6 requestedPointSize,
168 * @copydoc Dali::TextAbstraction::FontClient::FindFallbackFont()
170 FontId FindFallbackFont(Character charcode,
171 const FontDescription& preferredFontDescription,
172 PointSize26Dot6 requestedPointSize,
176 * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const FontPath& path, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex )
178 FontId GetFontId(const FontPath& path, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex);
181 * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const FontDescription& fontDescription, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex )
183 FontId GetFontId(const FontDescription& fontDescription,
184 PointSize26Dot6 requestedPointSize,
185 FaceIndex faceIndex);
188 * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const BitmapFont& bitmapFont )
190 FontId GetFontId(const BitmapFont& bitmapFont);
193 * @copydoc Dali::TextAbstraction::FontClient::IsScalable( const FontPath& path )
195 bool IsScalable(const FontPath& path);
198 * @copydoc Dali::TextAbstraction::FontClient::IsScalable( const FontDescription& fontDescription )
200 bool IsScalable(const FontDescription& fontDescription);
203 * @copydoc Dali::TextAbstraction::FontClient::GetFixedSizes( const FontPath& path, Dali::Vector< PointSize26Dot6>& sizes )
205 void GetFixedSizes(const FontPath& path, Dali::Vector<PointSize26Dot6>& sizes);
208 * @copydoc Dali::TextAbstraction::FontClient::GetFixedSizes()
210 void GetFixedSizes(const FontDescription& fontDescription,
211 Dali::Vector<PointSize26Dot6>& sizes);
214 * @copydoc Dali::TextAbstraction::FontClient::HasItalicStyle()
216 bool HasItalicStyle(FontId fontId) const;
219 * @copydoc Dali::TextAbstraction::FontClient::GetFontMetrics()
221 void GetFontMetrics(FontId fontId, FontMetrics& metrics);
224 * @copydoc Dali::TextAbstraction::FontClient::GetGlyphIndex()
226 GlyphIndex GetGlyphIndex(FontId fontId, Character charcode);
229 * @copydoc Dali::TextAbstraction::FontClient::GetGlyphIndex()
231 GlyphIndex GetGlyphIndex(FontId fontId, Character charcode, Character variantSelector);
234 * @copydoc Dali::TextAbstraction::FontClient::GetGlyphMetrics()
236 bool GetGlyphMetrics(GlyphInfo* array, uint32_t size, GlyphType type, bool horizontal);
239 * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, bool isItalicRequired, bool isBoldRequired, Dali::TextAbstraction::GlyphBufferData& data, int outlineWidth )
241 void CreateBitmap(FontId fontId, GlyphIndex glyphIndex, bool isItalicRequired, bool isBoldRequired, Dali::TextAbstraction::GlyphBufferData& data, int outlineWidth);
244 * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth )
246 PixelData CreateBitmap(FontId fontId, GlyphIndex glyphIndex, int outlineWidth);
249 * @copydoc Dali::TextAbstraction::FontClient::CreateVectorBlob()
251 void CreateVectorBlob(FontId fontId, GlyphIndex glyphIndex, VectorBlob*& blob, unsigned int& blobLength, unsigned int& nominalWidth, unsigned int& nominalHeight);
254 * @copydoc Dali::TextAbstraction::FontClient::GetEllipsisGlyph()
256 const GlyphInfo& GetEllipsisGlyph(PointSize26Dot6 requestedPointSize);
259 * @copydoc Dali::TextAbstraction::FontClient::IsColorGlyph()
261 bool IsColorGlyph(FontId fontId, GlyphIndex glyphIndex);
264 * @copydoc Dali::TextAbstraction::FontClient::CreateEmbeddedItem()
266 GlyphIndex CreateEmbeddedItem(const TextAbstraction::FontClient::EmbeddedItemDescription& description, Pixel::Format& pixelFormat);
269 * @copydoc Dali::TextAbstraction::FontClient::EnableAtlasLimitation(bool enabled)
271 void EnableAtlasLimitation(bool enabled);
274 * @copydoc Dali::TextAbstraction::FontClient::IsAtlasLimitationEnabled()
276 bool IsAtlasLimitationEnabled() const;
279 * @copydoc Dali::TextAbstraction::FontClient::GetMaximumTextAtlasSize()
281 Size GetMaximumTextAtlasSize() const;
284 * @copydoc Dali::TextAbstraction::FontClient::GetDefaultTextAtlasSize()
286 Size GetDefaultTextAtlasSize() const;
289 * @copydoc Dali::TextAbstraction::FontClient::GetCurrentMaximumBlockSizeFitInAtlas()
291 Size GetCurrentMaximumBlockSizeFitInAtlas() const;
294 * @copydoc Dali::TextAbstraction::FontClient::SetCurrentMaximumBlockSizeFitInAtlas(const Size& currentMaximumBlockSizeFitInAtlas)
296 bool SetCurrentMaximumBlockSizeFitInAtlas(const Size& currentMaximumBlockSizeFitInAtlas);
299 * @copydoc Dali::TextAbstraction::FontClient::GetNumberOfPointsPerOneUnitOfPointSize()
301 uint32_t GetNumberOfPointsPerOneUnitOfPointSize() const;
304 * @copydoc Dali::TextAbstraction::FontClient::AddCustomFontDirectory()
306 bool AddCustomFontDirectory(const FontPath& path);
308 public: // API for Dali::TextAbstraction::Internal::FontClient used.
310 * @brief Retrieves the pointer to the FreeType Font Face for the given @p fontId.
312 * @param[in] fontId The font id.
314 * @return The pointer to the FreeType Font Face.
316 FT_FaceRec_* GetFreetypeFace(FontId fontId);
319 * @brief Retrieves the type of font.
321 * @param[in] fontId The font id.
323 * @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.
325 FontDescription::Type GetFontType(FontId fontId);
328 * @brief Get the harfbuzz font data of font.
330 * @param fontId The font id.
331 * @return The harfbuzz font data, or nullptr if failed.
333 HarfBuzzFontHandle GetHarfBuzzFont(FontId fontId);
336 * @brief This is used to pre-cache fonts in order to improve the runtime performance of the application.
338 * @param[in] fallbackFamilyList A list of fallback font families to be pre-cached.
339 * @param[in] extraFamilyList A list of additional font families to be pre-cached.
340 * @param[in] localeFamily A locale font family to be pre-cached.
342 void FontPreCache(const FontFamilyList& fallbackFamilyList, const FontFamilyList& extraFamilyList, const FontFamily& localeFamily);
345 * @brief This is used to pre-load FreeType font face in order to improve the runtime performance of the application.
347 * @param[in] fontPathList A list of font paths to be pre-loaded.
348 * @param[in] memoryFontPathList A list of memory font paths to be pre-loaded.
349 * @param[in] useThread True if the font client should create thread and perform font pre-loading, false otherwise.
351 void FontPreLoad(const FontPathList& fontPathList, const FontPathList& memoryFontPathList);
356 * Helper for lazy initialization.
360 // Undefined copy constructor.
361 FontClient(const FontClient&);
363 // Undefined assignment constructor.
364 FontClient& operator=(const FontClient&);
370 // Allows DPI to be set without loading plugin
371 unsigned int mDpiHorizontal;
372 unsigned int mDpiVertical;
374 static Dali::TextAbstraction::FontClient gPreCreatedFontClient;
376 }; // class FontClient
378 } // namespace Internal
380 inline static Internal::FontClient& GetImplementation(FontClient& fontClient)
382 DALI_ASSERT_ALWAYS(fontClient && "fontClient handle is empty");
383 BaseObject& handle = fontClient.GetBaseObject();
384 return static_cast<Internal::FontClient&>(handle);
387 inline static const Internal::FontClient& GetImplementation(const FontClient& fontClient)
389 DALI_ASSERT_ALWAYS(fontClient && "fontClient handle is empty");
390 const BaseObject& handle = fontClient.GetBaseObject();
391 return static_cast<const Internal::FontClient&>(handle);
394 } // namespace TextAbstraction
398 #endif // DALI_INTERNAL_TEXT_ABSTRACTION_FONT_CLIENT_IMPL_H