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

#ifndef __ARABICLAYOUTENGINE_H
#define __ARABICLAYOUTENGINE_H

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

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

/**
 * This class implements OpenType layout for Arabic fonts. It overrides
 * the characerProcessing method to assign the correct OpenType feature
 * tags for the Arabic contextual forms. It also overrides the adjustGlyphPositions
 * method to guarantee that all vowel and accent glyphs have zero advance width.
 */
class ArabicOpenTypeLayoutEngine : public OpenTypeLayoutEngine
{
public:
	/**
	 * This is the main constructor. It constructs an instance of ArabicOpenTypeLayoutEngine 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
	 * Indic OpenType font.
	 *
	 * @param fontInstance - the font
	 * @param scriptCode - the script
	 * @param langaugeCode - the language
	 * @param gsubTable - the GSUB table
	 *
	 * @see LayoutEngine::layoutEngineFactory
	 * @see OpenTypeLayoutEngine
	 * @see ScriptAndLangaugeTags.h for script and language codes
	 */
    ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
                            const 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
	 *
	 * @see OpenTypeLayoutEngine
	 * @see ScriptAndLangaugeTags.h for script and language codes
	 */
    ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode);

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

protected:

	/**
	 * This method does Arabic OpenType character processing. It assigns the OpenType feature
	 * tags to the characters to generate the correct contextual forms and ligatures.
	 *
	 * 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 arrayt
	 * @param charIndices - the output character index array
	 * @param featureTags - the output feature tag array
	 * @param success - set to an error code if the operation fails
	 *
	 * @return the output character count
	 */
    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, LEErrorCode &success);

	/**
	 * This method applies the GPOS table if it is present, otherwise it ensures that all vowel
	 * and accent glyphs have a zero advance width by calling the adjustMarkGlyphs method.
	 * If the font contains a GDEF table, that is used to identify voewls and accents. Otherwise
	 * the character codes are used.
	 *
	 * @param chars - the input character context
	 * @param offset - the offset of the first character to process
	 * @param count - the number of characters to process
	 * @param reverse - true if the glyphs in the glyph array have been reordered
	 * @param glyphs - the input glyph array
	 * @param glyphCount - the number of glyphs
	 * @param positions - the position array, will be updated as needed
	 * @param success - output parameter set to an error code if the operation fails
	 */
    virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphID glyphs[], le_int32 glyphCount, float positions[], LEErrorCode &success);
};

/**
 * The class implements OpenType layout for Arabic fonts which don't
 * contain a GSUB table, using a canned GSUB table based on Unicode
 * Arabic Presentation Forms. It overrides the mapCharsToGlyphs method
 * to use the Presentation Forms as logical glyph indices. It overrides the
 * glyphPostProcessing method to convert the Presentation Forms to actual
 * glyph indices.
 *
 * @see ArabicOpenTypeLayoutEngine
 */
class UnicodeArabicOpenTypeLayoutEngine : public ArabicOpenTypeLayoutEngine
{
public:
	/**
	 * This constructs an instance of UnicodeArabicOpenTypeLayoutEngine for a specific font,
	 * script and language.
	 *
	 * @param fontInstance - the font
	 * @param scriptCode - the script
	 * @param languageCode - the language
	 *
	 * @see LEFontInstance
	 * @see ScriptAndLanguageTags.h for script and language codes
	 */
    UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode);

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

protected:

	/**
	 * This method converts the Arabic Presentation Forms in the temp glyph array
	 * into actual glyph indices using ArabicOpenTypeLayoutEngine::mapCharsToGlyps.
	 *
	 * Input paramters:
	 * @param tempGlyphs - the input presentation forms
	 * @param tempCharIndices - the input character index array
	 * @param tempGlyphCount - the number of Presentation Froms
	 *
	 * Output parameters:
	 * @param glyphs - the output glyph index array
	 * @param charIndices - the output character index array
	 * @param success - set to an error code if the operation fails
	 *
	 * @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, LEErrorCode &success);

	/**
	 * This method copies the input characters into the output glyph index array,
	 * for use by the canned GSUB table. It also generates the character index array.
	 *
	 * Input parameters:
	 * @param chars - the input character context
	 * @param offset - the offset of the first character to be mapped
	 * @param count - the number of characters to be mapped
	 * @param reverse - if true, the output will be in reverse order
	 * @param mirror - if true, do character mirroring
	 *
	 * Output parameters:
	 * @param glyphs - the glyph array
	 * @param charIndices - the character index array
	 * @param success - set to an error code if the operation fails
	 */
    virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror,
        LEGlyphID *&glyphs, le_int32 *&charIndices, LEErrorCode &success);

	/**
	 * This method ensures that all vowel and accent glyphs have a zero advance width by calling
	 * the adjustMarkGlyphs method. The character codes are used to identify the vowel and mark
	 * glyphs.
	 *
	 * @param chars - the input character context
	 * @param offset - the offset of the first character to process
	 * @param count - the number of characters to process
	 * @param reverse - true if the glyphs in the glyph array have been reordered
	 * @param glyphs - the input glyph array
	 * @param glyphCount - the number of glyphs
	 * @param positions - the position array, will be updated as needed
	 * @param success - output parameter set to an error code if the operation fails
	 */
    virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphID glyphs[], le_int32 glyphCount, float positions[], LEErrorCode &success);
};

#endif

