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:
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);
|
||||||
|
|||||||
Reference in New Issue
Block a user