/*
 * 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.fonts;

import org.apache.fop.complexscripts.util.GlyphSequence;
import org.apache.fop.complexscripts.util.ScriptContextTester;

// CSOFF: LineLengthCheck

The GlyphPositioningState implements an state object used during glyph positioning processing.

This work was originally authored by Glenn Adams (gadams@apache.org).

/** * <p>The <code>GlyphPositioningState</code> implements an state object used during glyph positioning * processing.</p> * * <p>This work was originally authored by Glenn Adams (gadams@apache.org).</p> */
public class GlyphPositioningState extends GlyphProcessingState {
font size
/** font size */
private int fontSize;
default advancements
/** default advancements */
private int[] widths;
current adjustments
/** current adjustments */
private int[][] adjustments;
if true, then some adjustment was applied
/** if true, then some adjustment was applied */
private boolean adjusted;
Construct default (reset) glyph positioning state.
/** * Construct default (reset) glyph positioning state. */
public GlyphPositioningState() { }
Construct glyph positioning state.
Params:
  • gs – input glyph sequence
  • script – script identifier
  • language – language identifier
  • feature – feature identifier
  • fontSize – font size (in micropoints)
  • widths – array of design advancements (in glyph index order)
  • adjustments – positioning adjustments to which positioning is applied
  • sct – script context tester (or null)
/** * Construct glyph positioning state. * @param gs input glyph sequence * @param script script identifier * @param language language identifier * @param feature feature identifier * @param fontSize font size (in micropoints) * @param widths array of design advancements (in glyph index order) * @param adjustments positioning adjustments to which positioning is applied * @param sct script context tester (or null) */
public GlyphPositioningState(GlyphSequence gs, String script, String language, String feature, int fontSize, int[] widths, int[][] adjustments, ScriptContextTester sct) { super(gs, script, language, feature, sct); this.fontSize = fontSize; this.widths = widths; this.adjustments = adjustments; }
Construct glyph positioning state using an existing state object using shallow copy except as follows: input glyph sequence is copied deep except for its characters array.
Params:
  • ps – existing positioning state to copy from
/** * Construct glyph positioning state using an existing state object using shallow copy * except as follows: input glyph sequence is copied deep except for its characters array. * @param ps existing positioning state to copy from */
public GlyphPositioningState(GlyphPositioningState ps) { super(ps); this.fontSize = ps.fontSize; this.widths = ps.widths; this.adjustments = ps.adjustments; }
Reset glyph positioning state.
Params:
  • gs – input glyph sequence
  • script – script identifier
  • language – language identifier
  • feature – feature identifier
  • fontSize – font size (in micropoints)
  • widths – array of design advancements (in glyph index order)
  • adjustments – positioning adjustments to which positioning is applied
  • sct – script context tester (or null)
/** * Reset glyph positioning state. * @param gs input glyph sequence * @param script script identifier * @param language language identifier * @param feature feature identifier * @param fontSize font size (in micropoints) * @param widths array of design advancements (in glyph index order) * @param adjustments positioning adjustments to which positioning is applied * @param sct script context tester (or null) */
public GlyphPositioningState reset(GlyphSequence gs, String script, String language, String feature, int fontSize, int[] widths, int[][] adjustments, ScriptContextTester sct) { super.reset(gs, script, language, feature, sct); this.fontSize = fontSize; this.widths = widths; this.adjustments = adjustments; this.adjusted = false; return this; }
Obtain design advancement (width) of glyph at specified index.
Params:
  • gi – glyph index
Returns:design advancement, or zero if glyph index is not present
/** * Obtain design advancement (width) of glyph at specified index. * @param gi glyph index * @return design advancement, or zero if glyph index is not present */
public int getWidth(int gi) { if ((widths != null) && (gi < widths.length)) { return widths [ gi ]; } else { return 0; } }
Perform adjustments at current position index.
Params:
  • v – value containing adjustments
Returns:true if a non-zero adjustment was made
/** * Perform adjustments at current position index. * @param v value containing adjustments * @return true if a non-zero adjustment was made */
public boolean adjust(GlyphPositioningTable.Value v) { return adjust(v, 0); }
Perform adjustments at specified offset from current position index.
Params:
  • v – value containing adjustments
  • offset – from current position index
Returns:true if a non-zero adjustment was made
/** * Perform adjustments at specified offset from current position index. * @param v value containing adjustments * @param offset from current position index * @return true if a non-zero adjustment was made */
public boolean adjust(GlyphPositioningTable.Value v, int offset) { assert v != null; if ((index + offset) < indexLast) { return v.adjust(adjustments [ index + offset ], fontSize); } else { throw new IndexOutOfBoundsException(); } }
Obtain current adjustments at current position index.
Returns:array of adjustments (int[4]) at current position
/** * Obtain current adjustments at current position index. * @return array of adjustments (int[4]) at current position */
public int[] getAdjustment() { return getAdjustment(0); }
Obtain current adjustments at specified offset from current position index.
Params:
  • offset – from current position index
Throws:
Returns:array of adjustments (int[4]) at specified offset
/** * Obtain current adjustments at specified offset from current position index. * @param offset from current position index * @return array of adjustments (int[4]) at specified offset * @throws IndexOutOfBoundsException if offset is invalid */
public int[] getAdjustment(int offset) throws IndexOutOfBoundsException { if ((index + offset) < indexLast) { return adjustments [ index + offset ]; } else { throw new IndexOutOfBoundsException(); } }
Apply positioning subtable to current state at current position (only), resulting in the consumption of zero or more input glyphs.
Params:
  • st – the glyph positioning subtable to apply
Returns:true if subtable applied, or false if it did not (e.g., its input coverage table did not match current input context)
/** * Apply positioning subtable to current state at current position (only), * resulting in the consumption of zero or more input glyphs. * @param st the glyph positioning subtable to apply * @return true if subtable applied, or false if it did not (e.g., its * input coverage table did not match current input context) */
public boolean apply(GlyphPositioningSubtable st) { assert st != null; updateSubtableState(st); boolean applied = st.position(this); return applied; }
Apply a sequence of matched rule lookups to the nig input glyphs starting at the current position. If lookups are non-null and non-empty, then all input glyphs specified by nig are consumed irregardless of whether any specified lookup applied.
Params:
  • lookups – array of matched lookups (or null)
  • nig – number of glyphs in input sequence, starting at current position, to which the lookups are to apply, and to be consumed once the application has finished
Returns:true if lookups are non-null and non-empty; otherwise, false
/** * Apply a sequence of matched rule lookups to the <code>nig</code> input glyphs * starting at the current position. If lookups are non-null and non-empty, then * all input glyphs specified by <code>nig</code> are consumed irregardless of * whether any specified lookup applied. * @param lookups array of matched lookups (or null) * @param nig number of glyphs in input sequence, starting at current position, to which * the lookups are to apply, and to be consumed once the application has finished * @return true if lookups are non-null and non-empty; otherwise, false */
public boolean apply(GlyphTable.RuleLookup[] lookups, int nig) { if ((lookups != null) && (lookups.length > 0)) { // apply each rule lookup to extracted input glyph array for (GlyphTable.RuleLookup l : lookups) { if (l != null) { GlyphTable.LookupTable lt = l.getLookup(); if (lt != null) { // perform positioning on a copy of previous state GlyphPositioningState ps = new GlyphPositioningState(this); // apply lookup table positioning if (lt.position(ps, l.getSequenceIndex())) { setAdjusted(true); } } } } consume(nig); return true; } else { return false; } }
Apply default application semantices; namely, consume one input glyph.
/** * Apply default application semantices; namely, consume one input glyph. */
public void applyDefault() { super.applyDefault(); }
Set adjusted state, used to record effect of non-zero adjustment.
Params:
  • adjusted – true if to set adjusted state, otherwise false to clear adjusted state
/** * Set adjusted state, used to record effect of non-zero adjustment. * @param adjusted true if to set adjusted state, otherwise false to * clear adjusted state */
public void setAdjusted(boolean adjusted) { this.adjusted = adjusted; }
Get adjusted state.
Returns:adjusted true if some non-zero adjustment occurred and was recorded by setAdjusted; otherwise, false.
/** * Get adjusted state. * @return adjusted true if some non-zero adjustment occurred and * was recorded by {@link #setAdjusted}; otherwise, false. */
public boolean getAdjusted() { return adjusted; } }