| /* |
| * 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.svg.font; |
| |
| import java.util.Collections; |
| |
| import org.junit.Test; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| import org.apache.fop.fonts.FontInfo; |
| |
| /** |
| * Specifically tests glyph positioning from a real font. |
| */ |
| public class GlyphLayoutTestCase extends FOPGVTGlyphVectorTest { |
| |
| /** |
| * Glyph positioning using the legacy kern table. |
| */ |
| @Test |
| public void testBasicGlyphPositioning() throws Exception { |
| testGlyphLayout(false); |
| } |
| |
| /** |
| * Glyph positioning using GPOS sub-tables. |
| */ |
| @Test |
| public void testAdvancedGlyphPositioning() throws Exception { |
| testGlyphLayout(true); |
| } |
| |
| private void testGlyphLayout(boolean useAdvanced) { |
| FOPGVTFont font = loadFont(useAdvanced); |
| glyphVector = (FOPGVTGlyphVector) font.createGlyphVector(null, "L\u201DP,V.F,A\u2019LT.", "DFLT", "dflt"); |
| glyphVector.performDefaultLayout(); |
| // Values in font units (unitsPerEm = 2048), glyph width - kern |
| int[] widths = { |
| /* L */ 1360 - 491, |
| /* " */ 1047, |
| /* P */ 1378 - 415, |
| /* , */ 651, |
| /* V */ 1479 - 358, |
| /* . */ 651, |
| /* F */ 1421 - 319, |
| /* , */ 651, |
| /* A */ 1479 - 301, |
| /* ' */ 651, |
| /* L */ 1360 - 167, |
| /* T */ 1366 - 301, |
| /* . */ 651}; |
| checkGlyphPositions(13, widths); |
| } |
| |
| private FOPGVTFont loadFont(boolean useAdvanced) { |
| FontInfo fontInfo = new FontInfoBuilder().useDejaVuLGCSerif(useAdvanced).build(); |
| FOPFontFamilyResolver resolver = new FOPFontFamilyResolverImpl(fontInfo); |
| FOPGVTFontFamily family = resolver.resolve(FontInfoBuilder.DEJAVU_LGC_SERIF); |
| return family.deriveFont(1000, Collections.emptyMap()); |
| } |
| |
| private void checkGlyphPositions(int expectedGlyphCount, int[] widths) { |
| assertEquals(expectedGlyphCount, glyphVector.getNumGlyphs()); |
| float[] positions = new float[2 * (widths.length + 1)]; |
| for (int i = 0, n = 2; i < widths.length; i++, n += 2) { |
| positions[n] = positions[n - 2] + widths[i] / 2.048f; |
| } |
| for (int i = 0; i <= widths.length; i++) { |
| assertEquals(positions[2 * i], glyphVector.getGlyphPosition(i).getX(), 3); |
| } |
| } |
| |
| } |