From 9a63b81a0e0da395589d1a74f3feb5e96b116e32 Mon Sep 17 00:00:00 2001 From: Simon Steiner Date: Sat, 26 Jun 2021 06:01:27 +0000 Subject: [PATCH] FOP-3016: Reorder thai marks for zero width git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1891050 13f79535-47bb-0310-9956-ffa450edef68 --- .../scripts/ScriptProcessor.java | 2 + .../scripts/ThaiScriptProcessor.java | 31 ++++++++++++ .../complexscripts/scripts/ThaiTestCase.java | 49 +++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 fop-core/src/main/java/org/apache/fop/complexscripts/scripts/ThaiScriptProcessor.java create mode 100644 fop-core/src/test/java/org/apache/fop/complexscripts/scripts/ThaiTestCase.java diff --git a/fop-core/src/main/java/org/apache/fop/complexscripts/scripts/ScriptProcessor.java b/fop-core/src/main/java/org/apache/fop/complexscripts/scripts/ScriptProcessor.java index 9626e0d8f..389cb9d12 100644 --- a/fop-core/src/main/java/org/apache/fop/complexscripts/scripts/ScriptProcessor.java +++ b/fop-core/src/main/java/org/apache/fop/complexscripts/scripts/ScriptProcessor.java @@ -245,6 +245,8 @@ public abstract class ScriptProcessor { sp = new ArabicScriptProcessor(script); } else if (CharScript.isIndicScript(sc)) { sp = IndicScriptProcessor.makeProcessor(script); + } else if (sc == CharScript.SCRIPT_THAI) { + sp = new ThaiScriptProcessor(script); } else { sp = new DefaultScriptProcessor(script); } diff --git a/fop-core/src/main/java/org/apache/fop/complexscripts/scripts/ThaiScriptProcessor.java b/fop-core/src/main/java/org/apache/fop/complexscripts/scripts/ThaiScriptProcessor.java new file mode 100644 index 000000000..c681861e9 --- /dev/null +++ b/fop-core/src/main/java/org/apache/fop/complexscripts/scripts/ThaiScriptProcessor.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ +package org.apache.fop.complexscripts.scripts; + +import org.apache.fop.complexscripts.fonts.GlyphDefinitionTable; + +public class ThaiScriptProcessor extends DefaultScriptProcessor { + ThaiScriptProcessor(String script) { + super(script); + } + + protected boolean isReorderedMark(GlyphDefinitionTable gdef, int[] glyphs, int[] unscaledWidths, int index) { + return gdef.isGlyphClass(glyphs[index], GlyphDefinitionTable.GLYPH_CLASS_MARK); + } +} diff --git a/fop-core/src/test/java/org/apache/fop/complexscripts/scripts/ThaiTestCase.java b/fop-core/src/test/java/org/apache/fop/complexscripts/scripts/ThaiTestCase.java new file mode 100644 index 000000000..27ac79197 --- /dev/null +++ b/fop-core/src/test/java/org/apache/fop/complexscripts/scripts/ThaiTestCase.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ +package org.apache.fop.complexscripts.scripts; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; + +import org.junit.Assert; +import org.junit.Test; + +import org.apache.fop.complexscripts.fonts.GlyphClassTable; +import org.apache.fop.complexscripts.fonts.GlyphDefinitionTable; +import org.apache.fop.complexscripts.fonts.GlyphSubtable; +import org.apache.fop.complexscripts.fonts.OTFScript; +import org.apache.fop.fonts.CMapSegment; +import org.apache.fop.fonts.MultiByteFont; + +public class ThaiTestCase { + @Test + public void testProcessor() { + String in = "\u0E2A\u0E31\u0E0D\u0E0D\u0E32 \u0E40\u0E25\u0E02\u0E17\u0E35\u0E48"; + MultiByteFont font = new MultiByteFont(null, null); + font.setWidthArray(new int[0]); + font.setCMap(new CMapSegment[]{new CMapSegment('\u0E2A', '\u0E2A', 1)}); + GlyphSubtable table = GlyphDefinitionTable.createSubtable(1, "lu0d", 0, 0, 1, + GlyphClassTable.createClassTable(Arrays.asList(0, GlyphDefinitionTable.GLYPH_CLASS_MARK)), null); + font.setGDEF( + new GlyphDefinitionTable(Collections.singletonList(table), new HashMap())); + String actual = font.reorderCombiningMarks(in, null, OTFScript.THAI, null, null).toString(); + Assert.assertTrue(actual.endsWith("\u0E2A")); + } +} -- 2.39.5