From 8d598ac75213a7d298b2633bf5d84b215339769e Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Wed, 15 Feb 2023 06:58:54 +0100 Subject: Graph: TextRegionUtil: Make addStringToRegion(..) versatile/usable w/ optional AffineTransform (see Label0) --- .../jogamp/graph/curve/opengl/TextRegionUtil.java | 69 +++++++++++++++------- 1 file changed, 48 insertions(+), 21 deletions(-) (limited to 'src/jogl') diff --git a/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRegionUtil.java b/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRegionUtil.java index 714be1998..fb77775ad 100644 --- a/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRegionUtil.java +++ b/src/jogl/classes/com/jogamp/graph/curve/opengl/TextRegionUtil.java @@ -37,8 +37,7 @@ import com.jogamp.opengl.math.geom.AABBox; import com.jogamp.graph.curve.OutlineShape; import com.jogamp.graph.curve.Region; import com.jogamp.graph.font.Font; -import com.jogamp.graph.geom.Vertex; -import com.jogamp.graph.geom.Vertex.Factory; +import com.jogamp.graph.font.Font.Glyph; import com.jogamp.graph.geom.plane.AffineTransform; /** @@ -67,28 +66,53 @@ public class TextRegionUtil { } /** - * Add the string in 3D space w.r.t. the font in font em-size [0..1] at the end of the {@link GLRegion}. + * Add the string in 3D space w.r.t. the font in font em-size [0..1] at the end of the {@link GLRegion} + * while passing the progressed {@link AffineTransform}. *

- * The shapes added to the GLRegion are in font em-size [0..1]. + * The shapes added to the GLRegion are in font em-size [0..1], but can be adjusted with the given transform, progressed and passed to the visitor. + *

+ *

+ * Origin of rendered text is 0/0 at bottom left. + *

+ * @param region the {@link GLRegion} sink + * @param font the target {@link Font} + * @param transform optional given transform + * @param str string text + * @param rgbaColor if {@link Region#hasColorChannel()} RGBA color must be passed, otherwise value is ignored. + * @return the bounding box of the given string by taking each glyph's font em-sized [0..1] OutlineShape into account. + */ + public static AABBox addStringToRegion(final Region region, final Font font, final AffineTransform transform, + final CharSequence str, final float[] rgbaColor) { + return addStringToRegion(region, font, transform, str, rgbaColor, new AffineTransform(), new AffineTransform()); + } + + /** + * Add the string in 3D space w.r.t. the font in font em-size [0..1] at the end of the {@link GLRegion} + * while passing the progressed {@link AffineTransform}. + *

+ * The shapes added to the GLRegion are in font em-size [0..1], but can be adjusted with the given transform, progressed and passed to the visitor. + *

+ *

+ * Origin of rendered text is 0/0 at bottom left. *

* @param region the {@link GLRegion} sink - * @param vertexFactory vertex impl factory {@link Factory} * @param font the target {@link Font} + * @param transform optional given transform * @param str string text * @param rgbaColor if {@link Region#hasColorChannel()} RGBA color must be passed, otherwise value is ignored. * @param temp1 temporary AffineTransform storage, mandatory * @param temp2 temporary AffineTransform storage, mandatory * @return the bounding box of the given string by taking each glyph's font em-sized [0..1] OutlineShape into account. */ - public static AABBox addStringToRegion(final GLRegion region, final Factory vertexFactory, - final Font font, final CharSequence str, final float[] rgbaColor, + public static AABBox addStringToRegion(final Region region, final Font font, final AffineTransform transform, + final CharSequence str, final float[] rgbaColor, final AffineTransform temp1, final AffineTransform temp2) { final OutlineShape.Visitor visitor = new OutlineShape.Visitor() { @Override public final void visit(final OutlineShape shape, final AffineTransform t) { region.addOutlineShape(shape, t, region.hasColorChannel() ? rgbaColor : null); } }; - return font.processString(visitor, null, str, temp1, temp2); + return font.processString(visitor, transform, str, temp1, temp2); } /** @@ -97,6 +121,9 @@ public class TextRegionUtil { * The shapes added to the GLRegion are in font em-size [0..1]. *

*

+ * Origin of rendered text is 0/0 at bottom left. + *

+ *

* Cached {@link GLRegion}s will be destroyed w/ {@link #clear(GL2ES2)} or to free memory. *

* @param gl the current GL state @@ -117,13 +144,15 @@ public class TextRegionUtil { } final int special = 0; GLRegion region = getCachedRegion(font, str, special); + AABBox res; if(null == region) { region = GLRegion.create(renderModes, null); - addStringToRegion(region, renderer.getRenderState().getVertexFactory(), font, str, rgbaColor, tempT1, tempT2); + res = addStringToRegion(region, font, null, str, rgbaColor, tempT1, tempT2); addCachedRegion(gl, font, str, special, region); + } else { + res = new AABBox(); + res.copy(region.getBounds()); } - final AABBox res = new AABBox(); - res.copy(region.getBounds()); region.draw(gl, renderer, sampleCount); return res; } @@ -134,6 +163,9 @@ public class TextRegionUtil { * The shapes added to the GLRegion are in font em-size [0..1]. *

*

+ * Origin of rendered text is 0/0 at bottom left. + *

+ *

* In case of a multisampling region renderer, i.e. {@link Region#VBAA_RENDERING_BIT}, recreating the {@link GLRegion} * is a huge performance impact. * In such case better use {@link #drawString3D(GL2ES2, GLRegion, RegionRenderer, Font, CharSequence, float[], int[])} @@ -155,12 +187,8 @@ public class TextRegionUtil { if(!renderer.isInitialized()){ throw new GLException("TextRendererImpl01: not initialized!"); } - final AffineTransform temp1 = new AffineTransform(); - final AffineTransform temp2 = new AffineTransform(); final GLRegion region = GLRegion.create(renderModes, null); - addStringToRegion(region, renderer.getRenderState().getVertexFactory(), font, str, rgbaColor, temp1, temp2); - final AABBox res = new AABBox(); - res.copy(region.getBounds()); + final AABBox res = addStringToRegion(region, font, null, str, rgbaColor); region.draw(gl, renderer, sampleCount); region.destroy(gl); return res; @@ -172,6 +200,9 @@ public class TextRegionUtil { *

* The shapes added to the GLRegion are in font em-size [0..1]. *

+ *

+ * Origin of rendered text is 0/0 at bottom left. + *

* @param gl the current GL state * @param font {@link Font} to be used * @param str text to be rendered @@ -187,12 +218,8 @@ public class TextRegionUtil { if(!renderer.isInitialized()){ throw new GLException("TextRendererImpl01: not initialized!"); } - final AffineTransform temp1 = new AffineTransform(); - final AffineTransform temp2 = new AffineTransform(); region.clear(gl); - addStringToRegion(region, renderer.getRenderState().getVertexFactory(), font, str, rgbaColor, temp1, temp2); - final AABBox res = new AABBox(); - res.copy(region.getBounds()); + final AABBox res = addStringToRegion(region, font, null, str, rgbaColor); region.draw(gl, renderer, sampleCount); return res; } -- cgit v1.2.3