From f51933f0ebe9ae030c26c066e59a728ce08b8559 Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Sun, 23 Feb 2014 06:11:11 +0100
Subject: Bug 801: Graph TextRenderer Cleanup Part-1a (unclean)

Remark: This commit is unclean and requires 'Part-1b' due to
        merging this commit after more than 2 years!

Graph:
  - Use List<OutlineShape> instead of array
    allowing more flexible memory managment.

  - GLRegion -> Region promotion:
    - Region create(List<OutlineShape> outlineShapes, int renderModes)
    - Region create(OutlineShape outlineShape, int renderModes)

  - Region additions
    - void addOutlineShape(OutlineShape shape)
    - void addOutlineShapes(List<OutlineShape> shapes)

  - RegionRenderer
    - draw(..) remove 'position', redundant
    -

  - Deprecate 'TextRenderer' and 'GlyphString'
    Use Region.create(Font.getOutlineShapes(...)) + RegionRenderer instead.

  - FontInt -> Font promotion (make public)
    - getOutlineShape and getOutlineShapes

  - Font.Glyph additions
    - 'getID(), hashCode()'
    - 'float getScale(float pixelSize)'

  - GlyphShape
    - Add reference to Glyph allowing GlyphString
      to access the font metrics for translation and scaling

    - Experimental pre-scale/translation in GlyphString
      using default font size and it's metrics
---
 .../jogamp/graph/curve/text/GlyphString.java       | 105 ++++++++++++---------
 1 file changed, 63 insertions(+), 42 deletions(-)

(limited to 'src/jogl/classes/jogamp/graph/curve/text/GlyphString.java')

diff --git a/src/jogl/classes/jogamp/graph/curve/text/GlyphString.java b/src/jogl/classes/jogamp/graph/curve/text/GlyphString.java
index f86d02f40..13da49d9e 100644
--- a/src/jogl/classes/jogamp/graph/curve/text/GlyphString.java
+++ b/src/jogl/classes/jogamp/graph/curve/text/GlyphString.java
@@ -28,6 +28,7 @@
 package jogamp.graph.curve.text;
 
 import java.util.ArrayList;
+import java.util.List;
 
 import com.jogamp.graph.font.Font;
 import com.jogamp.graph.geom.AABBox;
@@ -39,7 +40,7 @@ import com.jogamp.graph.geom.opengl.SVertex;
 import javax.media.opengl.GL2ES2;
 
 import jogamp.graph.curve.opengl.RegionFactory;
-import jogamp.graph.font.FontInt;
+import jogamp.graph.geom.plane.AffineTransform;
 
 import com.jogamp.graph.curve.OutlineShape;
 import com.jogamp.graph.curve.Region;
@@ -47,56 +48,61 @@ import com.jogamp.graph.curve.opengl.GLRegion;
 import com.jogamp.graph.curve.opengl.RenderState;
 import com.jogamp.opengl.util.PMVMatrix;
 
+/**
+ * @deprecated use {@link com.jogamp.graph.font.Font#getOutlineShapes(java.util.List, CharSequence, float, Factory)},
+ *             {@link com.jogamp.graph.curve.Region#create(OutlineShape, int)}
+ *             and a {@link com.jogamp.graph.curve.opengl.RegionRenderer}.
+ */
 public class GlyphString {
     /** Static font size for all default font OutlineShape generations via {@link #createString(OutlineShape, Factory, Font, String)}.
      * <p>The actual font size shall be accomplished by the GL PMV matrix.</p>
      */
     public static final int STATIC_FONT_SIZE = 10;
-    
-    private ArrayList<GlyphShape> glyphs = new ArrayList<GlyphShape>();
-    private CharSequence str;
-    private String fontname;
+
+    private final ArrayList<GlyphShape> glyphs = new ArrayList<GlyphShape>();
+    private final CharSequence str;
+    private final String fontname;
     private GLRegion region;
-    
-    private SVertex origin = new SVertex();
+
+    private final SVertex origin = new SVertex();
 
     /**
      * <p>Uses {@link #STATIC_FONT_SIZE}.</p>
      * <p>No caching is performed.</p>
-     * 
+     *
      * @param shape is not null, add all {@link GlyphShape}'s {@link Outline} to this instance.
      * @param vertexFactory vertex impl factory {@link Factory}
-     * @param font the target {@link Font} 
+     * @param font the target {@link Font}
      * @param str string text
      * @return the created {@link GlyphString} instance
      */
     public static GlyphString createString(OutlineShape shape, Factory<? extends Vertex> vertexFactory, Font font, String str) {
-        return createString(shape, vertexFactory, font, STATIC_FONT_SIZE, str); 
+        return createString(shape, vertexFactory, font, STATIC_FONT_SIZE, str);
     }
-    
+
     /**
      * <p>No caching is performed.</p>
-     * 
+     *
      * @param shape is not null, add all {@link GlyphShape}'s {@link Outline} to this instance.
      * @param vertexFactory vertex impl factory {@link Factory}
-     * @param font the target {@link Font} 
+     * @param font the target {@link Font}
      * @param fontSize font size
      * @param str string text
      * @return the created {@link GlyphString} instance
      */
-    public static GlyphString createString(OutlineShape shape, Factory<? extends Vertex> vertexFactory, Font font, int fontSize, String str) {
-    	ArrayList<OutlineShape> shapes = ((FontInt)font).getOutlineShapes(str, fontSize, vertexFactory);
-        
+    public static GlyphString createString(OutlineShape shape, Factory<? extends Vertex> vertexFactory, Font font, int fontSize, CharSequence str) {
+    	List<OutlineShape> shapes = font.getOutlineShapes(null, str, fontSize, vertexFactory);
+
         GlyphString glyphString = new GlyphString(font.getName(Font.NAME_UNIQUNAME), str);
-        glyphString.createfromOutlineShapes(vertexFactory, shapes);
+        glyphString.createfromOutlineShapes(vertexFactory, font, str, shapes);
         if(null != shape) {
             for(int i=0; i<glyphString.glyphs.size(); i++) {
                 shape.addOutlineShape(glyphString.glyphs.get(i).getShape());
-            }    
+            }
         }
         return glyphString;
     }
-    
+
     /** Create a new GlyphString object
      * @param fontname the name of the font that this String is
      * associated with
@@ -106,62 +112,77 @@ public class GlyphString {
         this.fontname = fontname;
         this.str = str;
     }
-    
+
     public void addGlyphShape(GlyphShape glyph){
         glyphs.add(glyph);
     }
-    
+
     public CharSequence getString(){
         return str;
     }
 
-    /**Creates the Curve based Glyphs from a list of {@link OutlineShape} 
+    /**Creates the Curve based Glyphs from a list of {@link OutlineShape}
      * @param vertexFactory vertex impl factory {@link Factory}
-     * @param shapes list of {@link OutlineShape} 
+     * @param shapes list of {@link OutlineShape}
      */
-    public void createfromOutlineShapes(Factory<? extends Vertex> vertexFactory, ArrayList<OutlineShape> shapes) {
+    public void createfromOutlineShapes(Factory<? extends Vertex> vertexFactory, Font font, CharSequence str, List<OutlineShape> shapes) {
+        if(shapes.size() != str.length()) {
+            throw new InternalError("XXX");
+        }
         final int numGlyps = shapes.size();
         for (int index=0;index<numGlyps;index++){
             if(shapes.get(index) == null){
                 continue;
             }
-            GlyphShape glyphShape = new GlyphShape(vertexFactory, shapes.get(index));
-            
+            GlyphShape glyphShape = new GlyphShape(vertexFactory,
+                                                   font.getGlyph(str.charAt(index)),
+                                                   shapes.get(index));
+
             if(glyphShape.getNumVertices() < 3) {
                 continue;
-            }            
+            }
             addGlyphShape(glyphShape);
         }
     }
-    
-    
+
+
     /** Generate a OGL Region to represent this Object.
      * @param gl the current gl object
      * @param rs the current attached RenderState
-     * @param renderModes bit-field of modes, e.g. {@link Region#VARIABLE_CURVE_WEIGHT_BIT}, {@link Region#VBAA_RENDERING_BIT} 
+     * @param renderModes bit-field of modes, e.g. {@link Region#VARIABLE_CURVE_WEIGHT_BIT}, {@link Region#VBAA_RENDERING_BIT}
      */
     public GLRegion createRegion(GL2ES2 gl, int renderModes){
         region = RegionFactory.create(renderModes);
         // region.setFlipped(true);
-        
+        float y = 0;
+        float advanceTotal = 0;
+        AffineTransform t = new AffineTransform();
+
         int numVertices = region.getNumVertices();
-        
+
         for(int i=0; i< glyphs.size(); i++) {
-            final GlyphShape glyph = glyphs.get(i);
-            ArrayList<Triangle> gtris = glyph.triangulate();
+            final GlyphShape glyphShape = glyphs.get(i);
+            Font.Metrics metrics = glyphShape.getGlyph().getFont().getMetrics();
+            final float scale = metrics.getScale(STATIC_FONT_SIZE);
+            t.translate(advanceTotal, y);
+            t.scale(scale, scale);
+
+            ArrayList<Triangle> gtris = glyphShape.triangulate();
             region.addTriangles(gtris);
-            
-            final ArrayList<Vertex> gVertices = glyph.getVertices();
+
+            final ArrayList<Vertex> gVertices = glyphShape.getVertices();
             for(int j=0; j<gVertices.size(); j++) {
                 final Vertex gVert = gVertices.get(j);
                 gVert.setId(numVertices++);
                 region.addVertex(gVert);
             }
+
+            advanceTotal += glyphShape.getGlyph().getAdvance(STATIC_FONT_SIZE, true);
         }
         return region;
     }
-    
-    /** Generate a Hashcode for this object 
+
+    /** Generate a Hashcode for this object
      * @return a string defining the hashcode
      */
     public String getTextHashCode(){
@@ -180,15 +201,15 @@ public class GlyphString {
      * @param rs the RenderState to be used
      * @param vp_width current screen width
      * @param vp_height current screen height
-     * @param texWidth desired texture width for multipass-rendering. 
+     * @param texWidth desired texture width for multipass-rendering.
      *        The actual used texture-width is written back when mp rendering is enabled, otherwise the store is untouched.
      */
     public void renderString3D(GL2ES2 gl, RenderState rs, int vp_width, int vp_height, int[/*1*/] texWidth) {
         region.draw(gl, rs, vp_width, vp_height, texWidth);
     }
-    
+
     /** Get the Origin of this GlyphString
-     * @return 
+     * @return
      */
     public Vertex getOrigin() {
         return origin;
@@ -206,7 +227,7 @@ public class GlyphString {
         }
         glyphs.clear();
     }
-    
+
     public AABBox getBounds(){
         return region.getBounds();
     }
-- 
cgit v1.2.3