You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-dev@xmlgraphics.apache.org by de...@apache.org on 2001/11/06 19:48:18 UTC

cvs commit: xml-batik/sources/org/apache/batik/gvt/text GlyphLayout.java

deweese     01/11/06 10:48:18

  Modified:    sources/org/apache/batik/gvt/font AWTGVTGlyphVector.java
                        GVTGlyphMetrics.java
               sources/org/apache/batik/gvt/text GlyphLayout.java
  Log:
  1) Fixed a long standing bug in the selection of text smaller than
     one user space unit.
  
  Revision  Changes    Path
  1.12      +9 -6      xml-batik/sources/org/apache/batik/gvt/font/AWTGVTGlyphVector.java
  
  Index: AWTGVTGlyphVector.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/font/AWTGVTGlyphVector.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- AWTGVTGlyphVector.java	2001/11/05 20:04:11	1.11
  +++ AWTGVTGlyphVector.java	2001/11/06 18:48:17	1.12
  @@ -34,7 +34,7 @@
    * This is a wrapper class for a java.awt.font.GlyphVector instance.
    *
    * @author <a href="mailto:bella.robinson@cmis.csiro.au">Bella Robinson</a>
  - * @version $Id: AWTGVTGlyphVector.java,v 1.11 2001/11/05 20:04:11 deweese Exp $
  + * @version $Id: AWTGVTGlyphVector.java,v 1.12 2001/11/06 18:48:17 deweese Exp $
    */
   public class AWTGVTGlyphVector implements GVTGlyphVector {
   
  @@ -85,8 +85,8 @@
           GVTLineMetrics lineMetrics = gvtFont.getLineMetrics
               ("By", awtGlyphVector.getFontRenderContext());
   
  -        ascent  = lineMetrics.getAscent() *scaleFactor;
  -        descent = lineMetrics.getDescent()*scaleFactor;
  +        ascent  = lineMetrics.getAscent();
  +        descent = lineMetrics.getDescent();
   
   
           int numGlyphs = glyphVector.getNumGlyphs();
  @@ -181,9 +181,11 @@
               GVTGlyphMetrics glyphMetrics   = getGlyphMetrics(i);
                   
               float glyphX      = 0;
  -            float glyphY      = -ascent;
  -            float glyphWidth  = glyphMetrics.getHorizontalAdvance();
  -            float glyphHeight = glyphMetrics.getVerticalAdvance();
  +            float glyphY      = -ascent/scaleFactor;
  +            float glyphWidth  = (glyphMetrics.getHorizontalAdvance()/
  +                                 scaleFactor);
  +            float glyphHeight = (glyphMetrics.getVerticalAdvance()/
  +                                 scaleFactor);
                   
               Rectangle2D glyphBounds = new Rectangle2D.Double(glyphX, 
                                                                glyphY,
  @@ -214,6 +216,7 @@
                       
                   if (glyphTransform != null)
                       tr.concatenate(glyphTransform);
  +                tr.scale(scaleFactor, scaleFactor);
   
                   tempLogicalBounds[i] = tr.createTransformedShape(glyphBounds);
                       
  
  
  
  1.4       +3 -3      xml-batik/sources/org/apache/batik/gvt/font/GVTGlyphMetrics.java
  
  Index: GVTGlyphMetrics.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/font/GVTGlyphMetrics.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- GVTGlyphMetrics.java	2001/09/17 16:28:27	1.3
  +++ GVTGlyphMetrics.java	2001/11/06 18:48:17	1.4
  @@ -16,7 +16,7 @@
    * with the addition of horizontal and vertical advance values.
    *
    * @author <a href="mailto:bella.robinson@cmis.csiro.au">Bella Robinson</a>
  - * @version $Id: GVTGlyphMetrics.java,v 1.3 2001/09/17 16:28:27 tkormann Exp $
  + * @version $Id: GVTGlyphMetrics.java,v 1.4 2001/11/06 18:48:17 deweese Exp $
    */
   public class GVTGlyphMetrics {
   
  @@ -44,9 +44,9 @@
        * @param glyphType The type of the glyph.
        */
       public GVTGlyphMetrics(float horizontalAdvance, 
  -			   float verticalAdvance,
  +                           float verticalAdvance,
                              Rectangle2D bounds, 
  -			   byte glyphType) {
  +                           byte glyphType) {
           this.gm = new GlyphMetrics(horizontalAdvance, bounds, glyphType);
           this.verticalAdvance = verticalAdvance;
       }
  
  
  
  1.27      +4 -165    xml-batik/sources/org/apache/batik/gvt/text/GlyphLayout.java
  
  Index: GlyphLayout.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/text/GlyphLayout.java,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- GlyphLayout.java	2001/11/05 20:04:11	1.26
  +++ GlyphLayout.java	2001/11/06 18:48:18	1.27
  @@ -42,7 +42,7 @@
    * @see org.apache.batik.gvt.text.TextSpanLayout
    *
    * @author <a href="bill.haneman@ireland.sun.com>Bill Haneman</a>
  - * @version $Id: GlyphLayout.java,v 1.26 2001/11/05 20:04:11 deweese Exp $
  + * @version $Id: GlyphLayout.java,v 1.27 2001/11/06 18:48:18 deweese Exp $
    */
   public class GlyphLayout implements TextSpanLayout {
   
  @@ -442,67 +442,7 @@
           return shape;
       }
   
  -    /**
  -     * This checks for simple self-intersections in the poly-line
  -     * described by the array of points in <tt>pts</tt>.
  -     * @param pts array of points to visit (modified by function).
  -     * @param numPts The number of points to use out of pts.
  -     * @param numPrev The number of previous segments to check
  -     *        note that 1 will never find anything.
  -     * @return the number of points to use remaining in <tt>pts</tt>.
  -     */
  -    public static int cleanPtsList(Point2D.Float [] pts, int numPts,
  -                                   int numPrev) {
  -        // Can't get into trouble with only 3 points...
  -        if (numPts < 4) return numPts;
  -
  -        Point2D.Float pt00, pt01, pt10, pt11;
  -        pt01 = pts[0];
  -        pt10 = pts[1];
  -        pt11 = pts[2];
  -        int outPts = 3;
  -        Point2D.Float inter;
  -        for (int i=3; i<numPts; i++) {
  -            pt10 = pts[outPts-1];
  -            pt11 = pts[i];
  -
  -            int oldest = (outPts-1)-numPrev;
  -            if (oldest < 0) oldest = 0;
  -            while (oldest < outPts-2) {
  -                pt00 = pts[oldest];
  -                pt01 = pts[oldest+1];
  -
  -                inter = calcIntervalIntersection(pt00, pt01, pt10, pt11);
  -                if (inter != null) {
  -                    // We got an intersection (lines crossed over each other)
  -                    // So lets remove the cross over...
  -                    //        00\     __11
  -                    //          _\_--
  -                    //       10____\01
  -                    //
  -                    //  We want to replace this with 00->inter->11
  -                    // This means replacing 01 with inter, and replacing
  -                    // 10 with 11
  -                    pts[oldest+1] = inter;  
  -                    pts[oldest+2] = pt11; 
  -                    outPts = oldest+3;
  -                    break;
  -                }
  -                oldest++;
  -            }
  -            if (oldest == outPts-2) {
  -                // clean add pt11.
  -                pts[outPts] = pt11;
  -                outPts++;
  -            }
  -        }
  -
  -        // If we removed points clean the list again...
  -        if (outPts != numPts)
  -            return cleanPtsList(pts, outPts, numPrev);
  -
  -        return outPts;
  -    }
  +    public static final float eps = 0.00001f;
   
       public static int makeConvexHull(Point2D.Float [] pts, int numPts) {
           // Sort the Pts in X...
  @@ -765,109 +705,7 @@
               shape.append(shapes[0], false);
       }
   
  -    public static final float eps = 0.00001f;
  -
       /**
  -     * Checks if 'check' is in the range of pt along vec.
  -     * If it is it returns check otherwise it returns null.
  -     * if check is null it returns null.
  -     */
  -    public static Point2D.Float verifyInRange
  -        (Point2D.Float check, Point2D.Float pt, Point2D.Float vec) {
  -        if (check == null) return null;
  -        float t;
  -        if ((vec.x == 0) && (vec.y == 0)) {
  -            // really isn't a line just a point, so only in range if
  -            // check and pt match.
  -            if ((Math.abs(pt.x - check.x) < eps) &&
  -                (Math.abs(pt.y - check.y) < eps))
  -                return check;
  -
  -            return null;
  -        }
  -
  -        // Otherwise divide by greater of two deltas...
  -        if (Math.abs(vec.x) > Math.abs(vec.y))
  -            t = (check.x-pt.x)/vec.x;
  -        else
  -            t = (check.y-pt.y)/vec.y;
  -
  -        // if t is out of range return null...
  -        if ((t < 0) || (t > 1)) return null;
  -
  -        // Otherwise return check.
  -        return check;
  -    }
  -
  -    /**
  -     * The most elegant line intersection alg I've seen.
  -     * It returns the intersection of the line defined by
  -     * pt00 and pt01, and pt10 and pt11 or null if the two lines
  -     * don't intersect between the given end points.
  -     */
  -    public static Point2D.Float calcIntervalIntersection
  -        (Point2D.Float pt00, Point2D.Float pt01,
  -         Point2D.Float pt10, Point2D.Float pt11) {
  -
  -        Point2D.Float vec0 = new Point2D.Float(pt01.x-pt00.x, pt01.y-pt00.y);
  -        Point2D.Float vec1 = new Point2D.Float(pt11.x-pt10.x, pt11.y-pt10.y);
  -
  -        /* I'm use the form dx*y - dy*x + c1 = 0 for the lines,
  -         * So lets calculate c1 & c2 from the line specification.
  -         */
  -        float c0 = vec0.y*pt00.x-vec0.x*pt00.y;
  -        float c1 = vec1.y*pt10.x-vec1.x*pt10.y;
  -
  -
  -        // try plugging one pt into
  -        // the others line and see which side of the line it is on,
  -        // if they are always on the same sides then they don't intersect
  -        // in the interval given.
  -        int sign0, sign1;
  -        float soln;
  -        soln = (vec0.x*pt10.y-vec0.y*pt10.x+c0);
  -        if      (soln < -eps) sign0 = -1;
  -        else if (soln >  eps) sign0 = 1;
  -        else return verifyInRange(pt10, pt00, vec0);
  -
  -        soln = (vec0.x*pt11.y-vec0.y*pt11.x+c0);
  -        if      (soln < -eps) sign1 = -1;
  -        else if (soln >  eps) sign1 = 1;
  -        else return verifyInRange(pt11, pt00, vec0);
  -
  -        if (sign0 == sign1) {
  -            // same side of line 0, check other way round...
  -            soln = (vec1.x*pt00.y-vec1.y*pt00.x+c1);
  -            if      (soln < -eps) sign0 = -1;
  -            else if (soln >  eps) sign0 = 1;
  -            else return verifyInRange(pt00, pt10, vec1);
  -
  -            soln = (vec1.x*pt01.y-vec1.y*pt01.x+c1);
  -            if      (soln < -eps) sign1 = -1;
  -            else if (soln >  eps) sign1 = 1;
  -            else return verifyInRange(pt01, pt10, vec1);
  -
  -            if (sign0 == sign1) 
  -                // Also on same side so no intersection.
  -                return null;
  -        }
  -
  -        // We now now that the lines at least span each other (and not
  -        // at end points), figure out where they intersect.
  -
  -        Point2D.Float ret;
  -
  -        // Solve the equations for x & y.
  -        float cross = (vec0.x*vec1.y - vec0.y*vec1.x);
  -        ret = new Point2D.Float((vec0.x*c1-vec1.x*c0)/cross,
  -                                (vec0.y*c1-vec1.y*c0)/cross);
  -
  -        ret = verifyInRange(ret, pt00, vec0);
  -        ret = verifyInRange(ret, pt10, vec1);
  -        return ret;
  -    }
  -
  -    /**
        * Perform hit testing for coordinate at x, y.
        *
        * @param x the x coordinate of the point to be tested.
  @@ -896,7 +734,8 @@
               Shape gbounds = gv.getGlyphLogicalBounds(i);
               if (gbounds != null) {
                   Rectangle2D gbounds2d = gbounds.getBounds2D();
  -
  +                // System.out.println("Hit Test: [" + x + ", " + y + "] - " +
  +                //                    gbounds2d);
                   if (gbounds.contains(x, y)) {
                       boolean isRightHalf =
                           (x > (gbounds2d.getX()+(gbounds2d.getWidth()/2d)));
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: batik-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-dev-help@xml.apache.org