Skip to content

Commit e710d57

Browse files
committed
PDFBOX-6220: cache splitter, as suggested by Olivier Bruchez
git-svn-id: https://svn.apache.org/repos/asf/pdfbox/trunk@1936377 13f79535-47bb-0310-9956-ffa450edef68
1 parent d73ec71 commit e710d57

6 files changed

Lines changed: 34 additions & 12 deletions

File tree

fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForBengali.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.List;
2525
import java.util.Map;
2626
import java.util.Set;
27+
import java.util.WeakHashMap;
2728

2829
import org.apache.fontbox.ttf.CmapLookup;
2930
import org.apache.fontbox.ttf.model.GsubData;
@@ -64,6 +65,7 @@ public class GsubWorkerForBengali implements GsubWorker
6465
private final List<Integer> beforeHalfGlyphIds;
6566
private final Map<Integer, BeforeAndAfterSpanComponent> beforeAndAfterSpanGlyphIds;
6667

68+
private Map<String,GlyphArraySplitter> map = new WeakHashMap<>();
6769

6870
GsubWorkerForBengali(CmapLookup cmapLookup, GsubData gsubData)
6971
{
@@ -155,8 +157,8 @@ private List<Integer> applyGsubFeature(ScriptFeature scriptFeature,
155157
return originalGlyphs;
156158
}
157159

158-
GlyphArraySplitter glyphArraySplitter = new GlyphArraySplitterRegexImpl(
159-
allGlyphIdsForSubstitution);
160+
GlyphArraySplitter glyphArraySplitter =
161+
map.computeIfAbsent(scriptFeature.getName(), k -> new GlyphArraySplitterRegexImpl(allGlyphIdsForSubstitution));
160162

161163
List<List<Integer>> tokens = glyphArraySplitter.split(originalGlyphs);
162164

fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForDevanagari.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
import java.util.Arrays;
2222
import java.util.Collections;
2323
import java.util.List;
24+
import java.util.Map;
2425
import java.util.Set;
26+
import java.util.WeakHashMap;
2527

2628
import org.apache.fontbox.ttf.CmapLookup;
2729
import org.apache.fontbox.ttf.model.GsubData;
@@ -42,6 +44,8 @@ public class GsubWorkerForDevanagari implements GsubWorker
4244

4345
private static final String RKRF_FEATURE = "rkrf";
4446
private static final String VATU_FEATURE = "vatu";
47+
48+
private Map<String,GlyphArraySplitter> map = new WeakHashMap<>();
4549

4650
/**
4751
* This sequence is very important. This has been taken from <a href=
@@ -212,8 +216,8 @@ private List<Integer> applyGsubFeature(ScriptFeature scriptFeature, List<Integer
212216
LOG.debug("getAllGlyphIdsForSubstitution() for {} is empty", scriptFeature.getName());
213217
return originalGlyphs;
214218
}
215-
GlyphArraySplitter glyphArraySplitter = new GlyphArraySplitterRegexImpl(
216-
allGlyphIdsForSubstitution);
219+
GlyphArraySplitter glyphArraySplitter =
220+
map.computeIfAbsent(scriptFeature.getName(), k -> new GlyphArraySplitterRegexImpl(allGlyphIdsForSubstitution));
217221
List<List<Integer>> tokens = glyphArraySplitter.split(originalGlyphs);
218222
List<Integer> gsubProcessedGlyphs = new ArrayList<>(tokens.size());
219223
tokens.forEach(chunk ->

fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForDflt.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import java.util.Arrays;
2222
import java.util.Collections;
2323
import java.util.List;
24+
import java.util.Map;
25+
import java.util.WeakHashMap;
2426

2527
import org.apache.fontbox.ttf.model.GsubData;
2628
import org.apache.fontbox.ttf.model.ScriptFeature;
@@ -64,6 +66,8 @@ public class GsubWorkerForDflt implements GsubWorker
6466

6567
private final GsubData gsubData;
6668

69+
private Map<String,GlyphArraySplitter> map = new WeakHashMap<>();
70+
6771
GsubWorkerForDflt(GsubData gsubData)
6872
{
6973
this.gsubData = gsubData;
@@ -102,8 +106,8 @@ private List<Integer> applyGsubFeature(ScriptFeature scriptFeature,
102106
return originalGlyphs;
103107
}
104108

105-
GlyphArraySplitter glyphArraySplitter = new GlyphArraySplitterRegexImpl(
106-
scriptFeature.getAllGlyphIdsForSubstitution());
109+
GlyphArraySplitter glyphArraySplitter =
110+
map.computeIfAbsent(scriptFeature.getName(), k -> new GlyphArraySplitterRegexImpl(allGlyphIdsForSubstitution));
107111

108112
List<List<Integer>> tokens = glyphArraySplitter.split(originalGlyphs);
109113
List<Integer> gsubProcessedGlyphs = new ArrayList<>();

fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForGujarati.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
import java.util.Arrays;
2222
import java.util.Collections;
2323
import java.util.List;
24+
import java.util.Map;
2425
import java.util.Set;
26+
import java.util.WeakHashMap;
2527

2628
import org.apache.fontbox.ttf.CmapLookup;
2729
import org.apache.fontbox.ttf.model.GsubData;
@@ -66,6 +68,8 @@ public class GsubWorkerForGujarati implements GsubWorker
6668
private final List<Integer> beforeRephGlyphIds;
6769
private final List<Integer> beforeHalfGlyphIds;
6870

71+
private Map<String,GlyphArraySplitter> map = new WeakHashMap<>();
72+
6973
GsubWorkerForGujarati(CmapLookup cmapLookup, GsubData gsubData)
7074
{
7175
this.cmapLookup = cmapLookup;
@@ -211,8 +215,8 @@ private List<Integer> applyGsubFeature(ScriptFeature scriptFeature, List<Integer
211215
LOG.debug("getAllGlyphIdsForSubstitution() for {} is empty", scriptFeature.getName());
212216
return originalGlyphs;
213217
}
214-
GlyphArraySplitter glyphArraySplitter = new GlyphArraySplitterRegexImpl(
215-
allGlyphIdsForSubstitution);
218+
GlyphArraySplitter glyphArraySplitter =
219+
map.computeIfAbsent(scriptFeature.getName(), k -> new GlyphArraySplitterRegexImpl(allGlyphIdsForSubstitution));
216220
List<List<Integer>> tokens = glyphArraySplitter.split(originalGlyphs);
217221
List<Integer> gsubProcessedGlyphs = new ArrayList<>(tokens.size());
218222
tokens.forEach(chunk ->

fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForLatin.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import java.util.Arrays;
2222
import java.util.Collections;
2323
import java.util.List;
24+
import java.util.Map;
25+
import java.util.WeakHashMap;
2426

2527
import org.apache.fontbox.ttf.model.GsubData;
2628
import org.apache.fontbox.ttf.model.ScriptFeature;
@@ -48,6 +50,8 @@ public class GsubWorkerForLatin implements GsubWorker
4850

4951
private final GsubData gsubData;
5052

53+
private Map<String,GlyphArraySplitter> map = new WeakHashMap<>();
54+
5155
GsubWorkerForLatin(GsubData gsubData)
5256
{
5357
this.gsubData = gsubData;
@@ -87,8 +91,8 @@ private List<Integer> applyGsubFeature(ScriptFeature scriptFeature,
8791
return originalGlyphs;
8892
}
8993

90-
GlyphArraySplitter glyphArraySplitter = new GlyphArraySplitterRegexImpl(
91-
scriptFeature.getAllGlyphIdsForSubstitution());
94+
GlyphArraySplitter glyphArraySplitter =
95+
map.computeIfAbsent(scriptFeature.getName(), k -> new GlyphArraySplitterRegexImpl(allGlyphIdsForSubstitution));
9296

9397
List<List<Integer>> tokens = glyphArraySplitter.split(originalGlyphs);
9498
List<Integer> gsubProcessedGlyphs = new ArrayList<>();

fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForTamil.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
import java.util.Arrays;
2222
import java.util.Collections;
2323
import java.util.List;
24+
import java.util.Map;
2425
import java.util.Set;
26+
import java.util.WeakHashMap;
2527

2628
import org.apache.fontbox.ttf.CmapLookup;
2729
import org.apache.fontbox.ttf.model.GsubData;
@@ -66,6 +68,8 @@ public class GsubWorkerForTamil implements GsubWorker
6668
private final List<Integer> beforeRephGlyphIds;
6769
private final List<Integer> beforeHalfGlyphIds;
6870

71+
private Map<String,GlyphArraySplitter> map = new WeakHashMap<>();
72+
6973
GsubWorkerForTamil(CmapLookup cmapLookup, GsubData gsubData)
7074
{
7175
this.cmapLookup = cmapLookup;
@@ -163,8 +167,8 @@ private List<Integer> applyGsubFeature(ScriptFeature scriptFeature, List<Integer
163167
LOG.debug("getAllGlyphIdsForSubstitution() for {} is empty", scriptFeature.getName());
164168
return originalGlyphs;
165169
}
166-
GlyphArraySplitter glyphArraySplitter = new GlyphArraySplitterRegexImpl(
167-
allGlyphIdsForSubstitution);
170+
GlyphArraySplitter glyphArraySplitter =
171+
map.computeIfAbsent(scriptFeature.getName(), k -> new GlyphArraySplitterRegexImpl(allGlyphIdsForSubstitution));
168172
List<List<Integer>> tokens = glyphArraySplitter.split(originalGlyphs);
169173
List<Integer> gsubProcessedGlyphs = new ArrayList<>(tokens.size());
170174
tokens.forEach(chunk ->

0 commit comments

Comments
 (0)