1 #ifndef DALI_INTERNAL_TEXT_ABSTRACTION_FONT_CLIENT_IMPL_H
2 #define DALI_INTERNAL_TEXT_ABSTRACTION_FONT_CLIENT_IMPL_H
5 * Copyright (c) 2022 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 fonts 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 useUiThread);
74 * @brief This is used to creates a global font client and pre-caches the fonts.
76 static void PreCacheRun(const FontFamilyList& fallbackFamilyList, const FontFamilyList& extraFamilyList, const FontFamily& localeFamily);
79 * @copydoc Dali::TextAbstraction::FontClient::ClearCache()
84 * @copydoc Dali::TextAbstraction::FontClient::SetDpi()
86 void SetDpi(unsigned int horizontalDpi, unsigned int verticalDpi);
89 * @copydoc Dali::TextAbstraction::FontClient::GetDpi()
91 void GetDpi(unsigned int& horizontalDpi, unsigned int& verticalDpi);
94 * @copydoc Dali::TextAbstraction::FontClient::GetDefaultFontSize()
96 int GetDefaultFontSize();
99 * @copydoc Dali::TextAbstraction::FontClient::ResetSystemDefaults()
101 void ResetSystemDefaults();
104 * @copydoc Dali::TextAbstraction::FontClient::GetDefaultFonts()
106 void GetDefaultFonts(FontList& defaultFonts);
109 * @copydoc Dali::TextAbstraction::FontClient::GetDefaultPlatformFontDescription()
111 void GetDefaultPlatformFontDescription(FontDescription& fontDescription);
114 * @copydoc Dali::TextAbstraction::FontClient::GetSystemFonts()
116 void GetSystemFonts(FontList& systemFonts);
119 * @copydoc Dali::TextAbstraction::FontClient::GetDescription()
121 void GetDescription(FontId fontId, FontDescription& fontDescription);
124 * @copydoc Dali::TextAbstraction::FontClient::GetPointSize()
126 PointSize26Dot6 GetPointSize(FontId fontId);
129 * @copydoc Dali::TextAbstraction::FontClient::IsCharacterSupportedByFont()
131 bool IsCharacterSupportedByFont(FontId fontId, Character character);
134 * @copydoc Dali::TextAbstraction::FontClient::FindDefaultFont()
136 FontId FindDefaultFont(Character charcode,
137 PointSize26Dot6 requestedPointSize,
141 * @copydoc Dali::TextAbstraction::FontClient::FindFallbackFont()
143 FontId FindFallbackFont(Character charcode,
144 const FontDescription& preferredFontDescription,
145 PointSize26Dot6 requestedPointSize,
149 * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const FontPath& path, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex )
151 FontId GetFontId(const FontPath& path, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex);
154 * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const FontDescription& fontDescription, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex )
156 FontId GetFontId(const FontDescription& fontDescription,
157 PointSize26Dot6 requestedPointSize,
158 FaceIndex faceIndex);
161 * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const BitmapFont& bitmapFont )
163 FontId GetFontId(const BitmapFont& bitmapFont);
166 * @copydoc Dali::TextAbstraction::FontClient::IsScalable( const FontPath& path )
168 bool IsScalable(const FontPath& path);
171 * @copydoc Dali::TextAbstraction::FontClient::IsScalable( const FontDescription& fontDescription )
173 bool IsScalable(const FontDescription& fontDescription);
176 * @copydoc Dali::TextAbstraction::FontClient::GetFixedSizes( const FontPath& path, Dali::Vector< PointSize26Dot6>& sizes )
178 void GetFixedSizes(const FontPath& path, Dali::Vector<PointSize26Dot6>& sizes);
181 * @copydoc Dali::TextAbstraction::FontClient::GetFixedSizes()
183 void GetFixedSizes(const FontDescription& fontDescription,
184 Dali::Vector<PointSize26Dot6>& sizes);
187 * @copydoc Dali::TextAbstraction::FontClient::HasItalicStyle()
189 bool HasItalicStyle(FontId fontId) const;
192 * @copydoc Dali::TextAbstraction::FontClient::GetFontMetrics()
194 void GetFontMetrics(FontId fontId, FontMetrics& metrics);
197 * @copydoc Dali::TextAbstraction::FontClient::GetGlyphIndex()
199 GlyphIndex GetGlyphIndex(FontId fontId, Character charcode);
202 * @copydoc Dali::TextAbstraction::FontClient::GetGlyphIndex()
204 GlyphIndex GetGlyphIndex(FontId fontId, Character charcode, Character variantSelector);
207 * @copydoc Dali::TextAbstraction::FontClient::GetGlyphMetrics()
209 bool GetGlyphMetrics(GlyphInfo* array, uint32_t size, GlyphType type, bool horizontal);
212 * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, bool isItalicRequired, bool isBoldRequired, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth )
214 void CreateBitmap(FontId fontId, GlyphIndex glyphIndex, bool isItalicRequired, bool isBoldRequired, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth);
217 * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth )
219 PixelData CreateBitmap(FontId fontId, GlyphIndex glyphIndex, int outlineWidth);
222 * @copydoc Dali::TextAbstraction::FontClient::CreateVectorBlob()
224 void CreateVectorBlob(FontId fontId, GlyphIndex glyphIndex, VectorBlob*& blob, unsigned int& blobLength, unsigned int& nominalWidth, unsigned int& nominalHeight);
227 * @copydoc Dali::TextAbstraction::FontClient::GetEllipsisGlyph()
229 const GlyphInfo& GetEllipsisGlyph(PointSize26Dot6 requestedPointSize);
232 * @copydoc Dali::TextAbstraction::FontClient::IsColorGlyph()
234 bool IsColorGlyph(FontId fontId, GlyphIndex glyphIndex);
237 * @copydoc Dali::TextAbstraction::FontClient::CreateEmbeddedItem()
239 GlyphIndex CreateEmbeddedItem(const TextAbstraction::FontClient::EmbeddedItemDescription& description, Pixel::Format& pixelFormat);
242 * @copydoc Dali::TextAbstraction::FontClient::EnableAtlasLimitation(bool enabled)
244 void EnableAtlasLimitation(bool enabled);
247 * @copydoc Dali::TextAbstraction::FontClient::IsAtlasLimitationEnabled()
249 bool IsAtlasLimitationEnabled() const;
252 * @copydoc Dali::TextAbstraction::FontClient::GetMaximumTextAtlasSize()
254 Size GetMaximumTextAtlasSize() const;
257 * @copydoc Dali::TextAbstraction::FontClient::GetDefaultTextAtlasSize()
259 Size GetDefaultTextAtlasSize() const;
262 * @copydoc Dali::TextAbstraction::FontClient::GetCurrentMaximumBlockSizeFitInAtlas()
264 Size GetCurrentMaximumBlockSizeFitInAtlas() const;
267 * @copydoc Dali::TextAbstraction::FontClient::SetCurrentMaximumBlockSizeFitInAtlas(const Size& currentMaximumBlockSizeFitInAtlas)
269 bool SetCurrentMaximumBlockSizeFitInAtlas(const Size& currentMaximumBlockSizeFitInAtlas);
272 * @copydoc Dali::TextAbstraction::FontClient::GetNumberOfPointsPerOneUnitOfPointSize()
274 uint32_t GetNumberOfPointsPerOneUnitOfPointSize() const;
277 * @copydoc Dali::TextAbstraction::FontClient::AddCustomFontDirectory()
279 bool AddCustomFontDirectory(const FontPath& path);
281 public: // API for Dali::TextAbstraction::Internal::FontClient used.
283 * @brief Retrieves the pointer to the FreeType Font Face for the given @p fontId.
285 * @param[in] fontId The font id.
287 * @return The pointer to the FreeType Font Face.
289 FT_FaceRec_* GetFreetypeFace(FontId fontId);
292 * @brief Retrieves the type of font.
294 * @param[in] fontId The font id.
296 * @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.
298 FontDescription::Type GetFontType(FontId fontId);
301 * @brief Get the harfbuzz font data of font.
303 * @param fontId The font id.
304 * @return The harfbuzz font data, or nullptr if failed.
306 HarfBuzzFontHandle GetHarfBuzzFont(FontId fontId);
309 * @brief This is used to pre-cache fonts in order to improve the runtime performance of the application.
311 * @param[in] fallbackFamilyList A list of fallback font families to be pre-cached.
312 * @param[in] extraFamilyList A list of additional font families to be pre-cached.
313 * @param[in] localeFamily A locale font family to be pre-cached.
315 void FontPreCache(const FontFamilyList& fallbackFamilyList, const FontFamilyList& extraFamilyList, const FontFamily& localeFamily);
319 * Helper for lazy initialization.
323 // Undefined copy constructor.
324 FontClient(const FontClient&);
326 // Undefined assignment constructor.
327 FontClient& operator=(const FontClient&);
333 // Allows DPI to be set without loading plugin
334 unsigned int mDpiHorizontal;
335 unsigned int mDpiVertical;
337 static Dali::TextAbstraction::FontClient gPreInitializedFontClient;
338 static Dali::TextAbstraction::FontClient gPreCachedFontClient;
340 }; // class FontClient
342 } // namespace Internal
344 inline static Internal::FontClient& GetImplementation(FontClient& fontClient)
346 DALI_ASSERT_ALWAYS(fontClient && "fontClient handle is empty");
347 BaseObject& handle = fontClient.GetBaseObject();
348 return static_cast<Internal::FontClient&>(handle);
351 inline static const Internal::FontClient& GetImplementation(const FontClient& fontClient)
353 DALI_ASSERT_ALWAYS(fontClient && "fontClient handle is empty");
354 const BaseObject& handle = fontClient.GetBaseObject();
355 return static_cast<const Internal::FontClient&>(handle);
358 } // namespace TextAbstraction
362 #endif // DALI_INTERNAL_TEXT_ABSTRACTION_FONT_CLIENT_IMPL_H