
/*
 * @(#)OpenTypeLayoutEngine.h	1.4 00/03/15
 *
 * (C) Copyright IBM Corp. 1998, 1999, 2000 - All Rights Reserved
 *
 */

#ifndef __OPENTYPELAYOUTENGINE_H
#define __OPENTYPELAYOUTENGINE_H

#include "LETypes.h"
#include "LEGlyphFilter.h"
#include "LEFontInstance.h"
#include "LayoutEngine.h"

#include "GlyphSubstitutionTables.h"
#include "GlyphDefinitionTables.h"
#include "GlyphPositioningTables.h"

/**
 * OpenTypeLayoutEngine implements complex text layout for OpenType fonts - that is
 * fonts which have GSUB and GPOS tables associated with them. In order to do this,
 * the glyph processsing step described for LayoutEngine is further broken into three
 * steps:
 *
 * 1) Character processing - this step analyses the characters and assigns a list of OpenType
 *    feature tags to each one. It may also change, remove or add characters, and change
 *    their order.
 *
 * 2) Glyph processing - This step performs character to glyph mapping,and uses the GSUB
 *    table associated with the font to perform glyph substitutions, such as ligature substitution.
 *
 * 3) Glyph post processing - in cases where the font doesn't directly contain a GSUB table,
 *    the previous two steps may have generated "fake" glyph indices to use with a "canned" GSUB
 *    table. This step turns those glyph indices into actual font-specific glyph indices, and may
 *    perform any other adjustments requried by the previous steps.
 *
 * OpenTypeLayoutEngine will also use the font's GPOS table to apply position adjustments
 * such as kerning and accent positioning.
 *
 * @see LayoutEngine
 */
class OpenTypeLayoutEngine : public LayoutEngine
{
public:
	/**
	 * This is the main constructor. It constructs an instance of OpenTypeLayoutEngine for
	 * a particular font, script and language. It takes the GSUB table as a parameter since
	 * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an
	 * OpenType font.
	 *
	 * @param fontInstance - the font
	 * @param scriptCode - the script
	 * @param langaugeCode - the language
	 * @param gsubTable - the GSUB table
	 *
	 * @see LayoutEngine::layoutEngineFactory
	 * @see ScriptAndLangaugeTags.h for script and language codes
	 */
    OpenTypeLayoutEngine(LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
                            GlyphSubstitutionTableHeader *gsubTable);

	/**
	 * This constructor is used when the font requires a "canned" GSUB table which can't be known
	 * until after this constructor has been invoked.
	 *
	 * @param fontInstance - the font
	 * @param scriptCode - the script
	 * @param langaugeCode - the language
	 */
    OpenTypeLayoutEngine(LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode);

	/**
	 * The destructor, virtual for correct polymorphic invocation.
	 */
    virtual ~OpenTypeLayoutEngine();

	/**
	 * A convenience method used to convert the script code into
	 * the four byte script tag required by OpenType.
	 *
	 * @param scriptCode - the script code
	 *
	 * @return the four byte script tag
	 */
    static LETag getScriptTag(le_int32 scriptCode);

	/**
	 * A convenience method used to convert the langauge code into
	 * the four byte langauge tag required by OpenType.
	 *
	 * @param languageCode - the language code
	 *
	 * @return the four byte language tag
	 */
    static LETag getLangSysTag(le_int32 languageCode);

private:

	/**
	 * This method is used by the constructors to convert the script
	 * and language codes to four byte tags and save them.
	 */
    void setScriptAndLanguageTags();

protected:
	/**
	 * An array of pointers to four byte feature tags.
	 * Each pointer points to a list of tags, terminated
	 * by a special empty tag.
	 */
    const LETag **fFeatureTags;

	/**
	 * The address of the GSUB table.
	 */
    GlyphSubstitutionTableHeader *fGSUBTable;

	/**
	 * The address of the GDEF table.
	 */
    GlyphDefinitionTableHeader   *fGDEFTable;

	/**
	 * The address of the GPOS table.
	 */
    GlyphPositioningTableHeader  *fGPOSTable;

	/**
	 * An optional filter used to inhibit substitutions
	 * preformed by the GSUB table. This is used for some
	 * "canned" GSUB tables to restrict substitutions to
	 * glyphs that are in the font.
	 */
    LEGlyphFilter *fSubstitutionFilter;

	/**
	 * The four byte script tag.
	 */
    LETag fScriptTag;

	/**
	 * The four byte language tag
	 */
    LETag fLangSysTag;

	/**
	 * This method does the OpenType character processing. It assigns the OpenType feature
	 * tags to the characters, and may generate output characters that differ from the input
	 * charcters dueto insertions, deletions, or reorderings. In such cases, it will also
	 * generate an output character index array reflecting these changes.
	 *
	 * Subclasses must override this method.
	 *
	 * Input parameters:
	 * @param chars - the input character context
	 * @param offset - the index of the first character to process
	 * @param count - the number of characters to process
	 * @param max - the number of characters in the input context
	 * @param rightToLeft - true if the characters are in a right to left directional run
	 *
	 * Output parameters:
	 * @param outChars - the output character array, if different from the input
	 * @param charIndices - the output character index array
	 * @param featureTags - the output feature tag array
	 *
	 * @return the output character count (input character count if no change)
	 */
    virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
            LEUnicode *&outChars, le_int32 *&charIndices, const LETag **&featureTags) /*= 0;*/
	{
		return count;
	};

	/**
	 * This method does character to glyph mapping, and applies the GSUB table. The
	 * default implementation calls mapCharsToGlyphs and then applies the GSUB table,
	 * if there is one.
	 *
	 * Note that in the case of "canned" GSUB tables, the output glyph indices may be
	 * "fake" glyph indices that need to be converted to "real" glyph indices by the
	 * glyphPostProcessing method.
	 *
	 * Input parameters:
	 * @param chars - the input character context
	 * @param offset - the index of the first character to process
	 * @param count - the number of characters to process
	 * @param max - the number of characters in the input context
	 * @param rightToLeft - true if the characters are in a right to left directional run
	 * @param featureTags - the feature tag array
	 *
	 * Output parameters:
	 * @param glyphs - the output glyph index array
	 * @param charIndices - the output character index array
	 *
	 * @return the number of glyphs in the output glyph index array
	 *
	 * Note: if the character index array was already set by the characterProcessing
	 * method, this method won't change it.
	 */
    virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
            const LETag **featureTags, LEGlyphID *&glyphs, le_int32 *&charIndices);

	/**
	 * This method does any processing necessary to convert "fake"
	 * glyph indices used by the glyphProcessing method into "real" glyph
	 * indices which can be used to render the text. Note that in some
	 * cases, such as CDAC Indic fonts, several "real" glyphs may be needed
	 * to render one "fake" glyph.
	 *
	 * The default implementation of this method just returns the input glyph
	 * index and character index arrays, assuming that no "fake" glyph indices
	 * were needed to do GSUB processing.
	 *
	 * Input paramters:
	 * @param tempGlyphs - the input "fake" glyph index array
	 * @param tempCharIndices - the input "fake" character index array
	 * @param tempGlyphCount - the number of "fake" glyph indices
	 *
	 * Output parameters:
	 * @param glyphs - the output glyph index array
	 * @param charIndices - the output character index array
	 *
	 * @return the number of glyph indices in the output glyph index array
	 */
    virtual le_int32 glyphPostProcessing(LEGlyphID tempGlyphs[], le_int32 tempCharIndices[], le_int32 tempGlyphCount,
                    LEGlyphID *&glyphs, le_int32 *&charIndices)
    {
        glyphs = tempGlyphs;
        charIndices = tempCharIndices;

        return tempGlyphCount;
    };

	/**
	 * This method applies the characterProcessing, glyphProcessing and glyphPostProcessing
	 * methods. Most subclasses will not need to override this method.
	 *
	 * Input parameters:
	 * @param chars - the input character context
	 * @param offset - the index of the first character to process
	 * @param count - the number of characters to process
	 * @param max - the number of characters in the input context
	 * @param rightToLeft - true if the text is in a right to left directional run
	 *
	 * Output parameters:
	 * @param glyphs - the glyph index array
	 * @param charIndices - the character index array
	 *
	 * @return the number of glyphs in the glyph index array
	 *
	 * @see LayoutEngine::computeGlyphs
	 */
    virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphID *&glyphs, le_int32 *&charIndices);

	/**
	 * This method uses the GPOS table, if there is one, to adjust the glyph positions.
	 *
	 * Input parameters:
	 * @param glyphs - the input glyph array
	 * @param glyphCount - the number of glyphs in the glyph array
	 * @param x - the starting X position
	 * @param y - the starting Y position
	 *
	 * Output parameters:
	 * @param positions - the output X and Y positions (two entries per glyph)
	 */
    virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphID glyphs[], le_int32 glyphCount, float positions[]);

	/**
	 * This method frees the feature tag array so that the
	 * OpenTypeLayoutEngine can be reused for different text.
	 * It is also called from our destructor.
	 */
    virtual void reset();
};

#endif

