瀏覽代碼

FOP-2195: use sparse arrays for position adjustments

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1435400 13f79535-47bb-0310-9956-ffa450edef68
pull/1/head
Glenn Adams 11 年之前
父節點
當前提交
7a9006cd3a

+ 8
- 12
src/java/org/apache/fop/render/intermediate/IFRenderer.java 查看文件

@@ -27,7 +27,6 @@ import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
@@ -1133,8 +1132,7 @@ public class IFRenderer extends AbstractPathOrientedRenderer {

private class TextUtil {
private static final int INITIAL_BUFFER_SIZE = 16;
private int[][] dp = new int[INITIAL_BUFFER_SIZE][4];
// private int lastDPPos = 0; // TBD - not yet used
private int[][] dp = new int[INITIAL_BUFFER_SIZE][];
private final StringBuffer text = new StringBuffer();
private int startx;
private int starty;
@@ -1163,16 +1161,15 @@ public class IFRenderer extends AbstractPathOrientedRenderer {
if (idx > dp.length - 1) {
int newSize = Math.max(dp.length, idx + 1) + INITIAL_BUFFER_SIZE;
int[][] newDP = new int[newSize][];
// reuse prior PA[0]...PA[dp.length-1]
// reuse prior DP[0]...DP[dp.length-1]
System.arraycopy(dp, 0, newDP, 0, dp.length);
// populate new PA[dp.length]...PA[newDP.length-1]
for ( int i = dp.length, n = newDP.length; i < n; i++ ) {
newDP[i] = new int[4];
}
// switch to new DP, leaving DP[dp.length]...DP[newDP.length-1] unpopulated
dp = newDP;
}
if ( dp[idx - 1] == null ) {
dp[idx - 1] = new int[4];
}
IFUtil.adjustPA ( dp[idx - 1], pa );
// lastDPPos = idx;
}
}

@@ -1180,9 +1177,8 @@ public class IFRenderer extends AbstractPathOrientedRenderer {
if (text.length() > 0) {
text.setLength(0);
for ( int i = 0, n = dp.length; i < n; i++ ) {
Arrays.fill(dp[i], 0);
dp[i] = null;
}
// lastDPPos = 0;
}
}

@@ -1230,7 +1226,7 @@ public class IFRenderer extends AbstractPathOrientedRenderer {
int i = ( tl < pl ) ? tl : pl;
while ( i > 0 ) {
int[] pa = dp [ i - 1 ];
if ( !IFUtil.isPAIdentity ( pa ) ) {
if ( ( pa != null ) && !IFUtil.isPAIdentity ( pa ) ) {
break;
} else {
i--;

+ 11
- 6
src/java/org/apache/fop/render/intermediate/IFUtil.java 查看文件

@@ -217,7 +217,9 @@ public final class IFUtil {
if ( dp != null ) {
dx = new int [ count ];
for ( int i = 0, n = count; i < n; i++ ) {
dx [ i ] = dp [ i ] [ 0 ]; // xPlaAdjust[i]
if ( dp [ i ] != null ) {
dx [ i ] = dp [ i ] [ 0 ]; // xPlaAdjust[i]
}
}
} else {
dx = null;
@@ -330,7 +332,7 @@ public final class IFUtil {
} else {
for ( int i = 0, n = dp.length; i < n; i++ ) {
int[] pa = dp[i];
if ( pa[0] != pa[2] ) {
if ( ( pa != null ) && ( pa[0] != pa[2] ) ) {
return false;
}
}
@@ -369,12 +371,15 @@ public final class IFUtil {
if ( ( dp == null ) || ( offset > dp.length ) || ( ( offset + count ) > dp.length ) ) {
throw new IllegalArgumentException();
} else {
int[][] dpNew = new int [ count ] [ 4 ];
int[][] dpNew = new int [ count ] [];
for ( int i = 0, n = count; i < n; i++ ) {
int[] paDst = dpNew [ i ];
int[] paSrc = dp [ i + offset ];
for ( int k = 0; k < 4; k++ ) {
paDst [ k ] = paSrc [ k ];
if ( paSrc != null ) {
int[] paDst = new int [ 4 ];
for ( int k = 0; k < 4; k++ ) {
paDst [ k ] = paSrc [ k ];
}
dpNew [ i ] = paDst;
}
}
return dpNew;

+ 1
- 2
src/java/org/apache/fop/render/pdf/PDFPainter.java 查看文件

@@ -445,7 +445,6 @@ public class PDFPainter extends AbstractIFPainter<PDFDocumentHandler> {
int fs = state.getFontSize();
float fsPoints = fs / 1000f;
Font f = getFontInfo().getFontInstance(triplet, fs);
// String fn = f.getFontName();
PDFTextUtil tu = generator.getTextUtil();
double xc = 0f;
double yc = 0f;
@@ -457,7 +456,7 @@ public class PDFPainter extends AbstractIFPainter<PDFDocumentHandler> {
generator.updateCharacterSpacing ( letterSpacing / 1000f );
for ( int i = 0, n = text.length(); i < n; i++ ) {
char ch = text.charAt ( i );
int[] pa = ( i < dp.length ) ? dp [ i ] : paZero;
int[] pa = ( ( i >= dp.length ) || ( dp[i] == null ) ) ? paZero : dp[i];
double xo = xc + pa[0];
double yo = yc + pa[1];
double xa = f.getCharWidth(ch) + maybeWordOffsetX ( wox, ch, null );

+ 11
- 7
src/java/org/apache/fop/util/XMLUtil.java 查看文件

@@ -194,14 +194,18 @@ public final class XMLUtil implements XMLConstants {
sb.append ( na );
for ( int i = 0; i < na; i++ ) {
int[] pa = dp [ i ];
for ( int k = 0; k < 4; k++ ) {
int a = pa [ k ];
if ( a != 0 ) {
encodeNextAdjustment ( sb, nz, a );
nz = 0;
} else {
nz++;
if ( pa != null ) {
for ( int k = 0; k < 4; k++ ) {
int a = pa [ k ];
if ( a != 0 ) {
encodeNextAdjustment ( sb, nz, a );
nz = 0;
} else {
nz++;
}
}
} else {
nz += 4;
}
}
encodeNextAdjustment ( sb, nz, 0 );

+ 3
- 0
status.xml 查看文件

@@ -59,6 +59,9 @@
documents. Example: the fix of marks layering will be such a case when it's done.
-->
<release version="FOP Trunk" date="TBD">
<action context="Fonts" dev="GA" type="fix" fixes-bug="FOP-2195">
Use sparse arrays for position adjustments.
</action>
<action context="Fonts" dev="GA" type="fix" fixes-bug="FOP-2194">
Optimize lazy font load invocation for hot methods.
</action>

Loading…
取消
儲存