From d8a28c83a0d0671086393c42275e4a2598445db5 Mon Sep 17 00:00:00 2001 From: Richard Huang Date: Tue, 5 Sep 2017 10:47:51 +0100 Subject: [PATCH] Retrieve outline glyph from freetype Change-Id: I352d6b4ab2d976e1ad7276cba9d96f7b9c6a3a01 --- .../text-abstraction/font-client.cpp | 8 ++--- .../devel-api/text-abstraction/font-client.h | 6 ++-- .../text-abstraction/font-client-impl.cpp | 8 ++--- .../text-abstraction/font-client-impl.h | 8 ++--- .../font-client-plugin-impl.cpp | 34 ++++++++++++++++--- .../font-client-plugin-impl.h | 10 +++--- 6 files changed, 52 insertions(+), 22 deletions(-) diff --git a/text/dali/devel-api/text-abstraction/font-client.cpp b/text/dali/devel-api/text-abstraction/font-client.cpp index 9c56a455b..90470d225 100644 --- a/text/dali/devel-api/text-abstraction/font-client.cpp +++ b/text/dali/devel-api/text-abstraction/font-client.cpp @@ -182,14 +182,14 @@ bool FontClient::GetGlyphMetrics( GlyphInfo* array, uint32_t size, GlyphType typ return GetImplementation(*this).GetGlyphMetrics( array, size, type, horizontal ); } -void FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, GlyphBufferData& data ) +void FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, GlyphBufferData& data, int outlineWidth ) { - GetImplementation(*this).CreateBitmap( fontId, glyphIndex, data ); + GetImplementation(*this).CreateBitmap( fontId, glyphIndex, data, outlineWidth ); } -PixelData FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex ) +PixelData FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth ) { - return GetImplementation(*this).CreateBitmap( fontId, glyphIndex ); + return GetImplementation(*this).CreateBitmap( fontId, glyphIndex, outlineWidth ); } void FontClient::CreateVectorBlob( FontId fontId, GlyphIndex glyphIndex, VectorBlob*& blob, unsigned int& blobLength, unsigned int& nominalWidth, unsigned int& nominalHeight ) diff --git a/text/dali/devel-api/text-abstraction/font-client.h b/text/dali/devel-api/text-abstraction/font-client.h index 0a8474d3e..8c8cfca8d 100644 --- a/text/dali/devel-api/text-abstraction/font-client.h +++ b/text/dali/devel-api/text-abstraction/font-client.h @@ -353,18 +353,20 @@ public: * @param[in] fontId The identifier of the font. * @param[in] glyphIndex The index of a glyph within the specified font. * @param[out] data The bitmap data. + * @param[in] outlineWidth The width of the glyph outline in pixels. */ - void CreateBitmap( FontId fontId, GlyphIndex glyphIndex, GlyphBufferData& data ); + void CreateBitmap( FontId fontId, GlyphIndex glyphIndex, GlyphBufferData& data, int outlineWidth ); /** * @brief Create a bitmap representation of a glyph. * * @param[in] fontId The identifier of the font. * @param[in] glyphIndex The index of a glyph within the specified font. + * @param[in] outlineWidth The width of the glyph outline in pixels. * * @return A valid BufferImage, or an empty handle if the glyph could not be rendered. */ - PixelData CreateBitmap( FontId fontId, GlyphIndex glyphIndex ); + PixelData CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth ); /** * @brief Create a vector representation of a glyph. diff --git a/text/dali/internal/text-abstraction/font-client-impl.cpp b/text/dali/internal/text-abstraction/font-client-impl.cpp index 2c9948b68..4ab90bf19 100644 --- a/text/dali/internal/text-abstraction/font-client-impl.cpp +++ b/text/dali/internal/text-abstraction/font-client-impl.cpp @@ -246,18 +246,18 @@ bool FontClient::GetGlyphMetrics( GlyphInfo* array, uint32_t size, GlyphType typ return mPlugin->GetGlyphMetrics( array, size, type, horizontal ); } -void FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, Dali::TextAbstraction::FontClient::GlyphBufferData& data ) +void FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth ) { CreatePlugin(); - mPlugin->CreateBitmap( fontId, glyphIndex, data ); + mPlugin->CreateBitmap( fontId, glyphIndex, data, outlineWidth ); } -PixelData FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex ) +PixelData FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth ) { CreatePlugin(); - return mPlugin->CreateBitmap( fontId, glyphIndex ); + return mPlugin->CreateBitmap( fontId, glyphIndex, outlineWidth ); } void FontClient::CreateVectorBlob( FontId fontId, GlyphIndex glyphIndex, VectorBlob*& blob, unsigned int& blobLength, unsigned int& nominalWidth, unsigned int& nominalHeight ) diff --git a/text/dali/internal/text-abstraction/font-client-impl.h b/text/dali/internal/text-abstraction/font-client-impl.h index a13715cb3..cfa3a20c5 100644 --- a/text/dali/internal/text-abstraction/font-client-impl.h +++ b/text/dali/internal/text-abstraction/font-client-impl.h @@ -169,14 +169,14 @@ public: bool GetGlyphMetrics( GlyphInfo* array, uint32_t size, GlyphType type, bool horizontal ); /** - * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, Dali::TextAbstraction::FontClient::GlyphBufferData& data ) + * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth ) */ - void CreateBitmap( FontId fontId, GlyphIndex glyphIndex, Dali::TextAbstraction::FontClient::GlyphBufferData& data ); + void CreateBitmap( FontId fontId, GlyphIndex glyphIndex, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth ); /** - * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex ) + * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth ) */ - PixelData CreateBitmap( FontId fontId, GlyphIndex glyphIndex ); + PixelData CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth ); /** * @copydoc Dali::TextAbstraction::FontClient::CreateVectorBlob() diff --git a/text/dali/internal/text-abstraction/font-client-plugin-impl.cpp b/text/dali/internal/text-abstraction/font-client-plugin-impl.cpp index 6e7d2946f..a1e4cc68f 100644 --- a/text/dali/internal/text-abstraction/font-client-plugin-impl.cpp +++ b/text/dali/internal/text-abstraction/font-client-plugin-impl.cpp @@ -1084,7 +1084,7 @@ bool FontClient::Plugin::GetVectorMetrics( GlyphInfo* array, #endif } -void FontClient::Plugin::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, Dali::TextAbstraction::FontClient::GlyphBufferData& data ) +void FontClient::Plugin::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth ) { if( ( fontId > 0 ) && ( fontId - 1u < mFontCache.size() ) ) @@ -1114,6 +1114,33 @@ void FontClient::Plugin::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, Dal { if( glyph->format != FT_GLYPH_FORMAT_BITMAP ) { + // Check whether we should create a bitmap for the outline + if( glyph->format == FT_GLYPH_FORMAT_OUTLINE && outlineWidth > 0 ) + { + // Set up a stroker + FT_Stroker stroker; + error = FT_Stroker_New(mFreeTypeLibrary, &stroker ); + + if ( FT_Err_Ok == error ) + { + FT_Stroker_Set( stroker, outlineWidth * 64, FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0 ); + error = FT_Glyph_StrokeBorder( &glyph, stroker, 0, 1 ); + + if ( FT_Err_Ok == error ) + { + FT_Stroker_Done( stroker ); + } + else + { + DALI_LOG_ERROR( "FT_Glyph_StrokeBorder Failed with error: %d\n", error ); + } + } + else + { + DALI_LOG_ERROR( "FT_Stroker_New Failed with error: %d\n", error ); + } + } + error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, 0, 1 ); if ( FT_Err_Ok == error ) { @@ -1141,12 +1168,11 @@ void FontClient::Plugin::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, Dal } } -PixelData FontClient::Plugin::CreateBitmap( FontId fontId, - GlyphIndex glyphIndex ) +PixelData FontClient::Plugin::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth ) { TextAbstraction::FontClient::GlyphBufferData data; - CreateBitmap( fontId, glyphIndex, data ); + CreateBitmap( fontId, glyphIndex, data, outlineWidth ); return PixelData::New( data.buffer, data.width * data.height * Pixel::GetBytesPerPixel( data.format ), diff --git a/text/dali/internal/text-abstraction/font-client-plugin-impl.h b/text/dali/internal/text-abstraction/font-client-plugin-impl.h index d0601e779..c1e158fa1 100644 --- a/text/dali/internal/text-abstraction/font-client-plugin-impl.h +++ b/text/dali/internal/text-abstraction/font-client-plugin-impl.h @@ -33,6 +33,8 @@ class VectorFontCache; #include #include FT_FREETYPE_H #include FT_GLYPH_H +#include FT_OUTLINE_H +#include FT_STROKER_H // forward declarations of font config types. struct _FcCharSet; @@ -295,14 +297,14 @@ struct FontClient::Plugin bool GetVectorMetrics( GlyphInfo* array, uint32_t size, bool horizontal ); /** - * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, Dali::TextAbstraction::FontClient::GlyphBufferData& data ) + * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth ) */ - void CreateBitmap( FontId fontId, GlyphIndex glyphIndex, Dali::TextAbstraction::FontClient::GlyphBufferData& data ); + void CreateBitmap( FontId fontId, GlyphIndex glyphIndex, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth ); /** - * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex ) + * @copydoc Dali::TextAbstraction::FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth ) */ - PixelData CreateBitmap( FontId fontId, GlyphIndex glyphIndex ); + PixelData CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth ); /** * @copydoc Dali::TextAbstraction::FontClient::CreateVectorBlob() -- 2.34.1