diff options
author | Sven Gothel <[email protected]> | 2023-02-15 04:17:41 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2023-02-15 04:17:41 +0100 |
commit | 91f5d1019c59f56654f40ce18d70d15117b7f302 (patch) | |
tree | ffb2716314cd24e546912a79e1ebd3dde8a77a1e /src/jogl/classes/jogamp/graph | |
parent | 250832f581d8acccf0b62259e2ec08adb259be0e (diff) |
Graph TextRegionUtil: Move ShapeVisitor to OutlineShape.Visitor and processString(..) to Font, cleaning up ..
Further having Font.processString() return the AABBox of the whole string's 'laidout' OutlineShapes,
which is used for (debug) Font.getPointsBounds2(..) just to validate the coordinated with
the Glyph based AABBox of Font.getPointsBounds(..).
Static TextRegionUtil.drawString(..) no more require to pass the temp AffineTransform instances (ugly).
Diffstat (limited to 'src/jogl/classes/jogamp/graph')
4 files changed, 102 insertions, 25 deletions
diff --git a/src/jogl/classes/jogamp/graph/font/typecast/TypecastFont.java b/src/jogl/classes/jogamp/graph/font/typecast/TypecastFont.java index b45e2c215..eeee14365 100644 --- a/src/jogl/classes/jogamp/graph/font/typecast/TypecastFont.java +++ b/src/jogl/classes/jogamp/graph/font/typecast/TypecastFont.java @@ -1,5 +1,5 @@ /** - * Copyright 2011 JogAmp Community. All rights reserved. + * Copyright 2011-2023 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: @@ -307,46 +307,53 @@ class TypecastFont implements Font { @Override public AABBox getMetricBoundsFU(final CharSequence string) { - if (string == null) { + if (null == string || 0 == string.length() ) { return new AABBox(); } final int charCount = string.length(); + final int lineHeight = getLineHeightFU(); - int totalHeight = 0; - int totalWidth = 0; - int curLineWidth = 0; + + int y = 0; + int advanceTotal = 0; + for (int i=0; i<charCount; i++) { final char character = string.charAt(i); if (character == '\n') { - totalWidth = Math.max(curLineWidth, totalWidth); - curLineWidth = 0; - totalHeight += lineHeight; + advanceTotal = 0; + y -= lineHeight; continue; } - curLineWidth += getAdvanceWidthFU( getGlyphID( character ) ); + advanceTotal += getAdvanceWidthFU( getGlyphID( character ) ); } - if (curLineWidth > 0) { - totalHeight += lineHeight; - totalWidth = Math.max(curLineWidth, totalWidth); + if (advanceTotal > 0) { + y -= lineHeight; } - return new AABBox(0, 0, 0, totalWidth, totalHeight,0); + return new AABBox(0,y,0, advanceTotal,0,0); + } + + @Override + public AABBox getPointsBounds(final AffineTransform transform, final CharSequence string) { + return getPointsBoundsFU(transform, string).scale2(1.0f/metrics.getUnitsPerEM(), new float[3]); } @Override public AABBox getPointsBoundsFU(final AffineTransform transform, final CharSequence string) { - if (string == null) { + if (null == string || 0 == string.length() ) { return new AABBox(); } final AffineTransform temp1 = new AffineTransform(); final AffineTransform temp2 = new AffineTransform(); + + final AABBox res = new AABBox(); final int charCount = string.length(); + final int lineHeight = getLineHeightFU(); - final AABBox tbox = new AABBox(); - final AABBox res = new AABBox(); - float y = 0; - float advanceTotal = 0; + int y = 0; + int advanceTotal = 0; Font.Glyph left_glyph = null; + final AABBox temp_box = new AABBox(); for(int i=0; i< charCount; i++) { final char character = string.charAt(i); @@ -366,7 +373,8 @@ class TypecastFont implements Font { } final int glyph_id = getGlyphID(character); final Font.Glyph glyph = getGlyph(glyph_id); - if( null == glyph.getShape() ) { + final OutlineShape glyphShape = glyph.getShape(); + if( null == glyphShape ) { left_glyph = null; continue; } @@ -374,7 +382,7 @@ class TypecastFont implements Font { advanceTotal += left_glyph.getKerningFU(glyph_id); } temp1.translate(advanceTotal, y, temp2); - res.resize(temp1.transform(glyph.getBBoxFU(), tbox)); + res.resize(temp1.transform(glyph.getBBoxFU(), temp_box)); advanceTotal += glyph.getAdvanceFU(); left_glyph = glyph; } @@ -383,8 +391,77 @@ class TypecastFont implements Font { } @Override - public AABBox getPointsBounds(final AffineTransform transform, final CharSequence string) { - return getPointsBoundsFU(transform, string).scale2(1.0f/metrics.getUnitsPerEM(), new float[3]); + public AABBox getPointsBounds2(final AffineTransform transform, final CharSequence string) { + if (null == string || 0 == string.length() ) { + return new AABBox(); + } + final OutlineShape.Visitor visitor = new OutlineShape.Visitor() { + @Override + public final void visit(final OutlineShape shape, final AffineTransform t) { + // nop + } }; + return processString(visitor, transform, string); + } + + @Override + public AABBox processString(final OutlineShape.Visitor visitor, final AffineTransform transform, + final CharSequence string) { + return processString(visitor, transform, string, new AffineTransform(), new AffineTransform()); + } + + @Override + public AABBox processString(final OutlineShape.Visitor visitor, final AffineTransform transform, + final CharSequence string, + final AffineTransform temp1, final AffineTransform temp2) { + if (null == string || 0 == string.length() ) { + return new AABBox(); + } + final AABBox res = new AABBox(); + final int charCount = string.length(); + + // region.setFlipped(true); + final float lineHeight = getLineHeight(); + + float y = 0; + float advanceTotal = 0; + Font.Glyph left_glyph = null; + final AABBox temp_box = new AABBox(); + + for(int i=0; i< charCount; i++) { + final char character = string.charAt(i); + if( '\n' == character ) { + y -= lineHeight; + advanceTotal = 0; + left_glyph = null; + } else if (character == ' ') { + advanceTotal += getAdvanceWidth(Glyph.ID_SPACE); + left_glyph = null; + } else { + // reset transform + if( null != transform ) { + temp1.setTransform(transform); + } else { + temp1.setToIdentity(); + } + final int glyph_id = getGlyphID(character); + final Font.Glyph glyph = getGlyph(glyph_id); + final OutlineShape glyphShape = glyph.getShape(); + if( null == glyphShape ) { + left_glyph = null; + continue; + } + if( null != left_glyph ) { + advanceTotal += left_glyph.getKerning(glyph_id); + } + temp1.translate(advanceTotal, y, temp2); + res.resize(temp1.transform(glyphShape.getBounds(), temp_box)); + + visitor.visit(glyphShape, temp1); + advanceTotal += glyph.getAdvance(); + left_glyph = glyph; + } + } + return res; } @Override diff --git a/src/jogl/classes/jogamp/graph/font/typecast/TypecastGlyph.java b/src/jogl/classes/jogamp/graph/font/typecast/TypecastGlyph.java index d8f46090b..9db8fc6d5 100644 --- a/src/jogl/classes/jogamp/graph/font/typecast/TypecastGlyph.java +++ b/src/jogl/classes/jogamp/graph/font/typecast/TypecastGlyph.java @@ -1,5 +1,5 @@ /** - * Copyright 2011 JogAmp Community. All rights reserved. + * Copyright 2011-2023 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: diff --git a/src/jogl/classes/jogamp/graph/font/typecast/TypecastHMetrics.java b/src/jogl/classes/jogamp/graph/font/typecast/TypecastHMetrics.java index 274114e4a..cae8b2755 100644 --- a/src/jogl/classes/jogamp/graph/font/typecast/TypecastHMetrics.java +++ b/src/jogl/classes/jogamp/graph/font/typecast/TypecastHMetrics.java @@ -1,5 +1,5 @@ /** - * Copyright 2011 JogAmp Community. All rights reserved. + * Copyright 2011-2023 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: diff --git a/src/jogl/classes/jogamp/graph/font/typecast/TypecastRenderer.java b/src/jogl/classes/jogamp/graph/font/typecast/TypecastRenderer.java index 8099a2ff7..d6fade9f3 100644 --- a/src/jogl/classes/jogamp/graph/font/typecast/TypecastRenderer.java +++ b/src/jogl/classes/jogamp/graph/font/typecast/TypecastRenderer.java @@ -1,5 +1,5 @@ /** - * Copyright 2011 JogAmp Community. All rights reserved. + * Copyright 2011-2023 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: |