Author: tilman
Date: Mon Jul 20 13:33:29 2026
New Revision: 1936377
Log:
PDFBOX-6220: cache splitter, as suggested by Olivier Bruchez
Modified:
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForBengali.java
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForDevanagari.java
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForDflt.java
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForGujarati.java
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForLatin.java
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForTamil.java
Modified:
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForBengali.java
==============================================================================
---
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForBengali.java
Mon Jul 20 13:33:24 2026 (r1936376)
+++
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForBengali.java
Mon Jul 20 13:33:29 2026 (r1936377)
@@ -24,6 +24,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.WeakHashMap;
import org.apache.fontbox.ttf.CmapLookup;
import org.apache.fontbox.ttf.model.GsubData;
@@ -64,6 +65,7 @@ public class GsubWorkerForBengali implem
private final List<Integer> beforeHalfGlyphIds;
private final Map<Integer, BeforeAndAfterSpanComponent>
beforeAndAfterSpanGlyphIds;
+ private Map<String,GlyphArraySplitter> map = new WeakHashMap<>();
GsubWorkerForBengali(CmapLookup cmapLookup, GsubData gsubData)
{
@@ -155,8 +157,8 @@ public class GsubWorkerForBengali implem
return originalGlyphs;
}
- GlyphArraySplitter glyphArraySplitter = new
GlyphArraySplitterRegexImpl(
- allGlyphIdsForSubstitution);
+ GlyphArraySplitter glyphArraySplitter =
+ map.computeIfAbsent(scriptFeature.getName(), k -> new
GlyphArraySplitterRegexImpl(allGlyphIdsForSubstitution));
List<List<Integer>> tokens = glyphArraySplitter.split(originalGlyphs);
Modified:
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForDevanagari.java
==============================================================================
---
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForDevanagari.java
Mon Jul 20 13:33:24 2026 (r1936376)
+++
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForDevanagari.java
Mon Jul 20 13:33:29 2026 (r1936377)
@@ -21,7 +21,9 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
import java.util.Set;
+import java.util.WeakHashMap;
import org.apache.fontbox.ttf.CmapLookup;
import org.apache.fontbox.ttf.model.GsubData;
@@ -42,6 +44,8 @@ public class GsubWorkerForDevanagari imp
private static final String RKRF_FEATURE = "rkrf";
private static final String VATU_FEATURE = "vatu";
+
+ private Map<String,GlyphArraySplitter> map = new WeakHashMap<>();
/**
* This sequence is very important. This has been taken from <a href=
@@ -212,8 +216,8 @@ public class GsubWorkerForDevanagari imp
LOG.debug("getAllGlyphIdsForSubstitution() for {} is empty",
scriptFeature.getName());
return originalGlyphs;
}
- GlyphArraySplitter glyphArraySplitter = new
GlyphArraySplitterRegexImpl(
- allGlyphIdsForSubstitution);
+ GlyphArraySplitter glyphArraySplitter =
+ map.computeIfAbsent(scriptFeature.getName(), k -> new
GlyphArraySplitterRegexImpl(allGlyphIdsForSubstitution));
List<List<Integer>> tokens = glyphArraySplitter.split(originalGlyphs);
List<Integer> gsubProcessedGlyphs = new ArrayList<>(tokens.size());
tokens.forEach(chunk ->
Modified:
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForDflt.java
==============================================================================
---
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForDflt.java
Mon Jul 20 13:33:24 2026 (r1936376)
+++
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForDflt.java
Mon Jul 20 13:33:29 2026 (r1936377)
@@ -21,6 +21,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
import org.apache.fontbox.ttf.model.GsubData;
import org.apache.fontbox.ttf.model.ScriptFeature;
@@ -64,6 +66,8 @@ public class GsubWorkerForDflt implement
private final GsubData gsubData;
+ private Map<String,GlyphArraySplitter> map = new WeakHashMap<>();
+
GsubWorkerForDflt(GsubData gsubData)
{
this.gsubData = gsubData;
@@ -102,8 +106,8 @@ public class GsubWorkerForDflt implement
return originalGlyphs;
}
- GlyphArraySplitter glyphArraySplitter = new
GlyphArraySplitterRegexImpl(
- scriptFeature.getAllGlyphIdsForSubstitution());
+ GlyphArraySplitter glyphArraySplitter =
+ map.computeIfAbsent(scriptFeature.getName(), k -> new
GlyphArraySplitterRegexImpl(allGlyphIdsForSubstitution));
List<List<Integer>> tokens = glyphArraySplitter.split(originalGlyphs);
List<Integer> gsubProcessedGlyphs = new ArrayList<>();
Modified:
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForGujarati.java
==============================================================================
---
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForGujarati.java
Mon Jul 20 13:33:24 2026 (r1936376)
+++
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForGujarati.java
Mon Jul 20 13:33:29 2026 (r1936377)
@@ -21,7 +21,9 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
import java.util.Set;
+import java.util.WeakHashMap;
import org.apache.fontbox.ttf.CmapLookup;
import org.apache.fontbox.ttf.model.GsubData;
@@ -66,6 +68,8 @@ public class GsubWorkerForGujarati imple
private final List<Integer> beforeRephGlyphIds;
private final List<Integer> beforeHalfGlyphIds;
+ private Map<String,GlyphArraySplitter> map = new WeakHashMap<>();
+
GsubWorkerForGujarati(CmapLookup cmapLookup, GsubData gsubData)
{
this.cmapLookup = cmapLookup;
@@ -211,8 +215,8 @@ public class GsubWorkerForGujarati imple
LOG.debug("getAllGlyphIdsForSubstitution() for {} is empty",
scriptFeature.getName());
return originalGlyphs;
}
- GlyphArraySplitter glyphArraySplitter = new
GlyphArraySplitterRegexImpl(
- allGlyphIdsForSubstitution);
+ GlyphArraySplitter glyphArraySplitter =
+ map.computeIfAbsent(scriptFeature.getName(), k -> new
GlyphArraySplitterRegexImpl(allGlyphIdsForSubstitution));
List<List<Integer>> tokens = glyphArraySplitter.split(originalGlyphs);
List<Integer> gsubProcessedGlyphs = new ArrayList<>(tokens.size());
tokens.forEach(chunk ->
Modified:
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForLatin.java
==============================================================================
---
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForLatin.java
Mon Jul 20 13:33:24 2026 (r1936376)
+++
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForLatin.java
Mon Jul 20 13:33:29 2026 (r1936377)
@@ -21,6 +21,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
import org.apache.fontbox.ttf.model.GsubData;
import org.apache.fontbox.ttf.model.ScriptFeature;
@@ -48,6 +50,8 @@ public class GsubWorkerForLatin implemen
private final GsubData gsubData;
+ private Map<String,GlyphArraySplitter> map = new WeakHashMap<>();
+
GsubWorkerForLatin(GsubData gsubData)
{
this.gsubData = gsubData;
@@ -87,8 +91,8 @@ public class GsubWorkerForLatin implemen
return originalGlyphs;
}
- GlyphArraySplitter glyphArraySplitter = new
GlyphArraySplitterRegexImpl(
- scriptFeature.getAllGlyphIdsForSubstitution());
+ GlyphArraySplitter glyphArraySplitter =
+ map.computeIfAbsent(scriptFeature.getName(), k -> new
GlyphArraySplitterRegexImpl(allGlyphIdsForSubstitution));
List<List<Integer>> tokens = glyphArraySplitter.split(originalGlyphs);
List<Integer> gsubProcessedGlyphs = new ArrayList<>();
Modified:
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForTamil.java
==============================================================================
---
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForTamil.java
Mon Jul 20 13:33:24 2026 (r1936376)
+++
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForTamil.java
Mon Jul 20 13:33:29 2026 (r1936377)
@@ -21,7 +21,9 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
import java.util.Set;
+import java.util.WeakHashMap;
import org.apache.fontbox.ttf.CmapLookup;
import org.apache.fontbox.ttf.model.GsubData;
@@ -66,6 +68,8 @@ public class GsubWorkerForTamil implemen
private final List<Integer> beforeRephGlyphIds;
private final List<Integer> beforeHalfGlyphIds;
+ private Map<String,GlyphArraySplitter> map = new WeakHashMap<>();
+
GsubWorkerForTamil(CmapLookup cmapLookup, GsubData gsubData)
{
this.cmapLookup = cmapLookup;
@@ -163,8 +167,8 @@ public class GsubWorkerForTamil implemen
LOG.debug("getAllGlyphIdsForSubstitution() for {} is empty",
scriptFeature.getName());
return originalGlyphs;
}
- GlyphArraySplitter glyphArraySplitter = new
GlyphArraySplitterRegexImpl(
- allGlyphIdsForSubstitution);
+ GlyphArraySplitter glyphArraySplitter =
+ map.computeIfAbsent(scriptFeature.getName(), k -> new
GlyphArraySplitterRegexImpl(allGlyphIdsForSubstitution));
List<List<Integer>> tokens = glyphArraySplitter.split(originalGlyphs);
List<Integer> gsubProcessedGlyphs = new ArrayList<>(tokens.size());
tokens.forEach(chunk ->