float yBearing; ///< The distance from the baseline to the topmost border of the glyph
float advance; ///< The distance to move the cursor for this glyph
float scaleFactor; ///< The scaling applied (fixed-size fonts only)
+ bool softwareItalic; ///< Whether glyph needs software support to draw italic style
+ bool softwareBold; ///< Whether glyph needs software support to draw bold style
};
bool IsEqualGlyph ( const GlyphInfoData& glyphData, const GlyphInfo& glyph )
{
return false;
}
+ if( glyphData.softwareItalic != glyph.softwareItalic )
+ {
+ return false;
+ }
+ if( glyphData.softwareBold != glyph.softwareBold )
+ {
+ return false;
+ }
return true;
}
Length* charactersPerGlyph; ///< The characters per glyph.
uint32_t expectedNumberOfNewParagraphGlyphs; ///< The expected number of glyphs.
GlyphIndex* newParagraphGlyphs; ///< Indices to the new paragraphs glyphs.
+ Vector<FontDescriptionRun> fontDescriptions; ///< Fonts which is used for text.
};
bool ShapeInfoTest( const ShapeInfoData& data )
const LayoutOptions options;
CreateTextModel( data.text,
textArea,
- fontDescriptions,
+ data.fontDescriptions,
options,
layoutSize,
logicalModel,
tet_result(TET_PASS);
END_TEST;
}
+
+int UtcDaliTextSoftwareStyling(void)
+{
+ tet_infoline(" UtcDaliTextSoftwareStyling");
+
+ struct GlyphInfoData glyphs01[] =
+ {
+ { 2u, 14750u, 0.f, 0.f, 0.f, 0.f, 16.f, 0.f, true, true },
+ { 2u, 9802u, 0.f, 0.f, 0.f, 0.f, 16.f, 0.f, true, true },
+ { 2u, 12811u, 0.f, 0.f, 0.f, 0.f, 16.f, 0.f, true, true },
+ };
+ struct GlyphInfoData glyphs02[] =
+ {
+ { 2u, 14750u, 0.f, 0.f, 0.f, 0.f, 16.f, 0.f, false, false },
+ { 2u, 9802u, 0.f, 0.f, 0.f, 0.f, 16.f, 0.f, false, true },
+ { 2u, 12811u, 0.f, 0.f, 0.f, 0.f, 16.f, 0.f, true, false },
+ };
+
+ CharacterIndex characterIndices[] = { 0u, 1u, 2u };
+ Length charactersPerGlyph[] = { 1u, 1u, 1u };
+
+ Vector<FontDescriptionRun> fontDescriptions01;
+ Vector<FontDescriptionRun> fontDescriptions02;
+
+ FontDescriptionRun fontDescriptionRun01 =
+ {
+ {
+ 0u,
+ 3u
+ },
+ NULL,
+ 0u,
+ TextAbstraction::FontWeight::BOLD,
+ TextAbstraction::FontWidth::NONE,
+ TextAbstraction::FontSlant::ITALIC,
+ TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+ false,
+ true,
+ false,
+ true,
+ false
+ };
+ fontDescriptions01.PushBack(fontDescriptionRun01);
+
+ FontDescriptionRun fontDescriptionRun02 =
+ {
+ {
+ 0u,
+ 1u
+ },
+ NULL,
+ 0u,
+ TextAbstraction::FontWeight::NONE,
+ TextAbstraction::FontWidth::NONE,
+ TextAbstraction::FontSlant::NONE,
+ TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+ false,
+ false,
+ false,
+ false,
+ false
+ };
+ FontDescriptionRun fontDescriptionRun03 =
+ {
+ {
+ 1u,
+ 1u
+ },
+ NULL,
+ 0u,
+ TextAbstraction::FontWeight::BOLD,
+ TextAbstraction::FontWidth::NONE,
+ TextAbstraction::FontSlant::NONE,
+ TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+ false,
+ true,
+ false,
+ false,
+ false
+ };
+ FontDescriptionRun fontDescriptionRun04 =
+ {
+ {
+ 2u,
+ 1u
+ },
+ NULL,
+ 0u,
+ TextAbstraction::FontWeight::NONE,
+ TextAbstraction::FontWidth::NONE,
+ TextAbstraction::FontSlant::ITALIC,
+ TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+ false,
+ false,
+ false,
+ true,
+ false
+ };
+
+ fontDescriptions02.PushBack(fontDescriptionRun02);
+ fontDescriptions02.PushBack(fontDescriptionRun03);
+ fontDescriptions02.PushBack(fontDescriptionRun04);
+
+
+ struct ShapeInfoData data[] =
+ {
+ {
+ "Chiness script. Characters have same font description",
+ "未取得",
+ 0u,
+ 3u,
+ 3u,
+ glyphs01,
+ characterIndices,
+ charactersPerGlyph,
+ 0u,
+ NULL,
+ fontDescriptions01
+ },
+ {
+ "Chiness script. Each character has different font description.",
+ "未取得",
+ 0u,
+ 3u,
+ 3u,
+ glyphs02,
+ characterIndices,
+ charactersPerGlyph,
+ 0u,
+ NULL,
+ fontDescriptions02
+ }
+ };
+
+ const unsigned int numberOfTests = 2u;
+
+ for( unsigned int index = 0u; index < numberOfTests; ++index )
+ {
+ ToolkitTestApplication application;
+ if( !ShapeInfoTest( data[index] ) )
+ {
+ tet_result(TET_FAIL);
+ }
+ }
+
+ tet_result(TET_PASS);
+ END_TEST;
+}
\ No newline at end of file
void GetFontMetrics( FontId fontId, FontMetrics& metrics ){}
GlyphIndex GetGlyphIndex( FontId fontId, Character charcode ){return 0;}
bool GetGlyphMetrics( GlyphInfo* array, uint32_t size, bool horizontal ){return true;}
- void CreateBitmap( FontId fontId, GlyphIndex glyphIndex, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth ){}
+ void CreateBitmap( FontId fontId, GlyphIndex glyphIndex, bool softwareItailc, bool softwareBold, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth ){}
PixelData CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth ){return PixelData();}
void CreateVectorBlob( FontId fontId, GlyphIndex glyphIndex, VectorBlob*& blob,
unsigned int& blobLength, unsigned int& nominalWidth, unsigned int& nominalHeight )
return GetImplementation(*this).GetGlyphMetrics( array, size, horizontal );
}
-void FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth )
+void FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, bool softwareItailc, bool softwareBold, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth )
{
- GetImplementation(*this).CreateBitmap( fontId, glyphIndex, data, outlineWidth );
+ GetImplementation(*this).CreateBitmap( fontId, glyphIndex, softwareItailc, softwareBold, data, outlineWidth );
}
PixelData FontClient::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth )
FontId previousFontId = 0u;
bool isPreviousEmojiScript = false;
+ // Description of fallback font which is selected at current iteration.
+ TextAbstraction::FontDescription selectedFontDescription;
+
CharacterIndex lastCharacter = startIndex + numberOfCharacters;
for( Length index = startIndex; index < lastCharacter; ++index )
{
// Get the current character.
const Character character = *( textBuffer + index );
+ bool needSoftwareBoldening = false;
+ bool needSoftwareItalic = false;
+ // new description for current character
TextAbstraction::FontDescription currentFontDescription;
TextAbstraction::PointSize26Dot6 currentFontPointSize = defaultFontPointSize;
bool isDefaultFont = true;
}
#endif
+ if( fontId != currentFontRun.fontId )
+ {
+ fontClient.GetDescription(fontId,selectedFontDescription);
+ }
+
+ // Developer sets bold to character but selected font cannot support it
+ needSoftwareBoldening = ( currentFontDescription.weight >= TextAbstraction::FontWeight::BOLD ) && ( selectedFontDescription.weight < TextAbstraction::FontWeight::BOLD );
+
+ // Developer sets italic to character but selected font cannot support it
+ needSoftwareItalic = ( currentFontDescription.slant == TextAbstraction::FontSlant::ITALIC ) && ( selectedFontDescription.slant < TextAbstraction::FontSlant::ITALIC );
+
// The font is now validated.
if( ( fontId != currentFontRun.fontId ) ||
- isNewParagraphCharacter )
+ isNewParagraphCharacter ||
+ // If font id is same as previous but style is diffrent, initialize new one
+ ( ( fontId == currentFontRun.fontId ) && ( ( needSoftwareBoldening != currentFontRun.softwareBold ) || ( needSoftwareItalic != currentFontRun.softwareItalic ) ) ) )
{
// Current run needs to be stored and a new one initialized.
currentFontRun.characterRun.characterIndex = currentFontRun.characterRun.characterIndex + currentFontRun.characterRun.numberOfCharacters;
currentFontRun.characterRun.numberOfCharacters = 0u;
currentFontRun.fontId = fontId;
+ currentFontRun.softwareItalic = needSoftwareItalic;
+ currentFontRun.softwareBold = needSoftwareBoldening;
}
// Add one more character to the run.