blob: 04af70544b861e256c77645db5246444b893f484 [file] [log] [blame]
/*
* 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);
}
}
}