/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include <dali-toolkit/internal/text/segmentation.h>
#include <dali-toolkit/internal/text/shaper.h>
#include <dali-toolkit/internal/text/text-controller-impl.h>
+#include <dali-toolkit/internal/text/markup-processor.h>
namespace Dali
{
Size& layoutSize,
LogicalModelPtr& logicalModel,
VisualModelPtr& visualModel,
- MetricsPtr& metrics )
+ MetricsPtr& metrics,
+ bool markupProcessorEnabled )
{
logicalModel = LogicalModel::New();
visualModel = VisualModel::New();
+ MarkupProcessData markupProcessData( logicalModel->mColorRuns,
+ logicalModel->mFontDescriptionRuns,
+ logicalModel->mEmbeddedItems );
+
+ Length textSize = 0u;
+ const uint8_t* utf8 = NULL;
+ if( markupProcessorEnabled )
+ {
+ ProcessMarkupString( text, markupProcessData );
+ textSize = markupProcessData.markupProcessedText.size();
+
+ // This is a bit horrible but std::string returns a (signed) char*
+ utf8 = reinterpret_cast<const uint8_t*>( markupProcessData.markupProcessedText.c_str() );
+ }
+ else
+ {
+ textSize = text.size();
+
+ // This is a bit horrible but std::string returns a (signed) char*
+ utf8 = reinterpret_cast<const uint8_t*>( text.c_str() );
+ }
+
// 1) Convert to utf32
Vector<Character>& utf32Characters = logicalModel->mText;
- utf32Characters.Resize( text.size() );
+ utf32Characters.Resize( textSize );
- const uint32_t numberOfCharacters = Utf8ToUtf32( reinterpret_cast<const uint8_t* const>( text.c_str() ),
- text.size(),
- &utf32Characters[0u] );
- utf32Characters.Resize( numberOfCharacters );
+ // Transform a text array encoded in utf8 into an array encoded in utf32.
+ // It returns the actual number of characters.
+ Length characterCount = Utf8ToUtf32( utf8, textSize, utf32Characters.Begin() );
+ utf32Characters.Resize( characterCount );
// 2) Set the break and paragraph info.
Vector<LineBreakInfo>& lineBreakInfo = logicalModel->mLineBreakInfo;
- lineBreakInfo.Resize( numberOfCharacters );
+ lineBreakInfo.Resize( characterCount );
SetLineBreakInfo( utf32Characters,
0u,
- numberOfCharacters,
+ characterCount,
lineBreakInfo );
- if( 0u == numberOfCharacters )
+ if( 0u == characterCount )
{
// Nothing else to do if the number of characters is zero.
return;
// Retrieves the word break info. The word break info is used to layout the text (where to wrap the text in lines).
Vector<WordBreakInfo>& wordBreakInfo = logicalModel->mWordBreakInfo;
- wordBreakInfo.Resize( numberOfCharacters );
+ wordBreakInfo.Resize( characterCount );
SetWordBreakInfo( utf32Characters,
0u,
- numberOfCharacters,
+ characterCount,
wordBreakInfo );
// 3) Set the script info.
Vector<ScriptRun>& scripts = logicalModel->mScriptRuns;
multilanguageSupport.SetScripts( utf32Characters,
0u,
- numberOfCharacters,
+ characterCount,
scripts );
// 4) Set the font info
fontDescription,
TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
0u,
- numberOfCharacters,
+ characterCount,
validFonts );
// 5) Set the bidirectional info per paragraph.
scripts,
lineBreakInfo,
0u,
- numberOfCharacters,
+ characterCount,
bidirectionalInfo );
// Create the paragraph info.
logicalModel->CreateParagraphInfo( 0u,
- numberOfCharacters );
+ characterCount );
// 6) Set character directions.
Vector<CharacterDirection>& characterDirections = logicalModel->mCharacterDirections;
{
// Only set the character directions if there is right to left characters.
GetCharactersDirection( bidirectionalInfo,
- numberOfCharacters,
+ characterCount,
0u,
- numberOfCharacters,
+ characterCount,
characterDirections );
characterDirections,
bidirectionalInfo,
0u,
- numberOfCharacters,
+ characterCount,
mirroredUtf32Characters );
}
else
validFonts,
0u,
0u,
- numberOfCharacters,
+ characterCount,
glyphs,
glyphsToCharactersMap,
charactersPerGlyph,
newParagraphGlyphs );
// Create the 'number of glyphs' per character and the glyph to character conversion tables.
- visualModel->CreateGlyphsPerCharacterTable( 0u, 0u, numberOfCharacters );
- visualModel->CreateCharacterToGlyphTable( 0u, 0u, numberOfCharacters );
+ visualModel->CreateGlyphsPerCharacterTable( 0u, 0u, characterCount );
+ visualModel->CreateCharacterToGlyphTable( 0u, 0u, characterCount );
const Length numberOfGlyphs = glyphs.Count();
numberOfGlyphs,
Text::HorizontalAlignment::BEGIN,
Text::LineWrap::WORD,
- outlineWidth );
+ outlineWidth,
+ true,
+ false );
Vector<LineRun>& lines = visualModel->mLines;
Vector<Vector2>& glyphPositions = visualModel->mGlyphPositions;
glyphPositions.Resize( numberOfGlyphs );
- layoutParameters.isLastNewParagraph = TextAbstraction::IsNewParagraph( *( utf32Characters.Begin() + ( numberOfCharacters - 1u ) ) );
+ layoutParameters.isLastNewParagraph = TextAbstraction::IsNewParagraph( *( utf32Characters.Begin() + ( characterCount - 1u ) ) );
// The initial glyph and the number of glyphs to layout.
layoutParameters.startGlyphIndex = 0u;
layoutParameters.startLineIndex = 0u;
layoutParameters.estimatedNumberOfLines = logicalModel->mParagraphInfo.Count();
+ bool isAutoScroll = false;
layoutEngine.LayoutText( layoutParameters,
glyphPositions,
lines,
layoutSize,
- false );
+ false,
+ isAutoScroll );
// 10) Reorder the lines
if( 0u != bidirectionalInfo.Count() )
bidirectionalLineInfo.Reserve( numberOfLines ); // Reserve because is not known yet how many lines have right to left characters.
ReorderLines( bidirectionalInfo,
0u,
- numberOfCharacters,
+ characterCount,
lines,
bidirectionalLineInfo );
// Re-layout the text. Reorder those lines with right to left characters.
layoutEngine.ReLayoutRightToLeftLines( layoutParameters,
0u,
- numberOfCharacters,
+ characterCount,
glyphPositions );
}
}
float alignmentOffset = 0.f;
layoutEngine.Align( textArea,
0u,
- numberOfCharacters,
+ characterCount,
Text::HorizontalAlignment::BEGIN,
lines,
- alignmentOffset );
+ alignmentOffset,
+ Dali::LayoutDirection::LEFT_TO_RIGHT,
+ false );
}
}
// Set cursor's width to zero.
controller->GetLayoutEngine().SetCursorWidth( 0 );
+ InputMethodContext inputMethodContext = InputMethodContext::New();
// Disables the text input.
- controller->EnableTextInput( NULL );
+ controller->EnableTextInput( NULL, inputMethodContext );
// Disables the vertical scrolling.
controller->SetVerticalScrollEnabled( false );
// Set the text layout as multi-line.
controller->GetLayoutEngine().SetLayout( Layout::Engine::SINGLE_LINE_BOX );
+ InputMethodContext inputMethodContext = InputMethodContext::New();
// Enables the text input.
- controller->EnableTextInput( decorator );
+ controller->EnableTextInput( decorator, inputMethodContext );
// Enables the vertical scrolling after the text input has been enabled.
controller->SetVerticalScrollEnabled( false );
// Set the text layout as multi-line.
controller->GetLayoutEngine().SetLayout( Layout::Engine::MULTI_LINE_BOX );
+ InputMethodContext inputMethodContext = InputMethodContext::New();
// Enables the text input.
- controller->EnableTextInput( decorator );
+ controller->EnableTextInput( decorator, inputMethodContext );
// Enables the vertical scrolling after the text input has been enabled.
controller->SetVerticalScrollEnabled( true );