HaikuDepot TextView: simple implementation of underlined text

The TextView has planned support for fancy underlines (double underline,
squiggly, and possibly different colors than the text). However, it does
not implement any rendering for these yet. Until that is added, have at
least the basic case (single line underline the same color as the text)
by using BFont B_UNDERSCORE_FACE flag.

Change-Id: I26875e51efb1050cbabb2287307516c4cea077cf
Reviewed-on: https://review.haiku-os.org/c/haiku/+/7129
Tested-by: Commit checker robot <[email protected]>
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
PulkoMandy
2023-12-11 08:18:44 +00:00
committed by Adrien Destugues
parent 71522c937e
commit 9cd2a23203
+34 -31
View File
@@ -100,15 +100,12 @@ CharacterStyle::SetBold(bool bold)
uint16 neededFace = face; uint16 neededFace = face;
if (bold) { if (bold) {
if ((face & B_ITALIC_FACE) != 0) neededFace |= B_BOLD_FACE;
neededFace = B_BOLD_FACE | B_ITALIC_FACE; neededFace &= ~B_REGULAR_FACE;
else
neededFace = B_BOLD_FACE;
} else { } else {
if ((face & B_ITALIC_FACE) != 0) neededFace &= ~B_BOLD_FACE;
neededFace = B_ITALIC_FACE; if (neededFace == 0)
else neededFace |= B_REGULAR_FACE;
neededFace = B_REGULAR_FACE;
} }
return SetFont(_FindFontForFace(neededFace)); return SetFont(_FindFontForFace(neededFace));
@@ -133,15 +130,12 @@ CharacterStyle::SetItalic(bool italic)
uint16 neededFace = face; uint16 neededFace = face;
if (italic) { if (italic) {
if ((face & B_BOLD_FACE) != 0) neededFace |= B_ITALIC_FACE;
neededFace = B_BOLD_FACE | B_ITALIC_FACE; neededFace &= ~B_REGULAR_FACE;
else
neededFace = B_ITALIC_FACE;
} else { } else {
if ((face & B_BOLD_FACE) != 0) neededFace &= ~B_ITALIC_FACE;
neededFace = B_BOLD_FACE; if (neededFace == 0)
else neededFace |= B_REGULAR_FACE;
neededFace = B_REGULAR_FACE;
} }
return SetFont(_FindFontForFace(neededFace)); return SetFont(_FindFontForFace(neededFace));
@@ -419,12 +413,35 @@ CharacterStyle::StrikeOut() const
bool bool
CharacterStyle::SetUnderline(uint8 underline) CharacterStyle::SetUnderline(uint8 underline)
{ {
#if 1
uint16 face = Font().Face();
if ((underline && (face & B_UNDERSCORE_FACE) != 0)
|| (!underline && (face & B_UNDERSCORE_FACE) == 0)) {
return true;
}
uint16 neededFace = face;
if (underline) {
neededFace |= B_UNDERSCORE_FACE;
neededFace &= ~B_REGULAR_FACE;
} else {
neededFace &= ~B_UNDERSCORE_FACE;
if (neededFace == 0)
neededFace |= B_REGULAR_FACE;
}
return SetFont(_FindFontForFace(neededFace));
#else
// TODO: re-enable this instead of using B_UNDERSCORE_FACE when TextDocumentView actually
// implements drawing the fancy underline styles. Until then, we can at least get simple
// underlines.
CharacterStyleDataRef data = fStyleData->SetUnderline(underline); CharacterStyleDataRef data = fStyleData->SetUnderline(underline);
if (data == fStyleData) if (data == fStyleData)
return data->Underline() == underline; return data->Underline() == underline;
fStyleData = data; fStyleData = data;
return true; return true;
#endif
} }
@@ -442,21 +459,7 @@ BFont
CharacterStyle::_FindFontForFace(uint16 face) const CharacterStyle::_FindFontForFace(uint16 face) const
{ {
BFont font(Font()); BFont font(Font());
font.SetFamilyAndFace(NULL, face);
font_family family;
font_style style;
font.GetFamilyAndStyle(&family, &style);
int32 styleCount = count_font_styles(family);
for (int32 i = 0; i < styleCount; i++) {
uint16 styleFace;
if (get_font_style(family, i, &style, &styleFace) == B_OK) {
if (styleFace == face) {
font.SetFamilyAndStyle(family, style);
return font;
}
}
}
return font; return font;
} }