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);
71 static void PreCache(const FontFamilyList& fallbackFamilyList, const FontFamilyList& extraFamilyList, const FontFamily& localeFamily, bool useThread);
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);
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);
83 static void PreLoad(const FontPathList& fontPathList, const FontPathList& memoryFontPathList, bool useThread);
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);
91 * @copydoc Dali::TextAbstraction::FontClient::ClearCache()
96 * @copydoc Dali::TextAbstraction::FontClient::SetDpi()
98 void SetDpi(unsigned int horizontalDpi, unsigned int verticalDpi);
101 * @copydoc Dali::TextAbstraction::FontClient::GetDpi()
103 void GetDpi(unsigned int& horizontalDpi, unsigned int& verticalDpi);
106 * @copydoc Dali::TextAbstraction::FontClient::GetDefaultFontSize()
108 int GetDefaultFontSize();
111 * @copydoc Dali::TextAbstraction::FontClient::ResetSystemDefaults()
113 void ResetSystemDefaults();
116 * @copydoc Dali::TextAbstraction::FontClient::GetDefaultFonts()
118 void GetDefaultFonts(FontList& defaultFonts);
121 * @copydoc Dali::TextAbstraction::FontClient::InitDefaultFontDescription()
123 void InitDefaultFontDescription();
126 * @copydoc Dali::TextAbstraction::FontClient::GetDefaultPlatformFontDescription()
128 void GetDefaultPlatformFontDescription(FontDescription& fontDescription);
131 * @copydoc Dali::TextAbstraction::FontClient::GetSystemFonts()
133 void GetSystemFonts(FontList& systemFonts);
136 * @copydoc Dali::TextAbstraction::FontClient::GetDescription()
138 void GetDescription(FontId fontId, FontDescription& fontDescription);
141 * @copydoc Dali::TextAbstraction::FontClient::GetPointSize()
143 PointSize26Dot6 GetPointSize(FontId fontId);
146 * @copydoc Dali::TextAbstraction::FontClient::IsCharacterSupportedByFont()
148 bool IsCharacterSupportedByFont(FontId fontId, Character character);
151 * @copydoc Dali::TextAbstraction::FontClient::FindDefaultFont()
153 FontId FindDefaultFont(Character charcode,
154 PointSize26Dot6 requestedPointSize,
158 * @copydoc Dali::TextAbstraction::FontClient::FindFallbackFont()
160 FontId FindFallbackFont(Character charcode,
161 const FontDescription& preferredFontDescription,
162 PointSize26Dot6 requestedPointSize,
166 * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const FontPath& path, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex )
168 FontId GetFontId(const FontPath& path, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex);
171 * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const FontDescription& fontDescription, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex )
173 FontId GetFontId(const FontDescription& fontDescription,
174 PointSize26Dot6 requestedPointSize,
175 FaceIndex faceIndex);
178 * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const BitmapFont& bitmapFont )
180 FontId GetFontId(const BitmapFont& bitmapFont);
183 * @copydoc Dali::TextAbstraction::FontClient::IsScalable( const FontPath& path )
185 bool IsScalable(const FontPath& path);
188 * @copydoc Dali::TextAbstraction::FontClient::IsScalable( const FontDescription& fontDescription )
190 bool IsScalable(const FontDescription& fontDescription);
193 * @copydoc Dali::TextAbstraction::FontClient::GetFixedSizes( const FontPath& path, Dali::Vector< PointSize26Dot6>& sizes )
195 void GetFixedSizes(const FontPath& path, Dali::Vector<PointSize26Dot6>& sizes);
198 * @copydoc Dali::TextAbstraction::FontClient::GetFixedSizes()
200 void GetFixedSizes(const FontDescription& fontDescription,
201 Dali::Vector<PointSize26Dot6>& sizes);
204 * @copydoc Dali::TextAbstraction::FontClient::HasItalicStyle()
206 bool HasItalicStyle(FontId fontId) const;
209 * @copydoc Dali::TextAbstraction::FontClient::GetFontMetrics()
211 void GetFontMetrics(FontId fontId, FontMetrics& metrics);
214 * @copydoc Dali::TextAbstraction::FontClient::GetGlyphIndex()
216 GlyphIndex GetGlyphIndex(FontId fontId, Character charcode);
219 * @copydoc Dali::TextAbstraction::FontClient::GetGlyphIndex()
221 GlyphIndex GetGlyphIndex(FontId fontId, Character charcode, Character variantSelector);
224 * @copydoc Dali::TextAbstraction::FontClient::GetGlyphMetrics()
226 bool GetGlyphMetrics(GlyphInfo* array, uint32_t size, GlyphType type, bool horizontal);
229 * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, bool isItalicRequired, bool isBoldRequired, Dali::TextAbstraction::GlyphBufferData& data, int outlineWidth )
231 void CreateBitmap(FontId fontId, GlyphIndex glyphIndex, bool isItalicRequired, bool isBoldRequired, Dali::TextAbstraction::GlyphBufferData& data, int outlineWidth);
234 * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth )
236 PixelData CreateBitmap(FontId fontId, GlyphIndex glyphIndex, int outlineWidth);
239 * @copydoc Dali::TextAbstraction::FontClient::CreateVectorBlob()
241 void CreateVectorBlob(FontId fontId, GlyphIndex glyphIndex, VectorBlob*& blob, unsigned int& blobLength, unsigned int& nominalWidth, unsigned int& nominalHeight);
244 * @copydoc Dali::TextAbstraction::FontClient::GetEllipsisGlyph()
246 const GlyphInfo& GetEllipsisGlyph(PointSize26Dot6 requestedPointSize);
249 * @copydoc Dali::TextAbstraction::FontClient::IsColorGlyph()
251 bool IsColorGlyph(FontId fontId, GlyphIndex glyphIndex);
254 * @copydoc Dali::TextAbstraction::FontClient::CreateEmbeddedItem()
256 GlyphIndex CreateEmbeddedItem(const TextAbstraction::FontClient::EmbeddedItemDescription& description, Pixel::Format& pixelFormat);
259 * @copydoc Dali::TextAbstraction::FontClient::EnableAtlasLimitation(bool enabled)
261 void EnableAtlasLimitation(bool enabled);
264 * @copydoc Dali::TextAbstraction::FontClient::IsAtlasLimitationEnabled()
266 bool IsAtlasLimitationEnabled() const;
269 * @copydoc Dali::TextAbstraction::FontClient::GetMaximumTextAtlasSize()
271 Size GetMaximumTextAtlasSize() const;
274 * @copydoc Dali::TextAbstraction::FontClient::GetDefaultTextAtlasSize()
276 Size GetDefaultTextAtlasSize() const;
279 * @copydoc Dali::TextAbstraction::FontClient::GetCurrentMaximumBlockSizeFitInAtlas()
281 Size GetCurrentMaximumBlockSizeFitInAtlas() const;
284 * @copydoc Dali::TextAbstraction::FontClient::SetCurrentMaximumBlockSizeFitInAtlas(const Size& currentMaximumBlockSizeFitInAtlas)
286 bool SetCurrentMaximumBlockSizeFitInAtlas(const Size& currentMaximumBlockSizeFitInAtlas);
289 * @copydoc Dali::TextAbstraction::FontClient::GetNumberOfPointsPerOneUnitOfPointSize()
291 uint32_t GetNumberOfPointsPerOneUnitOfPointSize() const;
294 * @copydoc Dali::TextAbstraction::FontClient::AddCustomFontDirectory()
296 bool AddCustomFontDirectory(const FontPath& path);
298 public: // API for Dali::TextAbstraction::Internal::FontClient used.
300 * @brief Retrieves the pointer to the FreeType Font Face for the given @p fontId.
302 * @param[in] fontId The font id.
304 * @return The pointer to the FreeType Font Face.
306 FT_FaceRec_* GetFreetypeFace(FontId fontId);
309 * @brief Retrieves the type of font.
311 * @param[in] fontId The font id.
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.
315 FontDescription::Type GetFontType(FontId fontId);
318 * @brief Get the harfbuzz font data of font.
320 * @param fontId The font id.
321 * @return The harfbuzz font data, or nullptr if failed.
323 HarfBuzzFontHandle GetHarfBuzzFont(FontId fontId);
326 * @brief This is used to pre-cache fonts in order to improve the runtime performance of the application.
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.
332 void FontPreCache(const FontFamilyList& fallbackFamilyList, const FontFamilyList& extraFamilyList, const FontFamily& localeFamily);
335 * @brief This is used to pre-load FreeType font face in order to improve the runtime performance of the application.
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.
341 void FontPreLoad(const FontPathList& fontPathList, const FontPathList& memoryFontPathList);
346 * Helper for lazy initialization.
350 // Undefined copy constructor.
351 FontClient(const FontClient&);
353 // Undefined assignment constructor.
354 FontClient& operator=(const FontClient&);
360 // Allows DPI to be set without loading plugin
361 unsigned int mDpiHorizontal;
362 unsigned int mDpiVertical;
364 static Dali::TextAbstraction::FontClient gPreCreatedFontClient;
366 }; // class FontClient
368 } // namespace Internal
370 inline static Internal::FontClient& GetImplementation(FontClient& fontClient)
372 DALI_ASSERT_ALWAYS(fontClient && "fontClient handle is empty");
373 BaseObject& handle = fontClient.GetBaseObject();
374 return static_cast<Internal::FontClient&>(handle);
377 inline static const Internal::FontClient& GetImplementation(const FontClient& fontClient)
379 DALI_ASSERT_ALWAYS(fontClient && "fontClient handle is empty");
380 const BaseObject& handle = fontClient.GetBaseObject();
381 return static_cast<const Internal::FontClient&>(handle);
384 } // namespace TextAbstraction
388 #endif // DALI_INTERNAL_TEXT_ABSTRACTION_FONT_CLIENT_IMPL_H