Author: tilman
Date: Mon Jul 20 13:33:24 2026
New Revision: 1936376

Log:
PDFBOX-6220: cache splitter, as suggested by Olivier Bruchez

Modified:
   
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForBengali.java
   
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForDevanagari.java
   
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForDflt.java
   
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForGujarati.java
   
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForLatin.java

Modified: 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForBengali.java
==============================================================================
--- 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForBengali.java
     Mon Jul 20 13:30:23 2026        (r1936375)
+++ 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForBengali.java
     Mon Jul 20 13:33:24 2026        (r1936376)
@@ -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.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -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)
     {
@@ -154,8 +156,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/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForDevanagari.java
==============================================================================
--- 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForDevanagari.java
  Mon Jul 20 13:30:23 2026        (r1936375)
+++ 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForDevanagari.java
  Mon Jul 20 13:33:24 2026        (r1936376)
@@ -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.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -66,6 +68,8 @@ public class GsubWorkerForDevanagari imp
     private final List<Integer> beforeRephGlyphIds;
     private final List<Integer> beforeHalfGlyphIds;
 
+    private Map<String,GlyphArraySplitter> map = new WeakHashMap<>();
+
     GsubWorkerForDevanagari(CmapLookup cmapLookup, GsubData gsubData)
     {
         this.cmapLookup = cmapLookup;
@@ -224,8 +228,8 @@ public class GsubWorkerForDevanagari imp
             }
             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/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForDflt.java
==============================================================================
--- 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForDflt.java
        Mon Jul 20 13:30:23 2026        (r1936375)
+++ 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForDflt.java
        Mon Jul 20 13:33:24 2026        (r1936376)
@@ -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.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -65,6 +67,8 @@ public class GsubWorkerForDflt implement
 
     private final GsubData gsubData;
 
+    private Map<String,GlyphArraySplitter> map = new WeakHashMap<>();
+
     GsubWorkerForDflt(GsubData gsubData)
     {
         this.gsubData = gsubData;
@@ -103,8 +107,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/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForGujarati.java
==============================================================================
--- 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForGujarati.java
    Mon Jul 20 13:30:23 2026        (r1936375)
+++ 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForGujarati.java
    Mon Jul 20 13:33:24 2026        (r1936376)
@@ -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.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -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;
@@ -223,8 +227,8 @@ public class GsubWorkerForGujarati imple
             }
             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/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForLatin.java
==============================================================================
--- 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForLatin.java
       Mon Jul 20 13:30:23 2026        (r1936375)
+++ 
pdfbox/branches/3.0/fontbox/src/main/java/org/apache/fontbox/ttf/gsub/GsubWorkerForLatin.java
       Mon Jul 20 13:33:24 2026        (r1936376)
@@ -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.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -47,6 +49,8 @@ public class GsubWorkerForLatin implemen
 
     private final GsubData gsubData;
 
+    private Map<String,GlyphArraySplitter> map = new WeakHashMap<>();
+
     GsubWorkerForLatin(GsubData gsubData)
     {
         this.gsubData = gsubData;
@@ -85,8 +89,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<>();

Reply via email to