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 ->

Reply via email to