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 2003/02/20 12:15:48 UTC

cvs commit: xml-batik/sources/org/apache/batik/gvt/text RegionInfo.java GlyphIterator.java GlyphLayout.java LineInfo.java MarginInfo.java

deweese     2003/02/20 03:15:47

  Modified:    samples/extensions flowText.svg
               sources/org/apache/batik/extension/svg
                        BatikExtConstants.java
                        SVGFlowTextElementBridge.java
               sources/org/apache/batik/gvt/text GlyphIterator.java
                        GlyphLayout.java LineInfo.java MarginInfo.java
  Added:       samples/extensions flowTextAlign.svg
               sources/org/apache/batik/gvt/text RegionInfo.java
  Log:
  Flow text syntax is now brought up to date with SVG Drafts (see examples)
  Flow text now supports vertical-align attribute on flowRegion elements.
  New (boring) test for vertical align property.
  
  Revision  Changes    Path
  1.8       +15 -15    xml-batik/samples/extensions/flowText.svg
  
  Index: flowText.svg
  ===================================================================
  RCS file: /home/cvs/xml-batik/samples/extensions/flowText.svg,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- flowText.svg	15 Nov 2002 15:46:50 -0000	1.7
  +++ flowText.svg	20 Feb 2003 11:15:46 -0000	1.8
  @@ -34,20 +34,20 @@
         <line x1="243" y1="70" x2="243" y2="490" stroke="grey" fill="none"/>
         <line x1="423" y1="70" x2="423" y2="490" stroke="grey" fill="none"/>
   
  -      <batik:flowText xmlns:batik="http://xml.apache.org/batik/ext"
  -             font-size="20" xml:space="preserve">
  -         <batik:flowLayout>
  -	    <batik:flowRegion x="17"  y="80" width="200" height="400"/>
  -	    <batik:flowRegion x="233" y="80" width="200" height="400"/>
  -         </batik:flowLayout>
  +      <flowText font-size="20" xml:space="preserve"
  +                xmlns="http://xml.apache.org/batik/ext">
  +         <flowRegion>
  +	    <rect x="17"  y="80" width="200" height="400"/>
  +	    <rect x="233" y="80" width="200" height="400"/>
  +         </flowRegion>
   
  -         <batik:flowDiv>
  -	    <batik:flowPara first-line-left-margin="20" bottom-margin="10" >This is an <batik:flowSpan font-size="40" fill="crimson">ex&#x00AD;ample</batik:flowSpan> of a very long string that is split &#x200D;across multi&#x00AD;ple lines via text wrap&#x0AD;ping.</batik:flowPara>
  -	    <batik:flowPara justification="middle" top-margin="10" left-margin="10" right-margin="10" bottom-margin="10"><batik:flowLine>Now check if text wrapping handles a number of tricky</batik:flowLine> situations: averylongrunonwordthatspansmultiplelines<batik:flowSpan font-weight="bold">with<batik:flowSpan fill="crimson">embedded</batik:flowSpan>span</batik:flowSpan>elements &amp; <batik:flowSpan fill="green" dy="-.3em" font-size="80%">super</batik:flowSpan><batik:flowSpan dy=".3em"> or </batik:flowSpan><batik:flowSpan fill="darkgreen" dy=".3em" font-size="80%">sub</batik:flowSpan><batik:flowSpan dy="-.3em"> scripts.</batik:flowSpan></batik:flowPara>
  -	    <batik:flowPara top-margin="10" justification="end">Now we are just <batik:flowSpan font-size="30" fill="blue">about</batik:flowSpan> to go to the next flow rect <batik:flowSpan font-size="10">(note if the 'about' were included on the last line of the previous flow rect the line would not have fit and the whole line would have moved here).</batik:flowSpan></batik:flowPara>
  -	    <batik:flowPara margin="10" justification="full">     I'll keep going because I want to make sure that it properly stops when it hits the end of all of the the flow regions defined. Also the last line includes text in a larger font size so it will not fit. Thus the end of this sentence will be cut off because the line size gets <batik:flowSpan font-size="35">tall</batik:flowSpan>er</batik:flowPara>
  -         </batik:flowDiv>
  -      </batik:flowText>
  +         <flowDiv>
  +	    <flowPara indent="20" bottom-margin="10" >This is an <flowSpan font-size="40" fill="crimson">ex&#x00AD;ample</flowSpan> of a very long string that is split &#x200D;across multi&#x00AD;ple lines via text wrap&#x0AD;ping.</flowPara>
  +	    <flowPara justification="middle" top-margin="10" left-margin="10" right-margin="10" bottom-margin="10"><flowLine>Now check if text wrapping handles a number of tricky</flowLine> situations: averylongrunonwordthatspansmultiplelines<flowSpan font-weight="bold">with<flowSpan fill="crimson">embedded</flowSpan>span</flowSpan>elements &amp; <flowSpan fill="green" dy="-.3em" font-size="80%">super</flowSpan><flowSpan dy=".3em"> or </flowSpan><flowSpan fill="darkgreen" dy=".3em" font-size="80%">sub</flowSpan><flowSpan dy="-.3em"> scripts.</flowSpan></flowPara>
  +	    <flowPara top-margin="10" justification="end">Now we are just <flowSpan font-size="30" fill="blue">about</flowSpan> to go to the next flow rect <flowSpan font-size="10">(note if the 'about' were included on the last line of the previous flow rect the line would not have fit and the whole line would have moved here).</flowSpan></flowPara>
  +	    <flowPara margin="10" justification="full">     I'll keep going because I want to make sure that it properly stops when it hits the end of all of the the flow regions defined. Also the last line includes text in a larger font size so it will not fit. Thus the end of this sentence will be cut off because the line size gets <flowSpan font-size="35">tall</flowSpan>er</flowPara>
  +         </flowDiv>
  +      </flowText>
      </g>
   
       <!-- ============================================================= -->
  
  
  
  1.1                  xml-batik/samples/extensions/flowTextAlign.svg
  
  Index: flowTextAlign.svg
  ===================================================================
  <?xml version="1.0" standalone="no"?>
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
  "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
  
  <!-- ====================================================================== -->
  <!-- Copyright (C) The Apache Software Foundation. All rights reserved.     -->
  <!--                                                                        -->
  <!-- This software is published under the terms of the Apache Software      -->
  <!-- License version 1.1, a copy of which has been included with this       -->
  <!-- distribution in  the LICENSE file.                                     -->
  <!-- ====================================================================== -->
  
  <!-- ====================================================================== -->
  <!-- Tests various text on a path                                           -->
  <!--                                                                        -->
  <!-- @author bella.robinson@cmis.csiro.au                                   -->
  <!-- @version $Id: flowTextAlign.svg,v 1.1 2003/02/20 11:15:46 deweese Exp $   -->
  <!-- ====================================================================== -->
  
  <?xml-stylesheet type="text/css" href="extension.css" ?>
  
  <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="body" width="450" height="500" viewBox="0 0 450 500">
  <title>Test of Text vertical-align.</title>
  
     <g id="content" >
        <text class="title" x="50%" y="40">Test of Text vertical-align</text>
  
        <g font-family="serif" transform="translate(0,60)">
  	 <g fill="rgb(220,220,255)">
        	    <rect x="12.5"  y="0" width="125" height="36"/>
        	    <rect x="162.5" y="0" width="125" height="36"/>
        	    <rect x="312.5" y="0" width="125" height="36"/>
  	 </g>
  
        	 <flowText xmlns="http://xml.apache.org/batik/ext"
        	           font-size="24" xml:space="preserve">
        	    <flowRegion vertical-align="top">
        	            <rect x="12.5"  y="0" width="125" height="36"/>
        	    </flowRegion>
        	    <flowRegion vertical-align="middle">
        	            <rect x="162.5"  y="0" width="125" height="36"/>
        	    </flowRegion>
        	    <flowRegion vertical-align="bottom">
        	            <rect x="312.5"  y="0" width="125" height="36"/>
        	    </flowRegion>
        	    <flowDiv>
  	       <flowRegionBreak justification="middle"
  		>Try top</flowRegionBreak>
                 <flowRegionBreak justification="middle"
  		      >Try middle</flowRegionBreak>
                 <flowRegionBreak justification="middle"
  		      >Try bottom</flowRegionBreak>
  	    </flowDiv>
        	 </flowText>
        </g>
  
        <g font-family="serif" transform="translate(0,120)" >
  	 <g fill="rgb(220,220,255)">
        	    <rect x="12.5"  y="0"  width="125" height="36"/>
        	    <rect x="12.5"  y="40" width="125" height="36"/>
        	    <rect x="162.5" y="0"  width="125" height="36"/>
        	    <rect x="162.5" y="40" width="125" height="36"/>
        	    <rect x="312.5" y="0"  width="125" height="36"/>
        	    <rect x="312.5" y="40" width="125" height="36"/>
  	 </g>
  
        	 <flowText xmlns="http://xml.apache.org/batik/ext"
        	           font-size="24" xml:space="preserve">
        	    <flowRegion vertical-align="top">
        	            <rect x="12.5"  y="0"  width="125" height="36"/>
        	            <rect x="12.5"  y="40" width="125" height="36"/>
        	    </flowRegion>
        	    <flowRegion vertical-align="middle">
        	            <rect x="162.5"  y="0"  width="125" height="36"/>
        	            <rect x="162.5"  y="40" width="125" height="36"/>
        	    </flowRegion>
        	    <flowRegion vertical-align="bottom">
        	            <rect x="312.5"  y="0"  width="125" height="36"/>
        	            <rect x="312.5"  y="40" width="125" height="36"/>
        	    </flowRegion>
        	    <flowDiv>
  	       <flowRegionBreak justification="middle"
  		>Try top two lines</flowRegionBreak>
                 <flowRegionBreak justification="middle"
  		      >Middle two lines</flowRegionBreak>
                 <flowRegionBreak justification="middle"
  		      >Bottom two lines</flowRegionBreak>
  	    </flowDiv>
        	 </flowText>
        </g>
  
        <g font-family="serif" transform="translate(0,220)" >
  	 <g fill="rgb(220,220,255)">
        	    <rect x="12.5"  y="0"  width="125" height="72"/>
        	    <rect x="162.5" y="0"  width="125" height="72"/>
        	    <rect x="312.5" y="0"  width="125" height="72"/>
  	 </g>
  
        	 <flowText xmlns="http://xml.apache.org/batik/ext"
        	           font-size="24" xml:space="preserve">
        	    <flowRegion vertical-align="top">
        	            <rect x="12.5"  y="0"  width="125" height="72"/>
        	    </flowRegion>
        	    <flowRegion vertical-align="middle">
        	            <rect x="162.5"  y="0"  width="125" height="72"/>
        	    </flowRegion>
        	    <flowRegion vertical-align="bottom">
        	            <rect x="312.5"  y="0"  width="125" height="72"/>
        	    </flowRegion>
        	    <flowDiv>
  	       <flowRegionBreak justification="middle"
  		>Try top two lines</flowRegionBreak>
                 <flowRegionBreak justification="middle"
  		      >Middle two lines</flowRegionBreak>
                 <flowRegionBreak justification="middle"
  		      >Bottom two lines</flowRegionBreak>
  	    </flowDiv>
        	 </flowText>
        </g>
  
        <g font-family="serif" transform="translate(0,320)" >
  	 <g fill="rgb(220,220,255)">
        	    <rect x="12.5"  y="0"  width="125" height="72"/>
        	    <rect x="162.5" y="0"  width="125" height="72"/>
        	    <rect x="312.5" y="0"  width="125" height="72"/>
  	 </g>
  
        	 <flowText xmlns="http://xml.apache.org/batik/ext"
        	           font-size="24" xml:space="preserve">
        	    <flowRegion vertical-align="top">
        	            <rect x="12.5"  y="0"  width="125" height="72"/>
        	    </flowRegion>
        	    <flowRegion vertical-align="middle">
        	            <rect x="162.5"  y="0"  width="125" height="72"/>
        	    </flowRegion>
        	    <flowRegion vertical-align="bottom">
        	            <rect x="312.5"  y="0"  width="125" height="72"/>
        	    </flowRegion>
        	    <flowDiv>
  	       <flowPara justification="middle"
  		>Try top</flowPara>
  	       <flowRegionBreak justification="middle"
  		>two lines</flowRegionBreak>
                 <flowPara justification="middle"
  		      >Middle</flowPara>
                 <flowRegionBreak justification="middle"
  		      >two lines</flowRegionBreak>
                 <flowPara justification="middle"
  		      >Bottom</flowPara>
                 <flowRegionBreak justification="middle"
  		      >two lines</flowRegionBreak>
  	    </flowDiv>
        	 </flowText>
        </g>
     </g>
  
      <!-- ============================================================= -->
      <!-- Batik sample mark                                             -->
      <!-- ============================================================= -->
      <use xlink:href="../batikLogo.svg#Batik_Tag_Box" />
  </svg>
  
  
  
  1.15      +70 -51    xml-batik/sources/org/apache/batik/extension/svg/BatikExtConstants.java
  
  Index: BatikExtConstants.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/extension/svg/BatikExtConstants.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- BatikExtConstants.java	25 Nov 2002 16:14:15 -0000	1.14
  +++ BatikExtConstants.java	20 Feb 2003 11:15:47 -0000	1.15
  @@ -23,17 +23,59 @@
       public static final String BATIK_EXT_STAR_TAG = 
           "star";
   
  -    /** Tag name for Batik's flowText extension (SVG 1.1). */
  +    /** Tag name for Batik's flowText extension (SVG 1.2). */
       public static final String BATIK_EXT_FLOW_TEXT_TAG = 
           "flowText";
   
  -    /** Tag name for Batik's flowText extension Region element (SVG 1.1). */
  -    public static final String BATIK_EXT_FLOW_LAYOUT_TAG = 
  -        "flowLayout";
  -    /** Tag name for Batik's flowText extension Region element (SVG 1.1). */
  +    /** Tag name for Batik's flowText extension Region element (SVG 1.2). */
       public static final String BATIK_EXT_FLOW_REGION_TAG = 
           "flowRegion";
   
  +    /** Tag name for Batik's flowText extension Region element (SVG 1.2). */
  +    public static final String BATIK_EXT_FLOW_REGION_EXCLUDE_TAG = 
  +        "flowRegionExclude";
  +
  +    /** Tag name for Batik's flowText extension div element SVG 1.2). */
  +    public static final String BATIK_EXT_FLOW_DIV_TAG = 
  +        "flowDiv";
  +
  +    /** Tag name for Batik's flowText extension p element SVG 1.2). */
  +    public static final String BATIK_EXT_FLOW_PARA_TAG = 
  +        "flowPara";
  +
  +    /** Tag name for Batik's flowText extension flow Region break 
  +     *  element SVG 1.2). */
  +    public static final String BATIK_EXT_FLOW_REGION_BREAK_TAG = 
  +        "flowRegionBreak";
  +
  +    /** Tag name for Batik's flowText extension line element SVG 1.2). */
  +    public static final String BATIK_EXT_FLOW_LINE_TAG = 
  +        "flowLine";
  +
  +    /** Tag name for Batik's flowText extension span element SVG 1.2). */
  +    public static final String BATIK_EXT_FLOW_SPAN_TAG = 
  +        "flowSpan";
  +
  +    /** Tag name for Batik's solid color extension (SVG 1.2). */
  +    public static final String BATIK_EXT_SOLID_COLOR_TAG = 
  +        "solidColor";
  +
  +    /** Tag name for Batik's color switch extension. */
  +    public static final String BATIK_EXT_COLOR_SWITCH_TAG = 
  +        "colorSwitch";
  +
  +    /** Tag name for Batik's histogram normalization extension. */
  +    public static final String BATIK_EXT_HISTOGRAM_NORMALIZATION_TAG =
  +        "histogramNormalization";
  +
  +    /** Tag name for Batik's multiImage extension. */
  +    public static final String BATIK_EXT_MULTI_IMAGE_TAG =
  +        "multiImage";
  +
  +    /** Tag name for Batik's subImage multiImage extension. */
  +    public static final String BATIK_EXT_SUB_IMAGE_TAG =
  +        "subImage";
  +
       /** Attribute name for dx attribute */
       public static final String BATIK_EXT_DX_ATRIBUTE =
           "dx";
  @@ -86,59 +128,36 @@
       /** Attribute name for left-margin attribute */
       public static final String BATIK_EXT_LEFT_MARGIN_ATTRIBUTE = 
           "left-margin";
  -    /** Attribute name for first-line-left-margin attribute */
  -    public static final String BATIK_EXT_FIRST_LINE_LEFT_MARGIN_ATTRIBUTE = 
  -        "first-line-left-margin";
  -    /** Attribute name for first-line-right-margin attribute */
  -    public static final String BATIK_EXT_FIRST_LINE_RIGHT_MARGIN_ATTRIBUTE = 
  -        "first-line-right-margin";
  +    /** Attribute name for indent attribute/property */
  +    public static final String BATIK_EXT_INDENT_ATTRIBUTE = 
  +        "indent";
       /** Attribute name for justification */
       public static final String BATIK_EXT_JUSTIFICATION_ATTRIBUTE = 
           "justification";
  +    /** Value for justification to start of region */
  +    public static final String BATIK_EXT_JUSTIFICATION_START_VALUE  = "start";
  +    /** Value for justification to middle of region */
  +    public static final String BATIK_EXT_JUSTIFICATION_MIDDLE_VALUE = "middle";
  +    /** Value for justification to end of region */
  +    public static final String BATIK_EXT_JUSTIFICATION_END_VALUE    = "end";
  +    /** Value for justification to both edges of region */
  +    public static final String BATIK_EXT_JUSTIFICATION_FULL_VALUE = "full";
  +
  +
       /** Attribute name for preformated data */
       public static final String BATIK_EXT_PREFORMATTED_ATTRIBUTE = 
           "preformatted";
   
  -    /** Tag name for Batik's flowText extension div element SVG 1.1). */
  -    public static final String BATIK_EXT_FLOW_DIV_TAG = 
  -        "flowDiv";
  -
  -    /** Tag name for Batik's flowText extension p element SVG 1.1). */
  -    public static final String BATIK_EXT_FLOW_PARA_TAG = 
  -        "flowPara";
  -
  -    /** Tag name for Batik's flowText extension flow Region break 
  -     *  element SVG 1.1). */
  -    public static final String BATIK_EXT_FLOW_REGION_BREAK_TAG = 
  -        "flowRegionBreak";
  -
  -    /** Tag name for Batik's flowText extension line element SVG 1.1). */
  -    public static final String BATIK_EXT_FLOW_LINE_TAG = 
  -        "flowLine";
  -
  -    /** Tag name for Batik's flowText extension span element SVG 1.1). */
  -    public static final String BATIK_EXT_FLOW_SPAN_TAG = 
  -        "flowSpan";
  -
  -    /** Tag name for Batik's solid color extension (SVG 1.1). */
  -    public static final String BATIK_EXT_SOLID_COLOR_TAG = 
  -        "solidColor";
  -
  -    /** Tag name for Batik's color switch extension. */
  -    public static final String BATIK_EXT_COLOR_SWITCH_TAG = 
  -        "colorSwitch";
  -
  -    /** Tag name for Batik's histogram normalization extension. */
  -    public static final String BATIK_EXT_HISTOGRAM_NORMALIZATION_TAG =
  -        "histogramNormalization";
  -
  -    /** Tag name for Batik's multiImage extension. */
  -    public static final String BATIK_EXT_MULTI_IMAGE_TAG =
  -        "multiImage";
  -
  -    /** Tag name for Batik's subImage multiImage extension. */
  -    public static final String BATIK_EXT_SUB_IMAGE_TAG =
  -        "subImage";
  +   /** Attribute name for preformated data */
  +    public static final String BATIK_EXT_VERTICAL_ALIGN_ATTRIBUTE =
  +        "vertical-align";
  +
  +    /** Value for vertical-align to top of region */
  +    public static final String BATIK_EXT_ALIGN_TOP_VALUE    = "top";
  +    /** Value for vertical-align to middle of region */
  +    public static final String BATIK_EXT_ALIGN_MIDDLE_VALUE = "middle";
  +    /** Value for vertical-align to bottom of region */
  +    public static final String BATIK_EXT_ALIGN_BOTTOM_VALUE = "bottom";
   
       /** Attribute name for sides attribute */
       public static final String BATIK_EXT_SIDES_ATTRIBUTE = 
  
  
  
  1.8       +62 -46    xml-batik/sources/org/apache/batik/extension/svg/SVGFlowTextElementBridge.java
  
  Index: SVGFlowTextElementBridge.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/extension/svg/SVGFlowTextElementBridge.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- SVGFlowTextElementBridge.java	15 Nov 2002 15:46:50 -0000	1.7
  +++ SVGFlowTextElementBridge.java	20 Feb 2003 11:15:47 -0000	1.8
  @@ -39,6 +39,9 @@
   import org.apache.batik.gvt.text.GVTAttributedCharacterIterator;
   import org.apache.batik.gvt.text.MarginInfo;
   import org.apache.batik.gvt.text.TextPath;
  +import org.apache.batik.gvt.text.RegionInfo;
  +
  +import org.apache.batik.util.SVGConstants;
   
   /**
    * Bridge class for the &lt;flowText> element.
  @@ -338,47 +341,71 @@
       }
   
       protected List getRegions(BridgeContext ctx, Element element)  {
  +        List ret = new LinkedList();
           for (Node n = element.getFirstChild();
                n != null; n = n.getNextSibling()) {
               if (n.getNodeType()     != Node.ELEMENT_NODE) continue;
               if (n.getNamespaceURI() != getNamespaceURI()) continue;
  +
               Element e = (Element)n;
   
  -            String ln = n.getLocalName();
  -            if (ln.equals(BATIK_EXT_FLOW_LAYOUT_TAG)) {
  -                return gatherRects(ctx, e);
  +            String ln = e.getLocalName();
  +            if (BATIK_EXT_FLOW_REGION_TAG.equals(ln)) {
  +                // our default alignment is to the top of the flow rect.
  +                float verticalAlignment = 0.0f;
  +                String verticalAlignmentAttribute 
  +                    = e.getAttribute(BATIK_EXT_VERTICAL_ALIGN_ATTRIBUTE);
  +
  +                if ((verticalAlignmentAttribute != null) && 
  +                    (verticalAlignmentAttribute.length() > 0)) {
  +                    if (BATIK_EXT_ALIGN_TOP_VALUE.equals
  +                        (verticalAlignmentAttribute)) {
  +                        verticalAlignment = 0.0f;
  +                    } else if (BATIK_EXT_ALIGN_MIDDLE_VALUE.equals 
  +                               (verticalAlignmentAttribute)) {
  +                        verticalAlignment = 0.5f;
  +                    } else if (BATIK_EXT_ALIGN_BOTTOM_VALUE.equals 
  +                               (verticalAlignmentAttribute)) {
  +                        verticalAlignment = 1.0f;
  +                    }
  +                }
  +
  +                gatherRegionInfo(ctx, e, verticalAlignment, ret);
               }
           }
  -        return null;
  +
  +        return ret;
       }
       
  -    protected List gatherRects(BridgeContext ctx, Element rgn) {
  -        List ret = new LinkedList();
  +    protected void gatherRegionInfo(BridgeContext ctx, Element rgn,
  +                                    float verticalAlign, List regions) {
  +
           for (Node n = rgn.getFirstChild(); 
                n != null; n = n.getNextSibling()) {
  +
               if (n.getNodeType()     != Node.ELEMENT_NODE) continue;
               if (n.getNamespaceURI() != getNamespaceURI()) continue;
               Element e = (Element)n;
   
               String ln = n.getLocalName();
  -            if (ln.equals(BATIK_EXT_FLOW_REGION_TAG)) {
  +            if (ln.equals(SVGConstants.SVG_RECT_TAG)) {
                   UnitProcessor.Context uctx;
                   uctx = UnitProcessor.createContext(ctx, e);
  -                Rectangle2D r2d = buildRect(uctx, e);
  -                if (r2d != null)
  -                    ret.add(r2d);
  +
  +                RegionInfo ri = buildRegion(uctx, e, verticalAlign);
  +                if (ri != null)
  +                    regions.add(ri);
               }
           }
  -
  -        return ret;
       }
   
  -    protected Rectangle2D buildRect(UnitProcessor.Context uctx,
  -                                    Element e) {
  +    protected RegionInfo buildRegion(UnitProcessor.Context uctx,
  +                                     Element e, 
  +                                     float verticalAlignment) {
           String s;
   
           // 'x' attribute - default is 0
  -        s = e.getAttributeNS(null, BATIK_EXT_X_ATTRIBUTE);
  +        s = e.getAttribute(BATIK_EXT_X_ATTRIBUTE);
           float x = 0;
           if (s.length() != 0) {
               x = UnitProcessor.svgHorizontalCoordinateToUserSpace
  @@ -386,7 +413,7 @@
           }
   
           // 'y' attribute - default is 0
  -        s = e.getAttributeNS(null, BATIK_EXT_Y_ATTRIBUTE);
  +        s = e.getAttribute(BATIK_EXT_Y_ATTRIBUTE);
           float y = 0;
           if (s.length() != 0) {
               y = UnitProcessor.svgVerticalCoordinateToUserSpace
  @@ -394,7 +421,7 @@
           }
   
           // 'width' attribute - required
  -        s = e.getAttributeNS(null, BATIK_EXT_WIDTH_ATTRIBUTE);
  +        s = e.getAttribute(BATIK_EXT_WIDTH_ATTRIBUTE);
           float w;
           if (s.length() != 0) {
               w = UnitProcessor.svgHorizontalLengthToUserSpace
  @@ -410,7 +437,7 @@
   	}
   
           // 'height' attribute - required
  -        s = e.getAttributeNS(null, BATIK_EXT_HEIGHT_ATTRIBUTE);
  +        s = e.getAttribute(BATIK_EXT_HEIGHT_ATTRIBUTE);
           float h;
           if (s.length() != 0) {
               h = UnitProcessor.svgVerticalLengthToUserSpace
  @@ -425,7 +452,7 @@
   	    return null;
   	}
   
  -        return new Rectangle2D.Float(x,y,w,h);
  +        return new RegionInfo(x,y,w,h,verticalAlignment);
       }
   
       /**
  @@ -544,7 +571,7 @@
                                     TextPath textPath) {
           Map result = super.getAttributeMap(ctx, element, textPath);
           String s;
  -        s = element.getAttributeNS(null, BATIK_EXT_PREFORMATTED_ATTRIBUTE);
  +        s = element.getAttribute(BATIK_EXT_PREFORMATTED_ATTRIBUTE);
           if (s.length() != 0) {
               if (s.equals("true")) {
                   result.put(PREFORMATTED, Boolean.TRUE);
  @@ -620,7 +647,7 @@
           String s;
           float top=0, right=0, bottom=0, left=0;
   
  -        s = e.getAttributeNS(null, BATIK_EXT_MARGIN_ATTRIBUTE);
  +        s = e.getAttribute(BATIK_EXT_MARGIN_ATTRIBUTE);
           try {
               if (s.length() != 0) {
                   float f = Float.parseFloat(s);
  @@ -628,28 +655,28 @@
               }
           } catch(NumberFormatException nfe) { /* nothing */ }
   
  -        s = e.getAttributeNS(null, BATIK_EXT_TOP_MARGIN_ATTRIBUTE);
  +        s = e.getAttribute(BATIK_EXT_TOP_MARGIN_ATTRIBUTE);
           try {
               if (s.length() != 0) {
                   float f = Float.parseFloat(s);
                   top = f;
               }
           } catch(NumberFormatException nfe) { /* nothing */ }
  -        s = e.getAttributeNS(null, BATIK_EXT_RIGHT_MARGIN_ATTRIBUTE);
  +        s = e.getAttribute(BATIK_EXT_RIGHT_MARGIN_ATTRIBUTE);
           try {
               if (s.length() != 0) {
                   float f = Float.parseFloat(s);
                   right = f;
               }
           } catch(NumberFormatException nfe) { /* nothing */ }
  -        s = e.getAttributeNS(null, BATIK_EXT_BOTTOM_MARGIN_ATTRIBUTE);
  +        s = e.getAttribute(BATIK_EXT_BOTTOM_MARGIN_ATTRIBUTE);
           try {
               if (s.length() != 0) {
                   float f = Float.parseFloat(s);
                   bottom = f;
               }
           } catch(NumberFormatException nfe) { /* nothing */ }
  -        s = e.getAttributeNS(null, BATIK_EXT_LEFT_MARGIN_ATTRIBUTE);
  +        s = e.getAttribute(BATIK_EXT_LEFT_MARGIN_ATTRIBUTE);
           try {
               if (s.length() != 0) {
                   float f = Float.parseFloat(s);
  @@ -657,37 +684,26 @@
               }
           } catch(NumberFormatException nfe) { /* nothing */ }
   
  -        float flLeft  = left;
  -        float flRight = right;
  -
  -        s = e.getAttributeNS(null, BATIK_EXT_FIRST_LINE_LEFT_MARGIN_ATTRIBUTE);
  -        try {
  -            if (s.length() != 0) {
  -                float f = Float.parseFloat(s);
  -                flLeft = f;
  -            }
  -        } catch(NumberFormatException nfe) { /* nothing */ }
  -
  -        s = e.getAttributeNS(null,BATIK_EXT_FIRST_LINE_RIGHT_MARGIN_ATTRIBUTE);
  +        float indent = 0;
  +        s = e.getAttribute(BATIK_EXT_INDENT_ATTRIBUTE);
           try {
               if (s.length() != 0) {
                   float f = Float.parseFloat(s);
  -                flRight = f;
  +                indent = f;
               }
           } catch(NumberFormatException nfe) { /* nothing */ }
   
  -
           int justification = MarginInfo.JUSTIFY_START;
  -        s = e.getAttributeNS(null, BATIK_EXT_JUSTIFICATION_ATTRIBUTE);
  +        s = e.getAttribute(BATIK_EXT_JUSTIFICATION_ATTRIBUTE);
           try {
               if (s.length() != 0) {
  -                if (s.equals("start")) {
  +                if (BATIK_EXT_JUSTIFICATION_START_VALUE.equals(s)) {
                       justification = MarginInfo.JUSTIFY_START;
  -                } else if (s.equals("middle")) {
  +                } else if (BATIK_EXT_JUSTIFICATION_MIDDLE_VALUE.equals(s)) {
                       justification = MarginInfo.JUSTIFY_MIDDLE;
  -                } else if (s.equals("end")) {
  +                } else if (BATIK_EXT_JUSTIFICATION_END_VALUE.equals(s)) {
                       justification = MarginInfo.JUSTIFY_END;
  -                } else if (s.equals("full")) {
  +                } else if (BATIK_EXT_JUSTIFICATION_FULL_VALUE.equals(s)) {
                       justification = MarginInfo.JUSTIFY_FULL;
                   }
               }
  @@ -695,8 +711,8 @@
   
           String ln = e.getLocalName();
           boolean rgnBr = ln.equals(BATIK_EXT_FLOW_REGION_BREAK_TAG);
  -        return new MarginInfo(top, right, bottom, left, flLeft, flRight,
  -                              justification, rgnBr);
  +        return new MarginInfo(top, right, bottom, left, 
  +                              indent, justification, rgnBr);
       }
   
   
  
  
  
  1.8       +3 -2      xml-batik/sources/org/apache/batik/gvt/text/GlyphIterator.java
  
  Index: GlyphIterator.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/text/GlyphIterator.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- GlyphIterator.java	22 May 2002 21:50:40 -0000	1.7
  +++ GlyphIterator.java	20 Feb 2003 11:15:47 -0000	1.8
  @@ -348,7 +348,8 @@
   
       public LineInfo newLine(Point2D.Float loc, 
                               float lineWidth, 
  -                            boolean partial) {
  +                            boolean partial,
  +                            Point2D.Float verticalAlignOffset) {
           if (ch == SOFT_HYPHEN) {
               gv.setGlyphVisible(idx, true);
           }
  @@ -410,7 +411,7 @@
           maxFontSize = -Float.MAX_VALUE;
           LineInfo ret = new LineInfo(loc, aci, gv, lineIdx, lineInfoIdx, 
                               lineInfoAdj, lineInfoAdv, lineInfoChW, 
  -                                    lineWidth, partial);
  +                                    lineWidth, partial, verticalAlignOffset);
           lineIdx = idx;
   
           return ret;
  
  
  
  1.48      +147 -56   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.47
  retrieving revision 1.48
  diff -u -r1.47 -r1.48
  --- GlyphLayout.java	19 Feb 2003 02:50:57 -0000	1.47
  +++ GlyphLayout.java	20 Feb 2003 11:15:47 -0000	1.48
  @@ -87,7 +87,6 @@
       private boolean pathApplied    = false;
   
   
  -    
       public static final AttributedCharacterIterator.Attribute FLOW_LINE_BREAK
           = GVTAttributedCharacterIterator.TextAttribute.FLOW_LINE_BREAK;
   
  @@ -159,7 +158,6 @@
       }
   
   
  -
       /**
        * Creates the specified text layout using the
        * specified AttributedCharacterIterator and rendering context.
  @@ -2010,7 +2008,7 @@
        *             text to wrap.  There is one aci per text chunk
        *             (which maps to flowPara elements. Used to access
        *             font, paragraph, and line break info.
  -     * @param ChunkLayouts A List of List of GlyphLayout objects.  There
  +     * @param chunkLayouts A List of List of GlyphLayout objects.  There
        *                     is a List of GlyphLayout objects for each
        *                     flowPara element.  There is a GlyphLayout
        *                     for approximately each sub element in the 
  @@ -2021,7 +2019,6 @@
       public static void textWrapTextChunk(AttributedCharacterIterator [] acis,
                                            List chunkLayouts,
                                            List flowRects) {
  -        int justification;
           int numChunks = acis.length;
           // System.out.println("Len: " + acis.length + " Size: " + 
           //                    chunkLayouts.size());
  @@ -2029,27 +2026,36 @@
           // Make a list of the GlyphVectors so we can construct a
           // multiGlyphVector that makes them all look like one big
           // glyphVector
  -        GVTGlyphVector [] gvs = new GVTGlyphVector [acis.length];
  +        GVTGlyphVector [] gvs            = new GVTGlyphVector[acis.length];
  +        List           [] chunkLineInfos = new List          [acis.length];
  +        GlyphIterator  [] gis            = new GlyphIterator [acis.length];
           Iterator clIter = chunkLayouts.iterator();
   
           // Get an iterator for the flow rects.
           Iterator flowRectsIter = flowRects.iterator();
           // Get info for new flow rect.
  -        Rectangle2D cRect = (Rectangle2D)flowRectsIter.next();
  -        float y0, x0, width, height;
  -        height = (float)cRect.getHeight();
  +        RegionInfo currentRegion = null;
  +        float y0, x0, width, height=0;
  +        if (flowRectsIter.hasNext()) {
  +            currentRegion = (RegionInfo) flowRectsIter.next();
  +            height = (float) currentRegion.getHeight();
  +        }
   
           boolean lineHeightRelative = true;
           float lineHeight           = 1.0f;
           float nextLineMult         = 0.0f;
           float dy                   = 0.0f;
   
  +        //
  +        Point2D.Float verticalAlignOffset = new Point2D.Float(0,0);
  +
           //System.out.println("Chunks: " + numChunks);
           
           float prevBotMargin = 0;
           for (int chunk=0; clIter.hasNext(); chunk++) {
               // System.out.println("Chunk: " + chunk);
               AttributedCharacterIterator aci = acis[chunk];
  +            if (currentRegion != null)
               {
                   List extraP = (List)aci.getAttribute(FLOW_EMPTY_PARAGRAPH);
                   if (extraP != null) {
  @@ -2065,12 +2071,15 @@
                           } else {
                               // Move to next flow region..
                               if (!flowRectsIter.hasNext()) {
  -                                cRect = null;
  +                                currentRegion = null;
                                   break; // No flow rect stop layout here...
                               }
   
  -                            cRect = (Rectangle2D)flowRectsIter.next();
  -                            height = (float)cRect.getHeight();
  +                            // NEXT FLOW REGION
  +                            currentRegion = (RegionInfo) flowRectsIter.next();
  +                            height = (float) currentRegion.getHeight();
  +                            // start a new alignment offset for this flow rect.
  +                            verticalAlignOffset = new Point2D.Float(0,0);
   
                               // New rect so no previous row to consider...
                               dy        = emi.getTopMargin();
  @@ -2078,7 +2087,7 @@
                           prevBotMargin = emi.getBottomMargin();
                       }
   
  -                    if (cRect == null) break;
  +                    if (currentRegion == null) break;
                   }
               }
   
  @@ -2100,9 +2109,9 @@
               if (mi == null) {
                 continue;
               }
  -            justification = mi.getJustification();
  +            int justification = mi.getJustification();
   
  -            if (cRect == null) {
  +            if (currentRegion == null) {
                   for(int idx=0; idx <numGlyphs; idx++) 
                       gv.setGlyphVisible(idx, false);
                   continue;
  @@ -2114,39 +2123,57 @@
                   dy += inc;
               } else {
                   // Move to next flow region..
  +                // NEXT FLOW REGION
                   if (!flowRectsIter.hasNext()) {
  -                    cRect = null;
  +                    currentRegion = null;
                       break; // No flow rect stop layout here...
                   }
   
  -                cRect = (Rectangle2D)flowRectsIter.next();
  -                height = (float)cRect.getHeight();
  +                // NEXT FLOW REGION
  +                currentRegion = (RegionInfo) flowRectsIter.next();
  +                height = (float) currentRegion.getHeight();
  +                // start a new alignment offset for this flow rect..
  +                verticalAlignOffset = new Point2D.Float(0,0);
   
                               // New rect so no previous row to consider...
                   dy        = mi.getTopMargin();
               }
               prevBotMargin = mi.getBottomMargin();
   
  -            float leftMargin = mi.getFirstLineLeftMargin();
  -            float rightMargin = mi.getFirstLineRightMargin();
  +            float leftMargin = mi.getLeftMargin();
  +            float rightMargin = mi.getRightMargin();
  +            if (((GlyphLayout)layouts.get(0)).isLeftToRight()) {
  +                leftMargin += mi.getIndent();
  +            } else {
  +                rightMargin += mi.getIndent();
  +            }
   
  -            x0    = (float)cRect.getX() + leftMargin;
  -            y0    = (float)cRect.getY();
  -            width = (float)(cRect.getWidth() - (leftMargin+rightMargin));
  -            height = (float)cRect.getHeight();
  +            x0 = (float) currentRegion.getX() + leftMargin;
  +            y0 = (float) currentRegion.getY();
  +            width = (float) (currentRegion.getWidth() - 
  +                             (leftMargin + rightMargin));
  +            height = (float) currentRegion.getHeight();
               
               List lineInfos = new LinkedList();
  +            chunkLineInfos[chunk] = lineInfos;
   
               float prevDesc = 0.0f;
               GlyphIterator gi = new GlyphIterator(aci, gv);
  +            gis[chunk] = gi;
  +
               GlyphIterator breakGI  = null, newBreakGI = null;
   
               if (!gi.done() && !gi.isPrinting()) {
  -              // This will place any preceeding whitespace on an imaginary
  -              // line that preceeds the real first line of the paragraph.
  -              lineInfos.add(gi.newLine
  -                            (new Point2D.Float(x0, y0+dy), 
  -                             width, true));
  +                // This will place any preceeding whitespace on an
  +                // imaginary line that preceeds the real first line of
  +                // the paragraph, also calculate the vertical
  +                // alignment offset, this will be repeated until the
  +                // last line in the flow rect.
  +               updateVerticalAlignOffset(verticalAlignOffset, 
  +                                         currentRegion, dy);
  +               lineInfos.add(gi.newLine
  +                             (new Point2D.Float(x0, y0+dy), 
  +                              width, true, verticalAlignOffset));
               }
   
   
  @@ -2161,20 +2188,24 @@
                           // first char on line didn't fit.
                           // move to next flow rect.
                           if (!flowRectsIter.hasNext()) {
  -                            cRect = null;
  +                            currentRegion = null;
                               gi = lineGI.copy(gi);
                               break; // No flow rect stop layout here...
                           }
   
  -                        cRect = (Rectangle2D)flowRectsIter.next();
  -                        x0    = (float) cRect.getX() + leftMargin;
  -                        y0    = (float) cRect.getY();
  -                        width = (float)(cRect.getWidth() - 
  +                        // NEXT FLOW REGION
  +                        currentRegion = (RegionInfo) flowRectsIter.next();
  +                        x0 = (float) currentRegion.getX() + leftMargin;
  +                        y0 = (float) currentRegion.getY();
  +                        width = (float) (currentRegion.getWidth() -
                                           (leftMargin+rightMargin));
  -                        height = (float)cRect.getHeight();
  +                        height = (float) currentRegion.getHeight();
  +                        // start a new alignment offset for this flow rect..
  +                        verticalAlignOffset = new Point2D.Float(0,0);
   
                           // New rect so no previous row to consider...
  -                        dy        = firstLine?mi.getTopMargin():0; ;
  +                        dy = firstLine ? mi.getTopMargin() : 0;
  +                        ;
                           prevDesc  = 0;
                           gi = lineGI.copy(gi);
                           continue;
  @@ -2259,7 +2290,7 @@
                       // System.out.println("Doesn't Fit: " + dy);
   
                       if (!flowRectsIter.hasNext()) {
  -                        cRect = null;
  +                        currentRegion = null;
                           gi = lineGI.copy(gi);
                           break; // No flow rect stop layout here...
                       }
  @@ -2268,15 +2299,18 @@
                       float oldWidth = width;
   
                       // Get info for new flow rect.
  -                    cRect = (Rectangle2D)flowRectsIter.next();
  -                    x0    = (float) cRect.getX() + leftMargin;
  -                    y0    = (float) cRect.getY();
  -                    width = (float)(cRect.getWidth() - 
  -                                    (leftMargin+rightMargin));
  -                    height = (float)cRect.getHeight();
  +                    currentRegion = (RegionInfo) flowRectsIter.next();
  +                    x0     = (float) currentRegion.getX() + leftMargin;
  +                    y0     = (float) currentRegion.getY();
  +                    width  = (float)(currentRegion.getWidth() -
  +                                     (leftMargin+rightMargin));
  +                    height = (float) currentRegion.getHeight();
  +                    // start a new alignment offset for this flow rect..
  +                    verticalAlignOffset = new Point2D.Float(0,0);
   
                       // New rect so no previous row to consider...
  -                    dy        = firstLine?mi.getTopMargin():0; ;
  +                    dy = firstLine ? mi.getTopMargin() : 0;
  +                    ;
                       prevDesc  = 0;
                       // previous flows?
   
  @@ -2289,8 +2323,11 @@
   
                   prevDesc = newDesc + (nextLineMult-1)*lineBoxHeight;
                   nextLineMult = 0f;
  +                updateVerticalAlignOffset(verticalAlignOffset, 
  +                                          currentRegion, dy + bottomEdge);
                   lineInfos.add(gi.newLine
  -                              (new Point2D.Float(x0, y0+dy), width, partial));
  +                              (new Point2D.Float(x0, y0 + dy), width, partial, 
  +                               verticalAlignOffset));
   
                   // System.out.println("Fit: " + dy);
                   x0    -= leftMargin;
  @@ -2312,22 +2349,69 @@
               while(idx <numGlyphs) 
                   gv.setGlyphVisible(idx++, false);
   
  -            layoutChunk(aci, gv, gi.getOrigin(), justification, lineInfos);
  -
               if (mi.isFlowRegionBreak()) {
                   // Move to next flow region..
  -                cRect = null;
  +                currentRegion = null;
                   if (flowRectsIter.hasNext()) {
  -                    cRect  = (Rectangle2D)flowRectsIter.next();
  -                    height = (float)cRect.getHeight();
  +                    currentRegion = (RegionInfo) flowRectsIter.next();
  +                    height = (float) currentRegion.getHeight();
                       dy     = mi.getTopMargin();
  +                    verticalAlignOffset = new Point2D.Float(0,0);
                   }
               }
           }
  +
  +        for (int chunk=0; chunk < acis.length; chunk++) {
  +            List lineInfos = chunkLineInfos[chunk];
  +            if (lineInfos == null) continue;
  +
  +            AttributedCharacterIterator aci = acis[chunk];
  +            aci.first();
  +            MarginInfo mi = (MarginInfo)aci.getAttribute(FLOW_PARAGRAPH);
  +            if (mi == null) {
  +              continue;
  +            }
  +            int justification = mi.getJustification();
  +            
  +            GVTGlyphVector gv = gvs[chunk];
  +            if (gv == null) break;
  +
  +            GlyphIterator gi = gis[chunk];
  +            
  +            layoutChunk(gv, gi.getOrigin(), justification, lineInfos);
  +        }
       }
   
  -    public static void layoutChunk(AttributedCharacterIterator aci,
  -                                   GVTGlyphVector gv, Point2D origin,
  +
  +    /**
  +     * Updates the specified verticalAlignmentOffset using the current
  +     * alignment rule and the heights of the flow rect and the maximum
  +     * descent of the text.  This method gets for called every line,
  +     * but only the value that is calculated for the last line of the
  +     * flow rect is used by the glyph rendering.  This is achieved by
  +     * creating a new verticalAlignOffset object everytime a new flow
  +     * rect is encountered, thus a single verticalAlignmentOffset is
  +     * shared for all {@link LineInfo} objects created for a given
  +     * flow rect.  The value is calculated by determining the left
  +     * over space in the flow rect and scaling that value by 1.0 to
  +     * align to the bottom, 0.5 for middle and 0.0 for top.
  +     *
  +     * @param verticalAlignOffset the {@link Point2D.Float} object that 
  +     *                            is storing the alignment offset.
  +     * @param currentRegion the {@link RegionInfo} object that we 
  +     *                      are rendering into.
  +     * @param maxDescent the very lowest point this line reaches.
  +     */
  +    public static void updateVerticalAlignOffset
  +        (Point2D.Float verticalAlignOffset,
  +         RegionInfo region, float maxDescent)
  +        {
  +            float freeSpace = (float)region.getHeight() - maxDescent;
  +            verticalAlignOffset.setLocation
  +                (0, region.getVerticalAlignment() * freeSpace);
  +        }
  +
  +    public static void layoutChunk(GVTGlyphVector gv, Point2D origin,
                                      int justification,
                                      List lineInfos) {
           Iterator lInfoIter = lineInfos.iterator();
  @@ -2345,6 +2429,7 @@
           float charW=0;
           float lineWidth=0;
           boolean partial = false;
  +        float verticalAlignOffset = 0;
   
           // This loop goes through and puts glyphs where they belong
           // based on info collected in first trip through glyphVector...
  @@ -2370,14 +2455,19 @@
                   charW     = li.getLastCharWidth();
                   lineWidth = li.getLineWidth();
                   partial   = li.isPartialLine();
  +                verticalAlignOffset = li.getVerticalAlignOffset().y;
   
                   xAdj = 0;
                   xScale = 1;
                   // Recalc justification info.
                   switch (justification) {
                   case 0: default: break;                  // Left
  -                case 1: xAdj = (lineWidth-lineVAdv)/2; break; // Center
  -                case 2: xAdj =  lineWidth-lineVAdv;    break; // Right
  +                case 1:                                  // Center
  +                    xAdj = (lineWidth - lineVAdv) / 2;
  +                    break;
  +                case 2:                                  // Right
  +                    xAdj = lineWidth - lineVAdv;
  +                    break;
                   case 3:                                  // Full
                       if ((!partial) && (lineEnd != i+1)) {
                           // More than one char on line...
  @@ -2388,7 +2478,8 @@
                   }
               }
               float x = lineLoc.x + (gp[2*i]  -xOrig)*xScale+xAdj;
  -            float y = lineLoc.y + (gp[2*i+1]-yOrig);
  +            float y = lineLoc.y + ((gp[2 * i + 1] - yOrig) + 
  +                                   verticalAlignOffset);
               gv.setGlyphPosition(i, new Point2D.Float(x, y));
           }
   
  @@ -2396,7 +2487,7 @@
           float y = yOrig;
           if (lineLoc != null) {
             x = lineLoc.x + (gp[2*i]  -xOrig)*xScale+xAdj;
  -          y = lineLoc.y + (gp[2*i+1]-yOrig);
  +            y = lineLoc.y + (gp[2 * i + 1] - yOrig) + verticalAlignOffset;
           }
           gv.setGlyphPosition(i, new Point2D.Float(x, y));
       }
  
  
  
  1.4       +7 -2      xml-batik/sources/org/apache/batik/gvt/text/LineInfo.java
  
  Index: LineInfo.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/text/LineInfo.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- LineInfo.java	8 May 2002 09:42:47 -0000	1.3
  +++ LineInfo.java	20 Feb 2003 11:15:47 -0000	1.4
  @@ -28,6 +28,7 @@
       float                       lastCharWidth;
       float                       lineWidth;
       boolean                     partial;
  +    Point2D.Float               verticalAlignOffset;
   
       /**
        * 
  @@ -40,7 +41,8 @@
                       float visualAdvance,
                       float lastCharWidth,
                       float lineWidth,
  -                    boolean partial) {
  +                    boolean partial,
  +                    Point2D.Float verticalAlignOffset) {
           this.loc           = loc;
           this.aci           = aci;
           this.gv            = gv;
  @@ -51,6 +53,7 @@
           this.lastCharWidth = lastCharWidth;
           this.lineWidth     = lineWidth;
           this.partial       = partial;
  +        this.verticalAlignOffset = verticalAlignOffset;
       }
   
       public Point2D.Float  getLocation()         { return loc; }
  @@ -63,6 +66,7 @@
       public float          getLastCharWidth()    { return lastCharWidth; }
       public float          getLineWidth()        { return lineWidth; }
       public boolean        isPartialLine()       { return partial; }
  +    public Point2D.Float  getVerticalAlignOffset()    { return verticalAlignOffset; }
   
       public String         toString() { 
           return ("[LineInfo loc: " + loc + 
  @@ -70,7 +74,8 @@
                   " LWidth: " + lineWidth +
                   " Adv: " + advance + " VAdv: " + visualAdvance +
                   " LCW: " + lastCharWidth +
  -                " Partial: " + partial);
  +                " Partial: " + partial +
  +                " verticalAlignOffset: " + verticalAlignOffset);
       }
   
   }
  
  
  
  1.4       +13 -16    xml-batik/sources/org/apache/batik/gvt/text/MarginInfo.java
  
  Index: MarginInfo.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/text/MarginInfo.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- MarginInfo.java	30 Apr 2002 19:08:48 -0000	1.3
  +++ MarginInfo.java	20 Feb 2003 11:15:47 -0000	1.4
  @@ -19,23 +19,21 @@
       protected float   bottom;
       protected float   left;
   
  -    protected float   firstLineLeft;
  -    protected float   firstLineRight;
  +    protected float   indent;
   
       protected int     justification;
       protected boolean flowRegionBreak;
   
   
       public MarginInfo(float top, float right, float bottom, float left,
  -                      float firstLineLeft, float firstLineRight,
  -                      int justification, boolean flowRegionBreak) {
  +                      float indent, int justification, 
  +                      boolean flowRegionBreak) {
           this.top    = top;
           this.right  = right;
           this.bottom = bottom;
           this.left   = left;
   
  -        this.firstLineLeft = firstLineLeft;
  -        this.firstLineRight = firstLineRight;
  +        this.indent = indent;
   
           this.justification = justification;
           this.flowRegionBreak = flowRegionBreak;
  @@ -43,6 +41,7 @@
   
       public MarginInfo(float margin, int justification) {
           setMargin(margin);
  +        this.indent = 0;
           this.justification = justification;
           this.flowRegionBreak = false;
       }
  @@ -52,17 +51,15 @@
           this.right  = margin;
           this.bottom = margin;
           this.left   = margin;
  -        this.firstLineLeft  = margin;
  -        this.firstLineRight = margin;
       }
  -    public float   getTopMargin()            { return top; }
  -    public float   getRightMargin()          { return right; }
  -    public float   getBottomMargin()         { return bottom; }
  -    public float   getLeftMargin()           { return left; }
   
  -    public float   getFirstLineLeftMargin()  { return firstLineLeft; }
  -    public float   getFirstLineRightMargin() { return firstLineLeft; }
  +    public float   getTopMargin()      { return top; }
  +    public float   getRightMargin()    { return right; }
  +    public float   getBottomMargin()   { return bottom; }
  +    public float   getLeftMargin()     { return left; }
   
  -    public int     getJustification()        { return justification; }
  -    public boolean isFlowRegionBreak()       { return flowRegionBreak; }
  +    public float   getIndent()         { return indent; }
  +
  +    public int     getJustification()  { return justification; }
  +    public boolean isFlowRegionBreak() { return flowRegionBreak; }
   }
  
  
  
  1.1                  xml-batik/sources/org/apache/batik/gvt/text/RegionInfo.java
  
  Index: RegionInfo.java
  ===================================================================
  /*****************************************************************************
   * Copyright (C) The Apache Software Foundation. All rights reserved.        *
   * ------------------------------------------------------------------------- *
   * This software is published under the terms of the Apache Software License *
   * version 1.1, a copy of which has been included with this distribution in  *
   * the LICENSE file.                                                         *
   *****************************************************************************/
  package org.apache.batik.gvt.text;
  
  import java.awt.geom.Rectangle2D;
  
  /**
   * This class holds the neccessary information to render a
   * <batik:regin> that is defined within the <batik:flowRegion>
   * element.  Namely it holds the bounds of the region and the desired
   * vertical alignment.
   */
  public class RegionInfo
         extends Rectangle2D.Float
  {
      private float verticalAlignment = 0.0f;
  
      public RegionInfo(float x, float y, float w, float h, 
                        float verticalAlignment) {
          super(x, y, w, h);
          this.verticalAlignment = verticalAlignment;
      }
  
      /**
       * Gets the vertical alignment for this flow region.
       * @return the vertical alignment for this flow region. 
       *         It will be 0.0 for top, 0.5 for middle and 1.0 for bottom.
       */
      public float getVerticalAlignment() {
          return verticalAlignment;
      }
  
      /**
       * Sets the alignment position of the text within this flow region.  
       * The value must be 0.0 for top, 0.5 for middle and 1.0 for bottom.
       * @param verticalAlignment the vertical alignment of the text.
       */
      public void setVerticalAlignment(float verticalAlignment) {
          this.verticalAlignment = verticalAlignment;
      }
  }
  
  
  

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


RE: cvs commit: xml-batik/sources/org/apache/batik/gvt/text RegionInfo.java GlyphIterator.java GlyphLayout.java LineInfo.java MarginInfo.java

Posted by Thomas E Deweese <th...@kodak.com>.
>>>>> "TD" == Thomas E DeWeese <de...@apache.org> writes:

TD> Flow text syntax is now brought up to date with SVG Drafts (see
TD> examples) 

TD> Flow text now supports vertical-align attribute on flowRegion
TD> elements.
  
  I forgot to thank Andrew Pietsch for the work on vertical-align.

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