⛏️ index : haiku.git

author Niklas Poslovski <ni.pos@yandex.com> 2025-01-26 11:02:04.0 +01:00:00
committer waddlesplash <waddlesplash@gmail.com> 2025-03-17 18:13:04.0 +00:00:00
commit
ef67cb1ace77ee14093b389751bb8e50367ef3db [patch]
tree
637c32b97adf5464c11bb41a4634f4a6b5174c8d
parent
7aa3dc423ea3ca58452d18c2907fa76e51c37464
download
ef67cb1ace77ee14093b389751bb8e50367ef3db.tar.gz

app_server/AGGTextRenderer: Improve code quality, remove duplicates

Change-Id: Ia1d6ec8ad836dcd08f36841cbc16b5a609fd7aff
Reviewed-on: https://review.haiku-os.org/c/haiku/+/8861
Reviewed-by: Máximo Castañeda <antiswen@yahoo.es>
Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org>
Haiku-Format: Haiku-format Bot <no-reply+haikuformatbot@haiku-os.org>

Diff

 src/servers/app/drawing/Painter/AGGTextRenderer.cpp | 108 ++++++++++++++++++++++++++++++--------------------------------------------------
 1 file changed, 40 insertions(+), 68 deletions(-)

diff --git a/src/servers/app/drawing/Painter/AGGTextRenderer.cpp b/src/servers/app/drawing/Painter/AGGTextRenderer.cpp
index 2131282..8774e94 100644
--- a/src/servers/app/drawing/Painter/AGGTextRenderer.cpp
+++ b/src/servers/app/drawing/Painter/AGGTextRenderer.cpp
@@ -119,7 +119,6 @@
class AGGTextRenderer::StringRenderer {
public:
	StringRenderer(const IntRect& clippingFrame, bool dryRun,
			bool subpixelAntiAliased, bool underscore, bool strikeout,
			FontCacheEntry::TransformedOutline& transformedGlyph,
			FontCacheEntry::TransformedContourOutline& transformedContour,
			const Transformable& transform,
@@ -131,10 +130,7 @@
		fTransformOffset(transformOffset),
		fClippingFrame(clippingFrame),
		fDryRun(dryRun),
		fSubpixelAntiAliased(subpixelAntiAliased),
		fVector(false),
		fUnderscore(underscore),
		fStrikeout(strikeout),
		fBounds(INT32_MAX, INT32_MAX, INT32_MIN, INT32_MIN),
		fNextCharPos(nextCharPos),

@@ -143,6 +139,7 @@

		fRenderer(renderer)
	{
		fSubpixelAntiAliased = gSubpixelAntialiasing && fRenderer.Antialiasing();
	}

	bool NeedsVector()
@@ -171,56 +168,14 @@
			}
		}

		if (fUnderscore && !fDryRun) {
			agg::path_storage path;
			IntRect bounds = fBounds;
			bounds.bottom = (int)y;
			bounds.OffsetBy(fTransformOffset);
			path.move_to(bounds.left + 0.5, bounds.bottom + 2.5);
			path.line_to(bounds.right + 0.5, bounds.bottom + 2.5);
			path.close_polygon();
			agg::conv_stroke<agg::path_storage> pathStorage(path);
			pathStorage.width(fRenderer.fFont.Size() / 12.0f);
			if (fRenderer.fMaskedScanline != NULL) {
				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,
					fRenderer.fScanline, fRenderer.fSolidRenderer);
			}
		}

		if (fStrikeout && !fDryRun) {
			agg::path_storage path;
			font_height fontHeight;
			IntRect bounds = fBounds;
			fRenderer.fFont.GetHeight(fontHeight);
			float totalFontHeight = fontHeight.ascent + fontHeight.descent;
			bounds.bottom = (int)y;
			bounds.OffsetBy(fTransformOffset);
			path.move_to(bounds.left + 0.5, round(bounds.bottom - totalFontHeight * 0.25) + 0.5);
			path.line_to(bounds.right + 0.5, round(bounds.bottom - totalFontHeight * 0.25) + 0.5);
			path.close_polygon();
			agg::conv_stroke<agg::path_storage> pathStorage(path);
			pathStorage.width(fRenderer.fFont.Size() / 12.0f);
			if (fRenderer.fMaskedScanline != NULL) {
				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,
					fRenderer.fScanline, fRenderer.fSolidRenderer);
		if (!fDryRun) {
			if ((fRenderer.fFont.Face() & B_UNDERSCORE_FACE) != 0)
				_DrawHorizontalLine(y + 2);

			if ((fRenderer.fFont.Face() & B_STRIKEOUT_FACE) != 0) {
				font_height fontHeight;
				fRenderer.fFont.GetHeight(fontHeight);
				_DrawHorizontalLine(y - (fontHeight.ascent + fontHeight.descent) / 4);
			}
		}

@@ -366,6 +321,33 @@
	IntRect Bounds() const
	{
		return fBounds;
	}

private:
	void _DrawHorizontalLine(float y)
	{
		agg::path_storage path;
		IntRect bounds = fBounds;
		bounds.bottom = (int)y;
		bounds.OffsetBy(fTransformOffset);
		path.move_to(bounds.left + 0.5, bounds.bottom + 0.5);
		path.line_to(bounds.right + 0.5, bounds.bottom + 0.5);
		path.close_polygon();
		agg::conv_stroke<agg::path_storage> pathStorage(path);
		pathStorage.width(fRenderer.fFont.Size() / 12.0f);
		if (fRenderer.fMaskedScanline != NULL) {
			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,
				fRenderer.fScanline, fRenderer.fSolidRenderer);
		}
	}

private:
@@ -375,8 +357,6 @@
	bool				fDryRun;
	bool				fSubpixelAntiAliased;
	bool				fVector;
	bool				fUnderscore;
	bool				fStrikeout;
	IntRect				fBounds;
	BPoint*				fNextCharPos;

@@ -413,13 +393,9 @@
	transform.Transform(&transformOffset);
	IntRect clippingIntFrame(clippingFrame);

	bool underscore = (fFont.Face() & B_UNDERSCORE_FACE) != 0;
	bool strikeout = (fFont.Face() & B_STRIKEOUT_FACE) != 0;
	StringRenderer renderer(clippingIntFrame, dryRun, transformedOutline, transformedContourOutline,
		transform, transformOffset, nextCharPos, *this);

	StringRenderer renderer(clippingIntFrame, dryRun, gSubpixelAntialiasing && fAntialias,
		underscore, strikeout, transformedOutline, transformedContourOutline, transform,
		transformOffset, nextCharPos, *this);

	GlyphLayoutEngine::LayoutGlyphs(renderer, fFont, string, length, INT32_MAX,
		delta, fFont.Spacing(), NULL, cacheReference);

@@ -451,13 +427,9 @@
	BPoint transformOffset(0.0, 0.0);
	transform.Transform(&transformOffset);
	IntRect clippingIntFrame(clippingFrame);

	bool underscore = (fFont.Face() & B_UNDERSCORE_FACE) != 0;
	bool strikeout = (fFont.Face() & B_STRIKEOUT_FACE) != 0;

	StringRenderer renderer(clippingIntFrame, dryRun, gSubpixelAntialiasing && fAntialias,
		underscore, strikeout, transformedOutline, transformedContourOutline, transform,
		transformOffset, nextCharPos, *this);
	StringRenderer renderer(clippingIntFrame, dryRun, transformedOutline, transformedContourOutline,
		transform, transformOffset, nextCharPos, *this);

	GlyphLayoutEngine::LayoutGlyphs(renderer, fFont, string, length, INT32_MAX,
		NULL, fFont.Spacing(), offsets, cacheReference);