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 * @copydoc Dali::TextAbstraction::FontClient::ClearCache()
72 * @copydoc Dali::TextAbstraction::FontClient::SetDpi()
74 void SetDpi(unsigned int horizontalDpi, unsigned int verticalDpi);
77 * @copydoc Dali::TextAbstraction::FontClient::GetDpi()
79 void GetDpi(unsigned int& horizontalDpi, unsigned int& verticalDpi);
82 * @copydoc Dali::TextAbstraction::FontClient::GetDefaultFontSize()
84 int GetDefaultFontSize();
87 * @copydoc Dali::TextAbstraction::FontClient::ResetSystemDefaults()
89 void ResetSystemDefaults();
92 * @copydoc Dali::TextAbstraction::FontClient::GetDefaultFonts()
94 void GetDefaultFonts(FontList& defaultFonts);
97 * @copydoc Dali::TextAbstraction::FontClient::GetDefaultPlatformFontDescription()
99 void GetDefaultPlatformFontDescription(FontDescription& fontDescription);
102 * @copydoc Dali::TextAbstraction::FontClient::GetSystemFonts()
104 void GetSystemFonts(FontList& systemFonts);
107 * @copydoc Dali::TextAbstraction::FontClient::GetDescription()
109 void GetDescription(FontId fontId, FontDescription& fontDescription);
112 * @copydoc Dali::TextAbstraction::FontClient::GetPointSize()
114 PointSize26Dot6 GetPointSize(FontId fontId);
117 * @copydoc Dali::TextAbstraction::FontClient::IsCharacterSupportedByFont()
119 bool IsCharacterSupportedByFont(FontId fontId, Character character);
122 * @copydoc Dali::TextAbstraction::FontClient::FindDefaultFont()
124 FontId FindDefaultFont(Character charcode,
125 PointSize26Dot6 requestedPointSize,
129 * @copydoc Dali::TextAbstraction::FontClient::FindFallbackFont()
131 FontId FindFallbackFont(Character charcode,
132 const FontDescription& preferredFontDescription,
133 PointSize26Dot6 requestedPointSize,
137 * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const FontPath& path, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex )
139 FontId GetFontId(const FontPath& path, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex);
142 * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const FontDescription& fontDescription, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex )
144 FontId GetFontId(const FontDescription& fontDescription,
145 PointSize26Dot6 requestedPointSize,
146 FaceIndex faceIndex);
149 * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const BitmapFont& bitmapFont )
151 FontId GetFontId(const BitmapFont& bitmapFont);
154 * @copydoc Dali::TextAbstraction::FontClient::IsScalable( const FontPath& path )
156 bool IsScalable(const FontPath& path);
159 * @copydoc Dali::TextAbstraction::FontClient::IsScalable( const FontDescription& fontDescription )
161 bool IsScalable(const FontDescription& fontDescription);
164 * @copydoc Dali::TextAbstraction::FontClient::GetFixedSizes( const FontPath& path, Dali::Vector< PointSize26Dot6>& sizes )
166 void GetFixedSizes(const FontPath& path, Dali::Vector<PointSize26Dot6>& sizes);
169 * @copydoc Dali::TextAbstraction::FontClient::GetFixedSizes()
171 void GetFixedSizes(const FontDescription& fontDescription,
172 Dali::Vector<PointSize26Dot6>& sizes);
175 * @copydoc Dali::TextAbstraction::FontClient::HasItalicStyle()
177 bool HasItalicStyle(FontId fontId) const;
180 * @copydoc Dali::TextAbstraction::FontClient::GetFontMetrics()
182 void GetFontMetrics(FontId fontId, FontMetrics& metrics);
185 * @copydoc Dali::TextAbstraction::FontClient::GetGlyphIndex()
187 GlyphIndex GetGlyphIndex(FontId fontId, Character charcode);
190 * @copydoc Dali::TextAbstraction::FontClient::GetGlyphIndex()
192 GlyphIndex GetGlyphIndex(FontId fontId, Character charcode, Character variantSelector);
195 * @copydoc Dali::TextAbstraction::FontClient::GetGlyphMetrics()
197 bool GetGlyphMetrics(GlyphInfo* array, uint32_t size, GlyphType type, bool horizontal);
200 * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, bool isItalicRequired, bool isBoldRequired, Dali::TextAbstraction::GlyphBufferData& data, int outlineWidth )
202 void CreateBitmap(FontId fontId, GlyphIndex glyphIndex, bool isItalicRequired, bool isBoldRequired, Dali::TextAbstraction::GlyphBufferData& data, int outlineWidth);
205 * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth )
207 PixelData CreateBitmap(FontId fontId, GlyphIndex glyphIndex, int outlineWidth);
210 * @copydoc Dali::TextAbstraction::FontClient::CreateVectorBlob()
212 void CreateVectorBlob(FontId fontId, GlyphIndex glyphIndex, VectorBlob*& blob, unsigned int& blobLength, unsigned int& nominalWidth, unsigned int& nominalHeight);
215 * @copydoc Dali::TextAbstraction::FontClient::GetEllipsisGlyph()
217 const GlyphInfo& GetEllipsisGlyph(PointSize26Dot6 requestedPointSize);
220 * @copydoc Dali::TextAbstraction::FontClient::IsColorGlyph()
222 bool IsColorGlyph(FontId fontId, GlyphIndex glyphIndex);
225 * @copydoc Dali::TextAbstraction::FontClient::CreateEmbeddedItem()
227 GlyphIndex CreateEmbeddedItem(const TextAbstraction::FontClient::EmbeddedItemDescription& description, Pixel::Format& pixelFormat);
230 * @copydoc Dali::TextAbstraction::FontClient::EnableAtlasLimitation(bool enabled)
232 void EnableAtlasLimitation(bool enabled);
235 * @copydoc Dali::TextAbstraction::FontClient::IsAtlasLimitationEnabled()
237 bool IsAtlasLimitationEnabled() const;
240 * @copydoc Dali::TextAbstraction::FontClient::GetMaximumTextAtlasSize()
242 Size GetMaximumTextAtlasSize() const;
245 * @copydoc Dali::TextAbstraction::FontClient::GetDefaultTextAtlasSize()
247 Size GetDefaultTextAtlasSize() const;
250 * @copydoc Dali::TextAbstraction::FontClient::GetCurrentMaximumBlockSizeFitInAtlas()
252 Size GetCurrentMaximumBlockSizeFitInAtlas() const;
255 * @copydoc Dali::TextAbstraction::FontClient::SetCurrentMaximumBlockSizeFitInAtlas(const Size& currentMaximumBlockSizeFitInAtlas)
257 bool SetCurrentMaximumBlockSizeFitInAtlas(const Size& currentMaximumBlockSizeFitInAtlas);
260 * @copydoc Dali::TextAbstraction::FontClient::GetNumberOfPointsPerOneUnitOfPointSize()
262 uint32_t GetNumberOfPointsPerOneUnitOfPointSize() const;
265 * @copydoc Dali::TextAbstraction::FontClient::AddCustomFontDirectory()
267 bool AddCustomFontDirectory(const FontPath& path);
269 public: // API for Dali::TextAbstraction::Internal::FontClient used.
271 * @brief Retrieves the pointer to the FreeType Font Face for the given @p fontId.
273 * @param[in] fontId The font id.
275 * @return The pointer to the FreeType Font Face.
277 FT_FaceRec_* GetFreetypeFace(FontId fontId);
280 * @brief Retrieves the type of font.
282 * @param[in] fontId The font id.
284 * @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.
286 FontDescription::Type GetFontType(FontId fontId);
289 * @brief Get the harfbuzz font data of font.
291 * @param fontId The font id.
292 * @return The harfbuzz font data, or nullptr if failed.
294 HarfBuzzFontHandle GetHarfBuzzFont(FontId fontId);
298 * Helper for lazy initialization.
302 // Undefined copy constructor.
303 FontClient(const FontClient&);
305 // Undefined assignment constructor.
306 FontClient& operator=(const FontClient&);
312 // Allows DPI to be set without loading plugin
313 unsigned int mDpiHorizontal;
314 unsigned int mDpiVertical;
316 static Dali::TextAbstraction::FontClient gPreInitializedFontClient;
318 }; // class FontClient
320 } // namespace Internal
322 inline static Internal::FontClient& GetImplementation(FontClient& fontClient)
324 DALI_ASSERT_ALWAYS(fontClient && "fontClient handle is empty");
325 BaseObject& handle = fontClient.GetBaseObject();
326 return static_cast<Internal::FontClient&>(handle);
329 inline static const Internal::FontClient& GetImplementation(const FontClient& fontClient)
331 DALI_ASSERT_ALWAYS(fontClient && "fontClient handle is empty");
332 const BaseObject& handle = fontClient.GetBaseObject();
333 return static_cast<const Internal::FontClient&>(handle);
336 } // namespace TextAbstraction
340 #endif // DALI_INTERNAL_TEXT_ABSTRACTION_FONT_CLIENT_IMPL_H