// Pointer to the font id buffer.
FontId* fontIdsBuffer = fontIds.Begin();
+ // Used to temporarily store the style per character.
+ TextAbstraction::FontDescription fontDescription;
+ TextAbstraction::PointSize26Dot6 fontSize;
+
+ Length familyIndex = 0u;
+ Length weightIndex = 0u;
+ Length widthIndex = 0u;
+ Length slantIndex = 0u;
+ Length sizeIndex = 0u;
+
// Traverse all the characters.
- for( CharacterIndex index = startIndex; index < numberOfCharacters; ++index )
+ const CharacterIndex lastCharacterPlusOne = startIndex + numberOfCharacters;
+ for( CharacterIndex index = startIndex; index < lastCharacterPlusOne; ++index )
{
- // The default font description and font point size.
- TextAbstraction::FontDescription fontDescription = defaultFontDescription;
- TextAbstraction::PointSize26Dot6 fontSize = defaultPointSize;
bool defaultFont = true;
+ Length runIndex = 0u;
+
+ bool familyOverriden = false;
+ bool weightOverriden = false;
+ bool widthOverriden = false;
+ bool slantOverriden = false;
+ bool sizeOverriden = false;
+
// Traverse all the font descriptions.
- for( Vector<FontDescriptionRun>::ConstIterator it = fontDescriptions.Begin(),
+ const FontDescriptionRun* const fontDescriptionsBuffer = fontDescriptions.Begin();
+ for( Vector<FontDescriptionRun>::ConstIterator it = fontDescriptionsBuffer,
endIt = fontDescriptions.End();
it != endIt;
- ++it )
+ ++it, ++runIndex )
{
// Check whether the character's font is modified by the current font description.
const FontDescriptionRun& fontRun = *it;
{
if( fontRun.familyDefined )
{
- fontDescription.family = std::string( fontRun.familyName, fontRun.familyLength );
defaultFont = false;
+ familyOverriden = true;
+ familyIndex = runIndex;
}
if( fontRun.weightDefined )
{
- fontDescription.weight = fontRun.weight;
defaultFont = false;
+ weightOverriden = true;
+ weightIndex = runIndex;
}
if( fontRun.widthDefined )
{
- fontDescription.width = fontRun.width;
defaultFont = false;
+ widthOverriden = true;
+ widthIndex = runIndex;
}
if( fontRun.slantDefined )
{
- fontDescription.slant = fontRun.slant;
defaultFont = false;
+ slantOverriden = true;
+ slantIndex = runIndex;
}
if( fontRun.sizeDefined )
{
- fontSize = fontRun.size;
defaultFont = false;
+ sizeOverriden = true;
+ sizeIndex = runIndex;
}
}
}
// Get the font id if is not the default font.
if( !defaultFont )
{
+ if( familyOverriden )
+ {
+ const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + familyIndex );
+ fontDescription.family = std::string( fontRun.familyName, fontRun.familyLength ); // TODO Could use move constructor when switch to c++11.
+ }
+ else
+ {
+ fontDescription.family = defaultFontDescription.family;
+ }
+
+ if( weightOverriden )
+ {
+ const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + weightIndex );
+ fontDescription.weight = fontRun.weight;
+ }
+ else
+ {
+ fontDescription.weight = defaultFontDescription.weight;
+ }
+
+ if( widthOverriden )
+ {
+ const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + widthIndex );
+ fontDescription.width = fontRun.width;
+ }
+ else
+ {
+ fontDescription.width = defaultFontDescription.width;
+ }
+
+ if( slantOverriden )
+ {
+ const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + slantIndex );
+ fontDescription.slant = fontRun.slant;
+ }
+ else
+ {
+ fontDescription.slant = defaultFontDescription.slant;
+ }
+
+ if( sizeOverriden )
+ {
+ const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + sizeIndex );
+ fontSize = fontRun.size;
+ }
+ else
+ {
+ fontSize = defaultPointSize;
+ }
+
*( fontIdsBuffer + index - startIndex ) = fontClient.GetFontId( fontDescription, fontSize );
}
}
inputStyle.textColor = mTextColor;
inputStyle.isDefaultColor = true;
+ inputStyle.familyName.clear();
+ inputStyle.weight = TextAbstraction::FontWeight::NORMAL;
+ inputStyle.width = TextAbstraction::FontWidth::NORMAL;
+ inputStyle.slant = TextAbstraction::FontSlant::NORMAL;
+ inputStyle.size = 0.f;
+
+ inputStyle.familyDefined = false;
+ inputStyle.weightDefined = false;
+ inputStyle.widthDefined = false;
+ inputStyle.slantDefined = false;
+ inputStyle.sizeDefined = false;
+
// Sets the default font's family name, weight, width, slant and size.
if( mFontDefaults )
{
- inputStyle.familyName = mFontDefaults->mFontDescription.family;
- inputStyle.weight = mFontDefaults->mFontDescription.weight;
- inputStyle.width = mFontDefaults->mFontDescription.width;
- inputStyle.slant = mFontDefaults->mFontDescription.slant;
- inputStyle.size = mFontDefaults->mDefaultPointSize;
+ if( mFontDefaults->familyDefined )
+ {
+ inputStyle.familyName = mFontDefaults->mFontDescription.family;
+ inputStyle.familyDefined = true;
+ }
- inputStyle.familyDefined = mFontDefaults->familyDefined;
- inputStyle.weightDefined = mFontDefaults->weightDefined;
- inputStyle.widthDefined = mFontDefaults->widthDefined;
- inputStyle.slantDefined = mFontDefaults->slantDefined;
- inputStyle.sizeDefined = mFontDefaults->sizeDefined;
- }
- else
- {
- inputStyle.familyName.clear();
- inputStyle.weight = TextAbstraction::FontWeight::NORMAL;
- inputStyle.width = TextAbstraction::FontWidth::NORMAL;
- inputStyle.slant = TextAbstraction::FontSlant::NORMAL;
- inputStyle.size = 0.f;
-
- inputStyle.familyDefined = false;
- inputStyle.weightDefined = false;
- inputStyle.widthDefined = false;
- inputStyle.slantDefined = false;
- inputStyle.sizeDefined = false;
+ if( mFontDefaults->weightDefined )
+ {
+ inputStyle.weight = mFontDefaults->mFontDescription.weight;
+ inputStyle.weightDefined = true;
+ }
+
+ if( mFontDefaults->widthDefined )
+ {
+ inputStyle.width = mFontDefaults->mFontDescription.width;
+ inputStyle.widthDefined = true;
+ }
+
+ if( mFontDefaults->slantDefined )
+ {
+ inputStyle.slant = mFontDefaults->mFontDescription.slant;
+ inputStyle.slantDefined = true;
+ }
+
+ if( mFontDefaults->sizeDefined )
+ {
+ inputStyle.size = mFontDefaults->mDefaultPointSize;
+ inputStyle.sizeDefined = true;
+ }
}
}
*
* @param[in] eventData The event data pointer.
* @param[in] logicalModel The logical model where to add the new font description run.
+ * @param[out] startOfSelectedText Index to the first selected character.
+ * @param[out] lengthOfSelectedText Number of selected characters.
*/
FontDescriptionRun& UpdateSelectionFontStyleRun( EventData* eventData,
- LogicalModelPtr logicalModel )
+ LogicalModelPtr logicalModel,
+ CharacterIndex& startOfSelectedText,
+ Length& lengthOfSelectedText )
{
const bool handlesCrossed = eventData->mLeftSelectionPosition > eventData->mRightSelectionPosition;
// Get start and end position of selection
- const CharacterIndex startOfSelectedText = handlesCrossed ? eventData->mRightSelectionPosition : eventData->mLeftSelectionPosition;
- const Length lengthOfSelectedText = ( handlesCrossed ? eventData->mLeftSelectionPosition : eventData->mRightSelectionPosition ) - startOfSelectedText;
+ startOfSelectedText = handlesCrossed ? eventData->mRightSelectionPosition : eventData->mLeftSelectionPosition;
+ lengthOfSelectedText = ( handlesCrossed ? eventData->mLeftSelectionPosition : eventData->mRightSelectionPosition ) - startOfSelectedText;
// Add the font run.
const VectorBase::SizeType numberOfRuns = logicalModel->mFontDescriptionRuns.Count();
// Clear the font-specific data
ClearFontData();
- mImpl->mRecalculateNaturalSize = true;
-
mImpl->RequestRelayout();
}
// Clear the font-specific data
ClearFontData();
- mImpl->mRecalculateNaturalSize = true;
-
mImpl->RequestRelayout();
}
// Clear the font-specific data
ClearFontData();
- mImpl->mRecalculateNaturalSize = true;
-
mImpl->RequestRelayout();
}
// Clear the font-specific data
ClearFontData();
- mImpl->mRecalculateNaturalSize = true;
-
mImpl->RequestRelayout();
}
// Clear the font-specific data
ClearFontData();
- mImpl->mRecalculateNaturalSize = true;
-
mImpl->RequestRelayout();
}
// Clear the font-specific data
ClearFontData();
- mImpl->mRecalculateNaturalSize = true;
-
mImpl->RequestRelayout();
}
if( !mImpl->mFontDefaults->familyDefined ) // If user defined font then should not update when system font changes
{
DALI_LOG_INFO( gLogFilter, Debug::Concise, "Controller::UpdateAfterFontChange newDefaultFont(%s)\n", newDefaultFont.c_str() );
- ClearFontData();
mImpl->mFontDefaults->mFontDescription.family = newDefaultFont;
- mImpl->mRecalculateNaturalSize = true;
+
+ ClearFontData();
+
mImpl->RequestRelayout();
}
}
if( EventData::SELECTING == mImpl->mEventData->mState )
{
+ CharacterIndex startOfSelectedText = 0u;
+ Length lengthOfSelectedText = 0u;
FontDescriptionRun& fontDescriptionRun = UpdateSelectionFontStyleRun( mImpl->mEventData,
- mImpl->mLogicalModel );
+ mImpl->mLogicalModel,
+ startOfSelectedText,
+ lengthOfSelectedText );
fontDescriptionRun.familyLength = fontFamily.size();
fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
// The memory allocated for the font family name is freed when the font description is removed from the logical model.
// Request to relayout.
- mImpl->mOperationsPending = ALL_OPERATIONS;
+ mImpl->mOperationsPending = static_cast<OperationsMask>( mImpl->mOperationsPending |
+ VALIDATE_FONTS |
+ SHAPE_TEXT |
+ GET_GLYPH_METRICS |
+ LAYOUT |
+ UPDATE_ACTUAL_SIZE |
+ REORDER |
+ ALIGN );
mImpl->mRecalculateNaturalSize = true;
mImpl->RequestRelayout();
+ mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText;
+ mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText;
+ mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText;
+
// As the font changes, recalculate the handle positions is needed.
mImpl->mEventData->mUpdateLeftSelectionPosition = true;
mImpl->mEventData->mUpdateRightSelectionPosition = true;
if( EventData::SELECTING == mImpl->mEventData->mState )
{
+ CharacterIndex startOfSelectedText = 0u;
+ Length lengthOfSelectedText = 0u;
FontDescriptionRun& fontDescriptionRun = UpdateSelectionFontStyleRun( mImpl->mEventData,
- mImpl->mLogicalModel );
+ mImpl->mLogicalModel,
+ startOfSelectedText,
+ lengthOfSelectedText );
fontDescriptionRun.weight = weight;
fontDescriptionRun.weightDefined = true;
// Request to relayout.
- mImpl->mOperationsPending = ALL_OPERATIONS;
+ mImpl->mOperationsPending = static_cast<OperationsMask>( mImpl->mOperationsPending |
+ VALIDATE_FONTS |
+ SHAPE_TEXT |
+ GET_GLYPH_METRICS |
+ LAYOUT |
+ UPDATE_ACTUAL_SIZE |
+ REORDER |
+ ALIGN );
mImpl->mRecalculateNaturalSize = true;
mImpl->RequestRelayout();
+ mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText;
+ mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText;
+ mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText;
+
// As the font might change, recalculate the handle positions is needed.
mImpl->mEventData->mUpdateLeftSelectionPosition = true;
mImpl->mEventData->mUpdateRightSelectionPosition = true;
if( EventData::SELECTING == mImpl->mEventData->mState )
{
+ CharacterIndex startOfSelectedText = 0u;
+ Length lengthOfSelectedText = 0u;
FontDescriptionRun& fontDescriptionRun = UpdateSelectionFontStyleRun( mImpl->mEventData,
- mImpl->mLogicalModel );
+ mImpl->mLogicalModel,
+ startOfSelectedText,
+ lengthOfSelectedText );
fontDescriptionRun.width = width;
fontDescriptionRun.widthDefined = true;
// Request to relayout.
- mImpl->mOperationsPending = ALL_OPERATIONS;
+ mImpl->mOperationsPending = static_cast<OperationsMask>( mImpl->mOperationsPending |
+ VALIDATE_FONTS |
+ SHAPE_TEXT |
+ GET_GLYPH_METRICS |
+ LAYOUT |
+ UPDATE_ACTUAL_SIZE |
+ REORDER |
+ ALIGN );
mImpl->mRecalculateNaturalSize = true;
mImpl->RequestRelayout();
+ mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText;
+ mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText;
+ mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText;
+
// As the font might change, recalculate the handle positions is needed.
mImpl->mEventData->mUpdateLeftSelectionPosition = true;
mImpl->mEventData->mUpdateRightSelectionPosition = true;
if( EventData::SELECTING == mImpl->mEventData->mState )
{
+ CharacterIndex startOfSelectedText = 0u;
+ Length lengthOfSelectedText = 0u;
FontDescriptionRun& fontDescriptionRun = UpdateSelectionFontStyleRun( mImpl->mEventData,
- mImpl->mLogicalModel );
+ mImpl->mLogicalModel,
+ startOfSelectedText,
+ lengthOfSelectedText );
fontDescriptionRun.slant = slant;
fontDescriptionRun.slantDefined = true;
// Request to relayout.
- mImpl->mOperationsPending = ALL_OPERATIONS;
+ mImpl->mOperationsPending = static_cast<OperationsMask>( mImpl->mOperationsPending |
+ VALIDATE_FONTS |
+ SHAPE_TEXT |
+ GET_GLYPH_METRICS |
+ LAYOUT |
+ UPDATE_ACTUAL_SIZE |
+ REORDER |
+ ALIGN );
mImpl->mRecalculateNaturalSize = true;
mImpl->RequestRelayout();
+ mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText;
+ mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText;
+ mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText;
+
// As the font might change, recalculate the handle positions is needed.
mImpl->mEventData->mUpdateLeftSelectionPosition = true;
mImpl->mEventData->mUpdateRightSelectionPosition = true;
if( EventData::SELECTING == mImpl->mEventData->mState )
{
+ CharacterIndex startOfSelectedText = 0u;
+ Length lengthOfSelectedText = 0u;
FontDescriptionRun& fontDescriptionRun = UpdateSelectionFontStyleRun( mImpl->mEventData,
- mImpl->mLogicalModel );
+ mImpl->mLogicalModel,
+ startOfSelectedText,
+ lengthOfSelectedText );
fontDescriptionRun.size = static_cast<PointSize26Dot6>( size * 64.f );
fontDescriptionRun.sizeDefined = true;
// Request to relayout.
- mImpl->mOperationsPending = ALL_OPERATIONS;
+ mImpl->mOperationsPending = static_cast<OperationsMask>( mImpl->mOperationsPending |
+ VALIDATE_FONTS |
+ SHAPE_TEXT |
+ GET_GLYPH_METRICS |
+ LAYOUT |
+ UPDATE_ACTUAL_SIZE |
+ REORDER |
+ ALIGN );
mImpl->mRecalculateNaturalSize = true;
mImpl->RequestRelayout();
+ mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText;
+ mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText;
+ mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText;
+
// As the font might change, recalculate the handle positions is needed.
mImpl->mEventData->mUpdateLeftSelectionPosition = true;
mImpl->mEventData->mUpdateRightSelectionPosition = true;
{
mImpl->mFontDefaults->mFontId = 0u; // Remove old font ID
}
- mImpl->mVisualModel->ClearCaches();
+ // Set flags to update the model.
mImpl->mTextUpdateInfo.mCharacterIndex = 0u;
mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters;
mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = mImpl->mLogicalModel->mText.Count();
mImpl->mTextUpdateInfo.mClearAll = true;
+ mImpl->mTextUpdateInfo.mFullRelayoutNeeded = true;
+ mImpl->mRecalculateNaturalSize = true;
+
mImpl->mOperationsPending = static_cast<OperationsMask>( mImpl->mOperationsPending |
VALIDATE_FONTS |
SHAPE_TEXT |