]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
FOP-2186: optimize inefficient glyph processing state update operations
authorGlenn Adams <gadams@apache.org>
Wed, 16 Jan 2013 20:54:49 +0000 (20:54 +0000)
committerGlenn Adams <gadams@apache.org>
Wed, 16 Jan 2013 20:54:49 +0000 (20:54 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1434386 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/complexscripts/fonts/GlyphPositioningState.java
src/java/org/apache/fop/complexscripts/fonts/GlyphProcessingState.java
src/java/org/apache/fop/complexscripts/fonts/GlyphSubstitutionState.java
src/java/org/apache/fop/complexscripts/fonts/GlyphTable.java
status.xml

index e269f0c229c39710cfba37111b3f05526b18db13..a865449ac16835a6353ca8b6f4f5d196f0e20f05 100644 (file)
@@ -143,7 +143,6 @@ public class GlyphPositioningState extends GlyphProcessingState {
         assert st != null;
         updateSubtableState ( st );
         boolean applied = st.position ( this );
-        resetSubtableState();
         return applied;
     }
 
index 33b753676882b5023180f8a22f7ade087bfa6174..c003ebbf91c3123ee939a7889940848ecab88fcb 100644 (file)
@@ -72,6 +72,8 @@ public class GlyphProcessingState {
     protected GlyphTester ignoreMark;
     /** default ignore glyph tester */
     protected GlyphTester ignoreDefault;
+    /** current subtable */
+    private GlyphSubtable subtable;
 
     /**
      * Construct glyph processing state.
@@ -181,18 +183,12 @@ public class GlyphProcessingState {
      * @param st glyph subtable to use for update
      */
     public void updateSubtableState ( GlyphSubtable st ) {
-        setGDEF ( st.getGDEF() );
-        setLookupFlags ( st.getFlags() );
-        setIgnoreDefault ( getIgnoreTester ( getLookupFlags() ) );
-    }
-
-    /**
-     * Reset glyph subtable specific state.
-     */
-    public void resetSubtableState() {
-        setGDEF ( null );
-        setLookupFlags ( 0 );
-        setIgnoreDefault ( null );
+        if ( this.subtable != st ) {
+            setGDEF ( st.getGDEF() );
+            setLookupFlags ( st.getFlags() );
+            setIgnoreDefault ( getIgnoreTester ( getLookupFlags() ) );
+            this.subtable = st;
+        }
     }
 
     /**
index 65fdee9e0f5f542105df57795d8afe71160de664..c6217e3940c38dd6f1967c094a9f67f699666b86 100644 (file)
@@ -162,7 +162,6 @@ public class GlyphSubstitutionState extends GlyphProcessingState {
         assert st != null;
         updateSubtableState ( st );
         boolean applied = st.substitute ( this );
-        resetSubtableState();
         return applied;
     }
 
index c5a865b41cd471885f90288c63f6c36a3e047da1..d7bf938cbf2672bcc128dc0d3935e8ad54e48981 100644 (file)
@@ -435,7 +435,8 @@ public class GlyphTable {
      */
     public static class LookupTable implements Comparable {
 
-        private final String id;                                // lookup identifiers
+        private final String id;                                // lookup identifier
+        private final int idOrdinal;                            // parsed lookup identifier ordinal
         private final List/*<GlyphSubtable>*/ subtables;        // list of subtables
         private boolean doesSub;                                // performs substitutions
         private boolean doesPos;                                // performs positioning
@@ -461,7 +462,9 @@ public class GlyphTable {
         public LookupTable ( String id, List/*<GlyphSubtable>*/ subtables ) {
             assert id != null;
             assert id.length() != 0;
+            assert id.startsWith ( "lu" );
             this.id = id;
+            this.idOrdinal = Integer.parseInt ( id.substring ( 2 ) );
             this.subtables = new LinkedList/*<GlyphSubtable>*/();
             if ( subtables != null ) {
                 for ( Iterator it = subtables.iterator(); it.hasNext(); ) {
@@ -471,11 +474,6 @@ public class GlyphTable {
             }
         }
 
-        /** @return the identifier */
-        public String getId() {
-            return id;
-        }
-
         /** @return the subtables as an array */
         public GlyphSubtable[] getSubtables() {
             if ( frozen ) {
@@ -664,7 +662,7 @@ public class GlyphTable {
 
         /** {@inheritDoc} */
         public int hashCode() {
-            return id.hashCode();
+            return idOrdinal;
         }
 
         /**
@@ -675,7 +673,7 @@ public class GlyphTable {
         public boolean equals ( Object o ) {
             if ( o instanceof LookupTable ) {
                 LookupTable lt = (LookupTable) o;
-                return id.equals ( lt.id );
+                return idOrdinal == lt.idOrdinal;
             } else {
                 return false;
             }
@@ -691,10 +689,8 @@ public class GlyphTable {
         public int compareTo ( Object o ) {
             if ( o instanceof LookupTable ) {
                 LookupTable lt = (LookupTable) o;
-                assert id.startsWith ( "lu" );
-                int i = Integer.parseInt ( id.substring ( 2 ) );
-                assert lt.id.startsWith ( "lu" );
-                int j = Integer.parseInt ( lt.id.substring ( 2 ) );
+                int i = idOrdinal;
+                int j = lt.idOrdinal;
                 if ( i < j ) {
                     return -1;
                 } else if ( i > j ) {
index db0b5f688c6d60e3b4718e54288d90e3f8cdf28f..9df7abdbc30c5368d5723ef36697805f2e4026ae 100644 (file)
@@ -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="Renderers" dev="GA" type="fix" fixes-bug="FOP-2186">
+       Optimize inefficient glyph processing state update operations in CS path.
+      </action>
       <action context="Renderers" dev="GA" type="fix" fixes-bug="FOP-2184" due-to="Luis Bernardo">
        Optimize inefficient position adjustment array allocation in non-CS path.
       </action>