From 1d0cd4e64bd487a424f9179a673b082e9983fbc2 Mon Sep 17 00:00:00 2001 From: Victor Cebollada Date: Mon, 16 Feb 2015 09:20:48 +0000 Subject: [PATCH] Text segmentation implementation Change-Id: I923a98e88181cd291d84f55fbc23940b3b02d30e Signed-off-by: Victor Cebollada --- dali-toolkit/public-api/text/logical-model.cpp | 20 ++++++++++++----- dali-toolkit/public-api/text/segmentation.cpp | 29 +++++++++++++++++++++++++ dali-toolkit/public-api/text/text-definitions.h | 18 +++++++-------- 3 files changed, 53 insertions(+), 14 deletions(-) diff --git a/dali-toolkit/public-api/text/logical-model.cpp b/dali-toolkit/public-api/text/logical-model.cpp index 6d22f3a..09a590c 100644 --- a/dali-toolkit/public-api/text/logical-model.cpp +++ b/dali-toolkit/public-api/text/logical-model.cpp @@ -38,9 +38,11 @@ namespace Text struct LogicalModel::Impl { - Vector mText; - Vector mScriptRuns; - Vector mFontRuns; + Vector mText; + Vector mScriptRuns; + Vector mFontRuns; + Vector mLineBreakInfo; + Vector mWordBreakInfo; }; LogicalModelPtr LogicalModel::New() @@ -245,33 +247,41 @@ FontId LogicalModel::GetFont( CharacterIndex characterIndex ) const void LogicalModel::SetLineBreakInfo( const LineBreakInfo* const lineBreakInfo, Length length ) { + Vector& modelLineBreakInfo = mImpl->mLineBreakInfo; + modelLineBreakInfo.Resize( length ); + memcpy( modelLineBreakInfo.Begin(), lineBreakInfo, length * sizeof( LineBreakInfo ) ); } void LogicalModel::GetLineBreakInfo( LineBreakInfo* lineBreakInfo, CharacterIndex characterIndex, Length numberOfItems ) const { + memcpy( lineBreakInfo, mImpl->mLineBreakInfo.Begin() + characterIndex, numberOfItems * sizeof( LineBreakInfo ) ); } LineBreakInfo LogicalModel::GetLineBreakInfo( CharacterIndex characterIndex ) const { - return 0; + return *( mImpl->mLineBreakInfo.Begin() + characterIndex ); } void LogicalModel::SetWordBreakInfo( const WordBreakInfo* const wordBreakInfo, Length length ) { + Vector& modelWordBreakInfo = mImpl->mWordBreakInfo; + modelWordBreakInfo.Resize( length ); + memcpy( modelWordBreakInfo.Begin(), wordBreakInfo, length * sizeof( WordBreakInfo ) ); } void LogicalModel::GetWordBreakInfo( WordBreakInfo* wordBreakInfo, CharacterIndex characterIndex, Length numberOfItems ) const { + memcpy( wordBreakInfo, mImpl->mWordBreakInfo.Begin() + characterIndex, numberOfItems * sizeof( WordBreakInfo ) ); } WordBreakInfo LogicalModel::GetWordBreakInfo( CharacterIndex characterIndex ) const { - return 0; + return *( mImpl->mWordBreakInfo.Begin() + characterIndex ); } void LogicalModel::SetBidirectionalInfo( const BidirectionalParagraphInfoRun* const bidirectionalInfo, diff --git a/dali-toolkit/public-api/text/segmentation.cpp b/dali-toolkit/public-api/text/segmentation.cpp index 3fa7450..db4e7ae 100644 --- a/dali-toolkit/public-api/text/segmentation.cpp +++ b/dali-toolkit/public-api/text/segmentation.cpp @@ -18,6 +18,9 @@ // CLASS HEADER #include +// EXTERNAL INCLUDES +#include + namespace Dali { @@ -30,11 +33,37 @@ namespace Text void SetLineBreakInfo( const Vector& text, Vector& lineBreakInfo ) { + const Length numberOfCharacters = text.Count(); + + if( 0u == numberOfCharacters ) + { + // Nothing to do if there are no characters. + return; + } + + // Retrieve the line break info. + lineBreakInfo.Resize( numberOfCharacters ); + TextAbstraction::Segmentation::Get().GetLineBreakPositions( text.Begin(), + numberOfCharacters, + lineBreakInfo.Begin() ); } void SetWordBreakInfo( const Vector& text, Vector& wordBreakInfo ) { + const Length numberOfCharacters = text.Count(); + + if( 0u == numberOfCharacters ) + { + // Nothing to do if there are no characters. + return; + } + + // Retrieve the word break info. + wordBreakInfo.Resize( numberOfCharacters ); + TextAbstraction::Segmentation::Get().GetWordBreakPositions( text.Begin(), + numberOfCharacters, + wordBreakInfo.Begin() ); } } // namespace Text diff --git a/dali-toolkit/public-api/text/text-definitions.h b/dali-toolkit/public-api/text/text-definitions.h index 19caf79..981c5eb 100644 --- a/dali-toolkit/public-api/text/text-definitions.h +++ b/dali-toolkit/public-api/text/text-definitions.h @@ -33,15 +33,15 @@ namespace Toolkit namespace Text { -typedef TextAbstraction::FontId FontId; ///< The unique identifier for a font face (generated by FontClient) -typedef TextAbstraction::FontMetrics FontMetrics; ///< The metrics for a Font expressed in 26.6 fractional pixel format -typedef TextAbstraction::PointSize26Dot6 PointSize26Dot6; ///< The point size in 26.6 fractional points -typedef TextAbstraction::FaceIndex FaceIndex; ///< Used with fonts which allow several font faces -typedef TextAbstraction::GlyphIndex GlyphIndex; ///< Uniquely identifies a glyph within a particular font -typedef TextAbstraction::Character Character; ///< A UTF-32 representation of a character -typedef TextAbstraction::GlyphInfo GlyphInfo; ///< The information describing a glyph (font ID, index, metrics) -typedef TextAbstraction::CharacterIndex CharacterIndex; ///< An index into an array of characters -typedef TextAbstraction::Length Length; ///< The length of an array +typedef TextAbstraction::FontId FontId; ///< The unique identifier for a font face (generated by FontClient). +typedef TextAbstraction::FontMetrics FontMetrics; ///< The metrics for a Font expressed in 26.6 fractional pixel format. +typedef TextAbstraction::PointSize26Dot6 PointSize26Dot6; ///< The point size in 26.6 fractional points. +typedef TextAbstraction::FaceIndex FaceIndex; ///< Used with fonts which allow several font faces. +typedef TextAbstraction::GlyphIndex GlyphIndex; ///< Uniquely identifies a glyph within a particular font. +typedef TextAbstraction::Character Character; ///< A UTF-32 representation of a character. +typedef TextAbstraction::GlyphInfo GlyphInfo; ///< The information describing a glyph (font ID, index, metrics). +typedef TextAbstraction::CharacterIndex CharacterIndex; ///< An index into an array of characters. +typedef TextAbstraction::Length Length; ///< The length of an array. typedef TextAbstraction::BidiInfoIndex BidiInfoIndex; ///< Index to the bidirectional info for a paragraph. typedef TextAbstraction::Script Script; ///< The character's script. typedef TextAbstraction::LineBreakInfo LineBreakInfo; ///< Line break info (must break, allow break, no break). Possible values are: @e LINE_MUST_BREAK, @e LINE_ALLOW_BREAK and @e LINE_NO_BREAK (in the TextAbstraction namespace). -- 2.7.4