1 #ifndef DALI_INTERNAL_TEXT_ABSTRACTION_FONT_CLIENT_PLUGIN_IMPL_H
2 #define DALI_INTERNAL_TEXT_ABSTRACTION_FONT_CLIENT_PLUGIN_IMPL_H
5 * Copyright (c) 2018 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/devel-api/text-abstraction/bitmap-font.h>
23 #include <dali/devel-api/text-abstraction/font-metrics.h>
24 #include <dali/devel-api/text-abstraction/glyph-info.h>
25 #include <dali/internal/text/text-abstraction/font-client-impl.h>
26 #include <dali/devel-api/adaptor-framework/pixel-buffer.h>
28 #ifdef ENABLE_VECTOR_BASED_TEXT_RENDERING
29 #include <dali/internal/text/glyphy/vector-font-cache.h>
31 class VectorFontCache;
36 #include FT_FREETYPE_H
40 #include FT_SYNTHESIS_H
42 // forward declarations of font config types.
50 namespace TextAbstraction
57 * @brief Type used for indices addressing the vector with front descriptions of validated fonts.
59 typedef uint32_t FontDescriptionId;
62 * @brief Type used for indices addressing the vector with pixel buffers.
64 typedef uint32_t PixelBufferId;
67 * @brief Vector of character sets.
69 typedef Vector<_FcCharSet*> CharacterSetList;
72 * @brief FontClient implementation.
74 struct FontClient::Plugin
76 struct FontIdCacheItem
78 FontDescription::Type type; ///< The type of font.
79 FontId id; ///< Index to the cache of fonts for the specified type.
83 * @brief Caches an list of fallback fonts for a given font-description
85 struct FallbackCacheItem
87 FallbackCacheItem( FontDescription&& fontDescription, FontList* fallbackFonts, CharacterSetList* characterSets );
89 FontDescription fontDescription; ///< The font description.
90 FontList* fallbackFonts; ///< The list of fallback fonts for the given font-description.
91 CharacterSetList* characterSets; ///< The list of character sets for the given font-description.
95 * @brief Caches an index to the vector of font descriptions for a given font.
97 struct FontDescriptionCacheItem
99 FontDescriptionCacheItem( const FontDescription& fontDescription,
100 FontDescriptionId index );
101 FontDescriptionCacheItem( FontDescription&& fontDescription,
102 FontDescriptionId index );
104 FontDescription fontDescription; ///< The font description.
105 FontDescriptionId index; ///< Index to the vector of font descriptions.
109 * @brief Caches the font id of the pair font point size and the index to the vector of font descriptions of validated fonts.
111 struct FontDescriptionSizeCacheItem
113 FontDescriptionSizeCacheItem( FontDescriptionId validatedFontId,
114 PointSize26Dot6 requestedPointSize,
117 FontDescriptionId validatedFontId; ///< Index to the vector with font descriptions.
118 PointSize26Dot6 requestedPointSize; ///< The font point size.
119 FontId fontId; ///< The font identifier.
123 * @brief Caches the FreeType face and font metrics of the triplet 'path to the font file name, font point size and face index'.
125 struct FontFaceCacheItem
127 FontFaceCacheItem( FT_Face ftFace,
128 const FontPath& path,
129 PointSize26Dot6 requestedPointSize,
131 const FontMetrics& metrics );
133 FontFaceCacheItem( FT_Face ftFace,
134 const FontPath& path,
135 PointSize26Dot6 requestedPointSize,
137 const FontMetrics& metrics,
141 bool hasColorTables );
143 FT_Face mFreeTypeFace; ///< The FreeType face.
144 FontPath mPath; ///< The path to the font file name.
145 PointSize26Dot6 mRequestedPointSize; ///< The font point size.
146 FaceIndex mFaceIndex; ///< The face index.
147 FontMetrics mMetrics; ///< The font metrics.
148 _FcCharSet* mCharacterSet; ///< Pointer with the range of characters.
149 int mFixedSizeIndex; ///< Index to the fixed size table for the requested size.
150 float mFixedWidthPixels; ///< The height in pixels (fixed size bitmaps only)
151 float mFixedHeightPixels; ///< The height in pixels (fixed size bitmaps only)
152 unsigned int mVectorFontId; ///< The ID of the equivalent vector-based font
153 FontId mFontId; ///< Index to the vector with the cache of font's ids.
154 bool mIsFixedSizeBitmap : 1; ///< Whether the font has fixed size bitmaps.
155 bool mHasColorTables : 1; ///< Whether the font has color tables.
160 PointSize26Dot6 requestedPointSize;
165 * @brief Caches pixel buffers.
167 struct PixelBufferCacheItem
169 Devel::PixelBuffer pixelBuffer; ///< The pixel buffer loaded from the url.
170 std::string url; ///< The url.
174 * @brief Caches embedded items.
178 PixelBufferId pixelBufferId; ///< Index to the vector of pixel buffers
179 unsigned int width; ///< The desired width.
180 unsigned int height; ///< The desired height.
184 * @brief Stores a bitmap font and its pixel buffers per glyph.
186 struct BitmapFontCacheItem
188 BitmapFont font; ///< The bitmap font.
189 std::vector<Devel::PixelBuffer> pixelBuffers; ///< The pixel buffers of the glyphs.
190 FontId id; ///< Index to the vector with the cache of font's ids.
196 * Initializes the FreeType library.
197 * Initializes the dpi values.
199 * @param[in] horizontalDpi The horizontal dpi.
200 * @param[in] verticalDpi The vertical dpi.
202 Plugin( unsigned int horizontalDpi, unsigned int verticalDpi );
205 * Default destructor.
207 * Frees any allocated resource.
212 * @copydoc Dali::TextAbstraction::FontClient::ClearCache()
217 * @copydoc Dali::TextAbstraction::FontClient::SetDpi()
219 void SetDpi( unsigned int horizontalDpi, unsigned int verticalDpi );
222 * @copydoc Dali::TextAbstraction::FontClient::ResetSystemDefaults()
224 void ResetSystemDefaults();
227 * @copydoc Dali::TextAbstraction::FontClient::SetDefaultFont()
229 void SetDefaultFont( const FontDescription& preferredFontDescription );
232 * @copydoc Dali::TextAbstraction::FontClient::GetDefaultPlatformFontDescription()
234 void GetDefaultPlatformFontDescription( FontDescription& fontDescription );
237 * @copydoc Dali::TextAbstraction::FontClient::GetDefaultFonts()
239 void GetDefaultFonts( FontList& defaultFonts );
242 * @copydoc Dali::TextAbstraction::FontClient::GetSystemFonts()
244 void GetSystemFonts( FontList& systemFonts );
247 * @copydoc Dali::TextAbstraction::FontClient::GetDescription()
249 void GetDescription( FontId id, FontDescription& fontDescription ) const;
252 * @copydoc Dali::TextAbstraction::FontClient::GetPointSize()
254 PointSize26Dot6 GetPointSize( FontId id );
257 * @copydoc Dali::TextAbstraction::FontClient::IsCharacterSupportedByFont()
259 bool IsCharacterSupportedByFont( FontId fontId, Character character );
262 * @brief Finds within the @p fontList a font which support the @p carcode.
264 * @param[in] fontList A list of font paths, family, width, weight and slant.
265 * @param[in] characterSetList A list that contains a character set for each description of the font list.
266 * @param[in] charcode The character for which a font is needed.
267 * @param[in] requestedPointSize The point size in 26.6 fractional points.
268 * @param[in] preferColor @e true if a color font is preferred.
270 * @return A valid font identifier, or zero if no font is found.
272 FontId FindFontForCharacter( const FontList& fontList,
273 const CharacterSetList& characterSetList,
275 PointSize26Dot6 requestedPointSize,
279 * @copydoc Dali::TextAbstraction::FontClient::FindDefaultFont()
281 FontId FindDefaultFont( Character charcode,
282 PointSize26Dot6 requestedPointSize,
286 * @copydoc Dali::TextAbstraction::FontClient::FindFallbackFont()
288 FontId FindFallbackFont( Character charcode,
289 const FontDescription& preferredFontDescription,
290 PointSize26Dot6 requestedPointSize,
294 * @see Dali::TextAbstraction::FontClient::GetFontId( const FontPath& path, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex )
296 * @param[in] cacheDescription Whether to cache the font description.
298 FontId GetFontId( const FontPath& path,
299 PointSize26Dot6 requestedPointSize,
301 bool cacheDescription );
304 * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const FontDescription& preferredFontDescription, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex )
306 FontId GetFontId( const FontDescription& fontDescription,
307 PointSize26Dot6 requestedPointSize,
308 FaceIndex faceIndex );
311 * @copydoc Dali::TextAbstraction::FontClient::GetFontId( const BitmapFont& bitmapFont )
313 FontId GetFontId( const BitmapFont& bitmapFont );
316 * @copydoc Dali::TextAbstraction::FontClient::IsScalable( const FontPath& path )
318 bool IsScalable( const FontPath& path );
321 * @copydoc Dali::TextAbstraction::FontClient::IsScalable( const FontDescription& fontDescription )
323 bool IsScalable( const FontDescription& fontDescription );
326 * @copydoc Dali::TextAbstraction::FontClient::GetFixedSizes()
328 void GetFixedSizes( const FontPath& path, Dali::Vector< PointSize26Dot6>& sizes );
331 * @copydoc Dali::TextAbstraction::FontClient::GetFixedSizes()
333 void GetFixedSizes( const FontDescription& fontDescription,
334 Dali::Vector< PointSize26Dot6 >& sizes );
337 * @copydoc Dali::TextAbstraction::FontClient::HasItalicStyle()
339 bool HasItalicStyle( FontId fontId ) const;
342 * @copydoc Dali::TextAbstraction::FontClient::GetFontMetrics()
344 void GetFontMetrics( FontId fontId, FontMetrics& metrics );
347 * @copydoc Dali::TextAbstraction::FontClient::GetGlyphIndex()
349 GlyphIndex GetGlyphIndex( FontId fontId, Character charcode );
352 * @copydoc Dali::TextAbstraction::FontClient::GetGlyphMetrics()
354 bool GetGlyphMetrics( GlyphInfo* array, uint32_t size, GlyphType type, bool horizontal );
357 * Helper for GetGlyphMetrics when using bitmaps
359 bool GetBitmapMetrics( GlyphInfo* array, uint32_t size, bool horizontal );
362 * Helper for GetGlyphMetrics when using vectors
364 bool GetVectorMetrics( GlyphInfo* array, uint32_t size, bool horizontal );
367 * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, bool isItalicRequired, bool isBoldRequired, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth )
369 void CreateBitmap( FontId fontId, GlyphIndex glyphIndex, bool isItalicRequired, bool isBoldRequired, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth );
372 * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth )
374 PixelData CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth );
377 * @copydoc Dali::TextAbstraction::FontClient::CreateVectorBlob()
379 void CreateVectorBlob( FontId fontId, GlyphIndex glyphIndex, VectorBlob*& blob, unsigned int& blobLength, unsigned int& nominalWidth, unsigned int& nominalHeight );
382 * @copydoc Dali::TextAbstraction::FontClient::GetEllipsisGlyph()
384 const GlyphInfo& GetEllipsisGlyph( PointSize26Dot6 requestedPointSize );
387 * @copydoc Dali::TextAbstraction::FontClient::IsColorGlyph()
389 bool IsColorGlyph( FontId fontId, GlyphIndex glyphIndex );
392 * @copydoc Dali::TextAbstraction::FontClient::CreateEmbeddedItem()
394 GlyphIndex CreateEmbeddedItem( const TextAbstraction::FontClient::EmbeddedItemDescription& description, Pixel::Format& pixelFormat );
397 * @copydoc Dali::TextAbstraction::Internal::FontClient::GetFreetypeFace()
399 FT_FaceRec_* GetFreetypeFace( FontId fontId );
402 * @copydoc Dali::TextAbstraction::Internal::FontClient::GetFontType()
404 FontDescription::Type GetFontType( FontId fontId );
407 * @copydoc Dali::TextAbstraction::FontClient::AddCustomFontDirectory()
409 bool AddCustomFontDirectory( const FontPath& path );
414 * @brief Caches the fonts present in the platform.
416 * Calls GetFcFontSet() to retrieve the fonts.
418 void InitSystemFonts();
421 * @brief Gets the FontDescription which matches the given pattern.
423 * @note The reference counter of the @p characterSet has been increased. Call FcCharSetDestroy to decrease it.
425 * @param[in] pattern pattern to match against.
426 * @param[out] fontDescription the resultant fontDescription that matched.
427 * @param[out] characterSet The character set for that pattern.
428 * @return true if match found.
430 bool MatchFontDescriptionToPattern( _FcPattern* pattern, Dali::TextAbstraction::FontDescription& fontDescription, _FcCharSet** characterSet );
433 * @brief Creates a font family pattern used to match fonts.
435 * @note Need to call FcPatternDestroy to free the resources.
437 * @param[in] fontDescription The font to cache.
439 * @return The pattern.
441 _FcPattern* CreateFontFamilyPattern( const FontDescription& fontDescription ) const;
444 * @brief Retrieves the fonts present in the platform.
446 * @note Need to call FcFontSetDestroy to free the allocated resources.
448 * @return A font fonfig data structure with the platform's fonts.
450 _FcFontSet* GetFcFontSet() const;
453 * @brief Retrieves a font config object's value from a pattern.
455 * @param[in] pattern The font config pattern.
456 * @param[in] n The object.
457 * @param[out] string The object's value.
459 * @return @e true if the operation is successful.
461 bool GetFcString( const _FcPattern* const pattern, const char* const n, std::string& string );
464 * @brief Retrieves a font config object's value from a pattern.
466 * @param[in] pattern The font config pattern.
467 * @param[in] n The object.
468 * @param[out] intVal The object's value.
470 * @return @e true if the operation is successful.
472 bool GetFcInt( const _FcPattern* const pattern, const char* const n, int& intVal );
475 * @brief Creates a font.
477 * @param[in] path The path to the font file name.
478 * @param[in] requestedPointSize The requested point size.
479 * @param[in] faceIndex A face index.
480 * @param[in] cacheDescription Whether to cache the font description.
482 * @return The font identifier.
484 FontId CreateFont( const FontPath& path,
485 PointSize26Dot6 requestedPointSize,
487 bool cacheDescription );
490 * @brief Copy the color bitmap given in @p srcBuffer to @p data.
492 * @param[out] data The bitmap data.
493 * @param[in] srcWidth The width of the bitmap.
494 * @param[in] srcHeight The height of the bitmap.
495 * @param[in] srcBuffer The buffer of the bitmap.
497 void ConvertBitmap( TextAbstraction::FontClient::GlyphBufferData& data, unsigned int srcWidth, unsigned int srcHeight, const unsigned char* const srcBuffer );
500 * @brief Copy the FreeType bitmap to the given buffer.
502 * @param[out] data The bitmap data.
503 * @param[in] srcBitmap The FreeType bitmap.
504 * @param[in] isShearRequired Whether the bitmap needs a shear transform (for software italics).
506 void ConvertBitmap( TextAbstraction::FontClient::GlyphBufferData& data, FT_Bitmap srcBitmap, bool isShearRequired );
509 * @brief Finds in the cache if there is a triplet with the path to the font file name, the font point size and the face index.
510 * If there is one , if writes the font identifier in the param @p fontId.
512 * @param[in] path Path to the font file name.
513 * @param[in] requestedPointSize The font point size.
514 * @param[in] faceIndex The face index.
515 * @param[out] fontId The font identifier.
517 * @return @e true if there triplet is found.
519 bool FindFont( const FontPath& path, PointSize26Dot6 requestedPointSize, FaceIndex faceIndex, FontId& fontId ) const;
522 * @brief Finds in the cache a cluster 'font family, font width, font weight, font slant'
523 * If there is one, it writes the index to the vector with font descriptions in the param @p validatedFontId.
525 * @param[in] fontDescription The font to validate.
526 * @param[out] validatedFontId The index to the vector with font descriptions.
528 * @return @e true if the pair is found.
530 bool FindValidatedFont( const FontDescription& fontDescription,
531 FontDescriptionId& validatedFontId );
534 * @brief Finds a fallback font list from the cache for a given font-description
536 * @param[in] fontDescription The font to validate.
537 * @param[out] A valid pointer to a font list, or @e nullptr if not found.
538 * @param[out] characterSetList A valid pointer to a character set list, or @e nullptr if not found.
540 bool FindFallbackFontList( const FontDescription& fontDescription,
542 CharacterSetList*& characterSetList );
545 * @brief Finds in the cache a pair 'validated font identifier and font point size'.
546 * If there is one it writes the font identifier in the param @p fontId.
548 * @param[in] validatedFontId Index to the vector with font descriptions.
549 * @param[in] requestedPointSize The font point size.
550 * @param[out] fontId The font identifier.
552 * @return @e true if the pair is found.
554 bool FindFont( FontDescriptionId validatedFontId,
555 PointSize26Dot6 requestedPointSize,
559 * @brief Finds in the cache a bitmap font with the @p bitmapFont family name.
561 * @param[in] bitmapFont The font's family name.
562 * @param[out] fontId The id of the font.
564 * @return Whether the font has been found.
566 bool FindBitmapFont( const FontFamily& bitmapFont, FontId& fontId ) const;
569 * @brief Validate a font description.
571 * @param[in] fontDescription The font to validate.
572 * @param[out] validatedFontId Result of validation
574 void ValidateFont( const FontDescription& fontDescription,
575 FontDescriptionId& validatedFontId );
578 * @brief Helper for GetDefaultFonts etc.
580 * @note CharacterSetList is a vector of FcCharSet that are reference counted. It's needed to call FcCharSetDestroy to decrease the reference counter.
582 * @param[in] fontDescription A font description.
583 * @param[out] fontList A list of the fonts which are a close match for fontDescription.
584 * @param[out] characterSetList A list of character sets which are a close match for fontDescription.
586 void SetFontList( const FontDescription& fontDescription, FontList& fontList, CharacterSetList& characterSetList );
589 * Caches a font path.
591 * @param[in] ftFace The FreeType face.
592 * @param[in] id The font identifier.
593 * @param[in] requestedPointSize The font point size.
594 * @param[in] path Path to the font file name.
596 void CacheFontPath( FT_Face ftFace, FontId id, PointSize26Dot6 requestedPointSize, const FontPath& path );
599 * @brief Creates a character set from a given font's @p description.
601 * @note Need to call FcCharSetDestroy to free the resources.
603 * @param[in] description The font's description.
605 * @return A character set.
607 _FcCharSet* CreateCharacterSetFromDescription( const FontDescription& description );
610 * @brief Free the resources allocated in the fallback cache.
612 * @param[in] fallbackCache The fallback cache.
614 void ClearFallbackCache( std::vector<FallbackCacheItem>& fallbackCache );
617 * @brief Free the resources allocated by the FcCharSet objects.
619 void ClearCharacterSetFromFontFaceCache();
623 // Declared private and left undefined to avoid copies.
624 Plugin( const Plugin& );
625 // Declared private and left undefined to avoid copies.
626 Plugin& operator=( const Plugin& );
630 FT_Library mFreeTypeLibrary; ///< A handle to a FreeType library instance.
632 unsigned int mDpiHorizontal; ///< Horizontal dpi.
633 unsigned int mDpiVertical; ///< Vertical dpi.
635 FontDescription mDefaultFontDescription; ///< The cached default font from the system
637 FontList mSystemFonts; ///< Cached system fonts.
638 FontList mDefaultFonts; ///< Cached default fonts.
639 CharacterSetList mDefaultFontCharacterSets;
641 std::vector<FallbackCacheItem> mFallbackCache; ///< Cached fallback font lists.
643 Vector<FontIdCacheItem> mFontIdCache;
644 std::vector<FontFaceCacheItem> mFontFaceCache; ///< Caches the FreeType face and font metrics of the triplet 'path to the font file name, font point size and face index'.
645 std::vector<FontDescriptionCacheItem> mValidatedFontCache; ///< Caches indices to the vector of font descriptions for a given font.
646 FontList mFontDescriptionCache; ///< Caches font descriptions for the validated font.
647 CharacterSetList mCharacterSetCache; ///< Caches character set lists for the validated font.
648 std::vector<FontDescriptionSizeCacheItem> mFontDescriptionSizeCache; ///< Caches font identifiers for the pairs of font point size and the index to the vector with font descriptions of the validated fonts.
650 VectorFontCache* mVectorFontCache; ///< Separate cache for vector data blobs etc.
652 Vector<EllipsisItem> mEllipsisCache; ///< Caches ellipsis glyphs for a particular point size.
653 std::vector<PixelBufferCacheItem> mPixelBufferCache; ///< Caches the pixel buffer of a url.
654 Vector<EmbeddedItem> mEmbeddedItemCache; ///< Cache embedded items.
655 std::vector<BitmapFontCacheItem> mBitmapFontCache; ///< Stores bitmap fonts.
657 bool mDefaultFontDescriptionCached : 1; ///< Whether the default font is cached or not
660 } // namespace Internal
662 } // namespace TextAbstraction
666 #endif // DALI_INTERNAL_TEXT_ABSTRACTION_FONT_CLIENT_PLUGIN_IMPL_H