app_server/BFont: Implement B_STRIKEOUT_FACE

Change-Id: I139621ce98847c94306c62e31774a00cde8a18e5
Reviewed-on: https://review.haiku-os.org/c/haiku/+/8848
Reviewed-by: Jérôme Duval <[email protected]>
Haiku-Format: Haiku-format Bot <[email protected]>
Tested-by: Commit checker robot <[email protected]>
This commit is contained in:
Niklas Poslovski
2025-01-25 03:24:55 +00:00
committed by waddlesplash
parent acac5ed621
commit 2d9bd61681
@@ -119,7 +119,7 @@ typedef agg::conv_transform<FontCacheEntry::ContourConverter, Transformable>
class AGGTextRenderer::StringRenderer { class AGGTextRenderer::StringRenderer {
public: public:
StringRenderer(const IntRect& clippingFrame, bool dryRun, StringRenderer(const IntRect& clippingFrame, bool dryRun,
bool subpixelAntiAliased, bool underscore, bool subpixelAntiAliased, bool underscore, bool strikeout,
FontCacheEntry::TransformedOutline& transformedGlyph, FontCacheEntry::TransformedOutline& transformedGlyph,
FontCacheEntry::TransformedContourOutline& transformedContour, FontCacheEntry::TransformedContourOutline& transformedContour,
const Transformable& transform, const Transformable& transform,
@@ -134,6 +134,7 @@ public:
fSubpixelAntiAliased(subpixelAntiAliased), fSubpixelAntiAliased(subpixelAntiAliased),
fVector(false), fVector(false),
fUnderscore(underscore), fUnderscore(underscore),
fStrikeout(strikeout),
fBounds(INT32_MAX, INT32_MAX, INT32_MIN, INT32_MIN), fBounds(INT32_MAX, INT32_MAX, INT32_MIN, INT32_MIN),
fNextCharPos(nextCharPos), fNextCharPos(nextCharPos),
@@ -171,43 +172,53 @@ public:
} }
if (fUnderscore && !fDryRun) { if (fUnderscore && !fDryRun) {
agg::path_storage p; agg::path_storage path;
IntRect b = fBounds; IntRect bounds = fBounds;
b.bottom = (int)y; bounds.bottom = (int)y;
b.OffsetBy(fTransformOffset); bounds.OffsetBy(fTransformOffset);
p.move_to(b.left + 0.5, b.bottom + 2.5); path.move_to(bounds.left + 0.5, bounds.bottom + 2.5);
p.line_to(b.right + 0.5, b.bottom + 2.5); path.line_to(bounds.right + 0.5, bounds.bottom + 2.5);
p.close_polygon(); path.close_polygon();
agg::conv_stroke<agg::path_storage> ps(p); agg::conv_stroke<agg::path_storage> pathStorage(path);
ps.width(fRenderer.fFont.Size() / 12.0f); pathStorage.width(fRenderer.fFont.Size() / 12.0f);
if (fRenderer.fMaskedScanline != NULL) { if (fRenderer.fMaskedScanline != NULL) {
fRenderer.fRasterizer.add_path(ps); fRenderer.fRasterizer.add_path(pathStorage);
agg::render_scanlines(fRenderer.fRasterizer, agg::render_scanlines(fRenderer.fRasterizer,
*fRenderer.fMaskedScanline, fRenderer.fSolidRenderer); *fRenderer.fMaskedScanline, fRenderer.fSolidRenderer);
} else if (fSubpixelAntiAliased) { } else if (fSubpixelAntiAliased) {
fRenderer.fSubpixRasterizer.add_path(ps); fRenderer.fSubpixRasterizer.add_path(pathStorage);
agg::render_scanlines(fRenderer.fSubpixRasterizer, agg::render_scanlines(fRenderer.fSubpixRasterizer,
fRenderer.fSubpixScanline, fRenderer.fSubpixRenderer); fRenderer.fSubpixScanline, fRenderer.fSubpixRenderer);
} else { } else {
/* fRenderer.fRasterizer.add_path(pathStorage);
scanline_unpacked_type sl1; agg::render_scanlines(fRenderer.fRasterizer,
scanline_unpacked_type sl2; fRenderer.fScanline, fRenderer.fSolidRenderer);
}
}
rasterizer_type ras1; if (fStrikeout && !fDryRun) {
rasterizer_type ras2; agg::path_storage path;
font_height fontHeight;
ras1.add_path(ps); IntRect bounds = fBounds;
ras2.add_path(fTransformedContour); fRenderer.fFont.GetHeight(fontHeight);
float totalFontHeight = fontHeight.ascent + fontHeight.descent;
agg::render_scanlines(ras1, bounds.bottom = (int)y;
sl1, fRenderer.fSolidRenderer); bounds.OffsetBy(fTransformOffset);
agg::render_scanlines(ras2, path.move_to(bounds.left + 0.5, round(bounds.bottom - totalFontHeight * 0.25) + 0.5);
sl2, fRenderer.fSolidRenderer); path.line_to(bounds.right + 0.5, round(bounds.bottom - totalFontHeight * 0.25) + 0.5);
path.close_polygon();
agg::sbool_combine_shapes_aa(agg::sbool_a_minus_b, agg::conv_stroke<agg::path_storage> pathStorage(path);
ras1, ras2, sl1, sl2, fRenderer.fScanline, fRenderer.fSolidRenderer); pathStorage.width(fRenderer.fFont.Size() / 12.0f);
*/ if (fRenderer.fMaskedScanline != NULL) {
fRenderer.fRasterizer.add_path(ps); fRenderer.fRasterizer.add_path(pathStorage);
agg::render_scanlines(fRenderer.fRasterizer,
*fRenderer.fMaskedScanline, fRenderer.fSolidRenderer);
} else if (fSubpixelAntiAliased) {
fRenderer.fSubpixRasterizer.add_path(pathStorage);
agg::render_scanlines(fRenderer.fSubpixRasterizer,
fRenderer.fSubpixScanline, fRenderer.fSubpixRenderer);
} else {
fRenderer.fRasterizer.add_path(pathStorage);
agg::render_scanlines(fRenderer.fRasterizer, agg::render_scanlines(fRenderer.fRasterizer,
fRenderer.fScanline, fRenderer.fSolidRenderer); fRenderer.fScanline, fRenderer.fSolidRenderer);
} }
@@ -365,6 +376,7 @@ private:
bool fSubpixelAntiAliased; bool fSubpixelAntiAliased;
bool fVector; bool fVector;
bool fUnderscore; bool fUnderscore;
bool fStrikeout;
IntRect fBounds; IntRect fBounds;
BPoint* fNextCharPos; BPoint* fNextCharPos;
@@ -401,12 +413,12 @@ AGGTextRenderer::RenderString(const char* string, uint32 length,
transform.Transform(&transformOffset); transform.Transform(&transformOffset);
IntRect clippingIntFrame(clippingFrame); IntRect clippingIntFrame(clippingFrame);
bool underscore = fFont.Face() & B_UNDERSCORE_FACE; bool underscore = (fFont.Face() & B_UNDERSCORE_FACE) != 0;
bool strikeout = (fFont.Face() & B_STRIKEOUT_FACE) != 0;
StringRenderer renderer(clippingIntFrame, dryRun, StringRenderer renderer(clippingIntFrame, dryRun, gSubpixelAntialiasing && fAntialias,
gSubpixelAntialiasing && fAntialias, underscore, underscore, strikeout, transformedOutline, transformedContourOutline, transform,
transformedOutline, transformedContourOutline, transformOffset, nextCharPos, *this);
transform, transformOffset, nextCharPos, *this);
GlyphLayoutEngine::LayoutGlyphs(renderer, fFont, string, length, INT32_MAX, GlyphLayoutEngine::LayoutGlyphs(renderer, fFont, string, length, INT32_MAX,
delta, fFont.Spacing(), NULL, cacheReference); delta, fFont.Spacing(), NULL, cacheReference);
@@ -440,12 +452,12 @@ AGGTextRenderer::RenderString(const char* string, uint32 length,
transform.Transform(&transformOffset); transform.Transform(&transformOffset);
IntRect clippingIntFrame(clippingFrame); IntRect clippingIntFrame(clippingFrame);
bool underscore = fFont.Face() & B_UNDERSCORE_FACE; bool underscore = (fFont.Face() & B_UNDERSCORE_FACE) != 0;
bool strikeout = (fFont.Face() & B_STRIKEOUT_FACE) != 0;
StringRenderer renderer(clippingIntFrame, dryRun, StringRenderer renderer(clippingIntFrame, dryRun, gSubpixelAntialiasing && fAntialias,
gSubpixelAntialiasing && fAntialias, underscore, underscore, strikeout, transformedOutline, transformedContourOutline, transform,
transformedOutline, transformedContourOutline, transformOffset, nextCharPos, *this);
transform, transformOffset, nextCharPos, *this);
GlyphLayoutEngine::LayoutGlyphs(renderer, fFont, string, length, INT32_MAX, GlyphLayoutEngine::LayoutGlyphs(renderer, fFont, string, length, INT32_MAX,
NULL, fFont.Spacing(), offsets, cacheReference); NULL, fFont.Spacing(), offsets, cacheReference);