deweese 01/11/29 15:11:02
Modified: sources/org/apache/batik/gvt/renderer
StrokingTextPainter.java
sources/org/apache/batik/gvt/text GlyphLayout.java
Log:
Fixed Text Anchor on tspan.
PR: 4809
Revision Changes Path
1.24 +82 -99
xml-batik/sources/org/apache/batik/gvt/renderer/StrokingTextPainter.java
Index: StrokingTextPainter.java
===================================================================
RCS file:
/home/cvs/xml-batik/sources/org/apache/batik/gvt/renderer/StrokingTextPainter.java,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- StrokingTextPainter.java 2001/11/15 14:20:58 1.23
+++ StrokingTextPainter.java 2001/11/29 23:11:02 1.24
@@ -60,7 +60,7 @@
* @see org.apache.batik.gvt.text.GVTAttributedCharacterIterator
*
* @author <a href="[EMAIL PROTECTED]>Bill Haneman</a>
- * @version $Id: StrokingTextPainter.java,v 1.23 2001/11/15 14:20:58 vhardy Exp $
+ * @version $Id: StrokingTextPainter.java,v 1.24 2001/11/29 23:11:02 deweese Exp $
*/
public class StrokingTextPainter extends BasicTextPainter {
@@ -160,9 +160,8 @@
// create text runs for each chunk and add them to the list
textRuns = new ArrayList();
- TextChunk chunk;
+ TextChunk chunk, prevChunk=null;
int beginChunk = 0;
- Point2D lastChunkAdvance = new Point2D.Float(0,0);
int currentChunk = 0;
do {
// Text Chunks contain one or more TextRuns, which they create from
@@ -174,7 +173,7 @@
chunkCharMaps[currentChunk],
textRuns,
beginChunk,
- lastChunkAdvance);
+ prevChunk);
// Adjust according to text-anchor property value
chunkACIs[currentChunk].first();
@@ -182,8 +181,8 @@
adjustChunkOffsets(textRuns, chunk.advance,
chunk.begin, chunk.end);
beginChunk = chunk.end;
- lastChunkAdvance = chunk.advance;
}
+ prevChunk = chunk;
currentChunk++;
} while (chunk != null && currentChunk < chunkACIs.length);
@@ -265,107 +264,88 @@
int [] charMap,
List textRuns,
int beginChunk,
- Point2D lastChunkAdvance) {
+ TextChunk prevChunk) {
int endChunk = beginChunk;
- AttributedCharacterIterator runaci;
- boolean inChunk = true;
- Point2D advance = lastChunkAdvance;
- Point2D location = node.getLocation();
int begin = aci.getIndex();
- if (aci.current() != CharacterIterator.DONE) {
- int chunkStartIndex = aci.getIndex();
-
- // find out if this chunck is the start or end of a text
- // path chunck if it is, then we ignore any previous
- // advance
- TextPath chunkTextPath = (TextPath) aci.getAttribute
- (GVTAttributedCharacterIterator.TextAttribute.TEXTPATH);
- TextPath prevChunkTextPath = null;
- if (chunkStartIndex > 0) {
- aci.setIndex(chunkStartIndex-1);
- prevChunkTextPath = (TextPath) aci.getAttribute
- (GVTAttributedCharacterIterator.TextAttribute.TEXTPATH);
- aci.setIndex(chunkStartIndex);
- }
-
- if (prevChunkTextPath != chunkTextPath) {
- advance = new Point2D.Float(0,0);
- }
-
- boolean isChunkStart = true;
- TextPath prevTextPath = null;
- Point2D prevTextPathAdvance = null;
- do {
+ // System.out.println("New Chunk");
+ if (aci.current() == CharacterIterator.DONE)
+ return null;
- int start = aci.getRunStart(extendedAtts);
- int end = aci.getRunLimit(extendedAtts);
+ Point2D advance = new Point2D.Float(0,0);
+ Point2D location;
+ if (prevChunk == null) {
+ location = node.getLocation();
+ } else {
+ location = new Point2D.Float
+ ((float)(prevChunk.absLoc.getX()+prevChunk.advance.getX()),
+ (float)(prevChunk.absLoc.getY()+prevChunk.advance.getY()));
+ }
- runaci = new AttributedCharacterSpanIterator(aci, start, end);
+ boolean isChunkStart = true;
+ TextPath prevTextPath = null;
+ Point2D prevTextPathAdvance = null;
+ do {
+ int start = aci.getRunStart(extendedAtts);
+ int end = aci.getRunLimit(extendedAtts);
- runaci.first();
+ AttributedCharacterIterator runaci;
+ runaci = new AttributedCharacterSpanIterator(aci, start, end);
+ runaci.first();
- Float runX = (Float) runaci.getAttribute
- (GVTAttributedCharacterIterator.TextAttribute.X);
+ Float runX = (Float) runaci.getAttribute
+ (GVTAttributedCharacterIterator.TextAttribute.X);
- Float runY = (Float) runaci.getAttribute
- (GVTAttributedCharacterIterator.TextAttribute.Y);
+ Float runY = (Float) runaci.getAttribute
+ (GVTAttributedCharacterIterator.TextAttribute.Y);
- TextPath textPath = (TextPath) runaci.getAttribute
- (GVTAttributedCharacterIterator.TextAttribute.TEXTPATH);
-
- inChunk = ((isChunkStart) ||
- ((runX == null || runX.isNaN()) &&
- (runY == null || runY.isNaN())));
+ TextPath textPath = (TextPath) runaci.getAttribute
+ (GVTAttributedCharacterIterator.TextAttribute.TEXTPATH);
- // do additional check for the start/end of a textPath
- if (prevTextPath == null && textPath != null && !isChunkStart) {
- inChunk = false;
- }
-
- if (inChunk) {
- Point2D offset;
- if (textPath == null) {
- if (prevTextPath != null && prevTextPathAdvance != null) {
- // this text is directly after some text on a path
- offset = new
Point2D.Float((float)prevTextPathAdvance.getX(),
-
(float)prevTextPathAdvance.getY());
- } else {
- offset = new Point2D.Float(
- (float) (location.getX()+advance.getX()),
- (float) (location.getY()+advance.getY()));
- }
- } else {
- // is on a text path so ignore the text node's location
- offset = new Point2D.Float((float)advance.getX(),
- (float)advance.getY());
- }
-
- int [] subCharMap = new int[end-start];
- for (int i=0; i<subCharMap.length; i++) {
- subCharMap[i] = charMap[i+start-begin];
- }
- TextSpanLayout layout = getTextLayoutFactory().
- createTextLayout(runaci, subCharMap,
- offset, fontRenderContext);
- TextRun run = new TextRun(layout, runaci, isChunkStart);
- textRuns.add(run);
- Point2D layoutAdvance = layout.getAdvance2D();
- advance = new Point2D.Float(
- (float) (advance.getX()+layoutAdvance.getX()),
- (float) (advance.getY()+layoutAdvance.getY()));
- ++endChunk;
- prevTextPath = textPath;
- prevTextPathAdvance = layout.getTextPathAdvance();
- if (aci.setIndex(end) == CharacterIterator.DONE) break;
+ Point2D offset;
+ if (textPath == null) {
+ if ((prevTextPath != null) &&
+ (prevTextPathAdvance != null)) {
+ // this text is directly after some text on a path
+ offset = new Point2D.Float
+ ((float)prevTextPathAdvance.getX(),
+ (float)prevTextPathAdvance.getY());
} else {
- aci.setIndex(start);
+ offset = new Point2D.Float(
+ (float)
(location.getX()+advance.getX()),
+ (float)
(location.getY()+advance.getY()));
}
- isChunkStart = false;
- } while (inChunk);
- return new TextChunk(beginChunk, endChunk, advance);
- } else {
- return null;
- }
+ } else {
+ // is on a text path so ignore the text node's location
+ offset = new Point2D.Float((float)advance.getX(),
+ (float)advance.getY());
+ }
+
+ int [] subCharMap = new int[end-start];
+ for (int i=0; i<subCharMap.length; i++) {
+ subCharMap[i] = charMap[i+start-begin];
+ }
+ TextSpanLayout layout = getTextLayoutFactory().
+ createTextLayout(runaci, subCharMap,
+ offset, fontRenderContext);
+ TextRun run = new TextRun(layout, runaci, isChunkStart);
+ textRuns.add(run);
+ Point2D layoutAdvance = layout.getAdvance2D();
+ if (isChunkStart)
+ location = layout.getOffset();
+
+ // System.out.println("layoutAdv: " + layoutAdvance);
+
+ advance = new Point2D.Float(
+ (float)
(advance.getX()+layoutAdvance.getX()),
+ (float)
(advance.getY()+layoutAdvance.getY()));
+ ++endChunk;
+ prevTextPath = textPath;
+ prevTextPathAdvance = layout.getTextPathAdvance();
+ if (aci.setIndex(end) == CharacterIterator.DONE) break;
+ isChunkStart = false;
+ } while (true);
+ // System.out.println("Adv: " + advance);
+ return new TextChunk(beginChunk, endChunk, location, advance);
}
@@ -579,10 +559,8 @@
Point2D advance,
int beginChunk,
int endChunk) {
-
- for (int n=beginChunk; n<endChunk; ++n) {
- TextRun r = (TextRun) textRuns.get(n);
+ TextRun r = (TextRun) textRuns.get(beginChunk);
int anchorType = r.getAnchorType();
float dx = 0f;
float dy = 0f;
@@ -601,6 +579,8 @@
// leave untouched
}
+ for (int n=beginChunk; n<endChunk; ++n) {
+ r = (TextRun) textRuns.get(n);
TextSpanLayout layout = r.getLayout();
Point2D offset = layout.getOffset();
@@ -1373,10 +1353,13 @@
public int begin;
public int end;
public Point2D advance;
+ public Point2D absLoc;
- public TextChunk(int begin, int end, Point2D advance) {
+ public TextChunk(int begin, int end, Point2D absLoc, Point2D advance) {
this.begin = begin;
this.end = end;
+ this.absLoc = new Point2D.Float((float) absLoc.getX(),
+ (float) absLoc.getY());
this.advance = new Point2D.Float((float) advance.getX(),
(float) advance.getY());
}
1.29 +4 -3 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.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- GlyphLayout.java 2001/11/09 15:32:57 1.28
+++ GlyphLayout.java 2001/11/29 23:11:02 1.29
@@ -42,7 +42,7 @@
* @see org.apache.batik.gvt.text.TextSpanLayout
*
* @author <a href="[EMAIL PROTECTED]>Bill Haneman</a>
- * @version $Id: GlyphLayout.java,v 1.28 2001/11/09 15:32:57 deweese Exp $
+ * @version $Id: GlyphLayout.java,v 1.29 2001/11/29 23:11:02 deweese Exp $
*/
public class GlyphLayout implements TextSpanLayout {
@@ -1227,7 +1227,6 @@
protected Point2D doSpacing(Float kern,
Float letterSpacing,
Float wordSpacing) {
-
boolean autoKern = true;
boolean doWordSpacing = false;
boolean doLetterSpacing = false;
@@ -1516,6 +1515,8 @@
GVTAttributedCharacterIterator.TextAttribute.TEXTPATH);
int numGlyphs = gv.getNumGlyphs();
+ // System.out.println("NumGlyphs: " + numGlyphs);
+
float[] gp = new float[numGlyphs*2];
gp = (float[]) gv.getGlyphPositions(0, numGlyphs, gp).clone();
float init_x_pos = (float) offset.getX();
@@ -1742,10 +1743,10 @@
firstChar = false;
}
+ offset = new Point2D.Float(init_x_pos, init_y_pos);
advance = new Point2D.Float((float) (curr_x_pos - offset.getX()),
(float) (curr_y_pos - offset.getY()));
- offset = new Point2D.Float(init_x_pos, init_y_pos);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]