• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  *
4  * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved
5  *
6  */
7 
8 #ifndef __INDICLAYOUTENGINE_H
9 #define __INDICLAYOUTENGINE_H
10 
11 #include "LETypes.h"
12 #include "LEFontInstance.h"
13 #include "LEGlyphFilter.h"
14 #include "LayoutEngine.h"
15 #include "OpenTypeLayoutEngine.h"
16 
17 #include "GlyphSubstitutionTables.h"
18 #include "GlyphDefinitionTables.h"
19 #include "GlyphPositioningTables.h"
20 
21 U_NAMESPACE_BEGIN
22 
23 class MPreFixups;
24 class LEGlyphStorage;
25 
26 /**
27  * This class implements OpenType layout for Indic OpenType fonts, as
28  * specified by Microsoft in "Creating and Supporting OpenType Fonts for
29  * Indic Scripts" (http://www.microsoft.com/typography/otspec/indicot/default.htm)
30  *
31  * This class overrides the characterProcessing method to do Indic character processing
32  * and reordering, and the glyphProcessing method to implement post-GSUB processing for
33  * left matras. (See the MS spec. for more details)
34  *
35  * @internal
36  */
37 class IndicOpenTypeLayoutEngine : public OpenTypeLayoutEngine
38 {
39 public:
40     /**
41      * This is the main constructor. It constructs an instance of IndicOpenTypeLayoutEngine for
42      * a particular font, script and language. It takes the GSUB table as a parameter since
43      * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an
44      * Indic OpenType font.
45      *
46      * @param fontInstance - the font
47      * @param scriptCode - the script
48      * @param langaugeCode - the language
49      * @param gsubTable - the GSUB table
50      * @param success - set to an error code if the operation fails
51      *
52      * @see LayoutEngine::layoutEngineFactory
53      * @see OpenTypeLayoutEngine
54      * @see ScriptAndLangaugeTags.h for script and language codes
55      *
56      * @internal
57      */
58     IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
59                             le_int32 typoFlags, le_bool version2, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success);
60 
61     /**
62      * This constructor is used when the font requires a "canned" GSUB table which can't be known
63      * until after this constructor has been invoked.
64      *
65      * @param fontInstance - the font
66      * @param scriptCode - the script
67      * @param langaugeCode - the language
68      * @param success - set to an error code if the operation fails
69      *
70      * @see OpenTypeLayoutEngine
71      * @see ScriptAndLangaugeTags.h for script and language codes
72      *
73      * @internal
74      */
75     IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
76 			      le_int32 typoFlags, LEErrorCode &success);
77 
78     /**
79      * The destructor, virtual for correct polymorphic invocation.
80      *
81      * @internal
82      */
83    virtual ~IndicOpenTypeLayoutEngine();
84 
85     /**
86      * ICU "poor man's RTTI", returns a UClassID for the actual class.
87      *
88      * @stable ICU 2.8
89      */
90     virtual UClassID getDynamicClassID() const;
91 
92     /**
93      * ICU "poor man's RTTI", returns a UClassID for this class.
94      *
95      * @stable ICU 2.8
96      */
97     static UClassID getStaticClassID();
98 
99 protected:
100 
101     /**
102      * This method does Indic OpenType character processing. It assigns the OpenType feature
103      * tags to the characters, and may generate output characters which have been reordered. For
104      * some Indic scripts, it may also split some vowels, resulting in more output characters
105      * than input characters.
106      *
107      * Input parameters:
108      * @param chars - the input character context
109      * @param offset - the index of the first character to process
110      * @param count - the number of characters to process
111      * @param max - the number of characters in the input context
112      * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run
113      * @param glyphStorage - the glyph storage object. The glyph and character index arrays will be set.
114      *                       the auxillary data array will be set to the feature tags.
115      *
116      * Output parameters:
117      * @param success - set to an error code if the operation fails
118      *
119      * @return the output character count
120      *
121      * @internal
122      */
123     virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
124             LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success);
125 
126     /**
127      * This method does character to glyph mapping, applies the GSUB table and applies
128      * any post GSUB fixups for left matras. It calls OpenTypeLayoutEngine::glyphProcessing
129      * to do the character to glyph mapping, and apply the GSUB table.
130      *
131      * Note that in the case of "canned" GSUB tables, the output glyph indices may be
132      * "fake" glyph indices that need to be converted to "real" glyph indices by the
133      * glyphPostProcessing method.
134      *
135      * Input parameters:
136      * @param chars - the input character context
137      * @param offset - the index of the first character to process
138      * @param count - the number of characters to process
139      * @param max - the number of characters in the input context
140      * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run
141      * @param featureTags - the feature tag array
142      * @param glyphStorage - the glyph storage object. The glyph and char index arrays will be set.
143      *
144      * Output parameters:
145      * @param success - set to an error code if the operation fails
146      *
147      * @return the number of glyphs in the output glyph index array
148      *
149      * Note: if the character index array was already set by the characterProcessing
150      * method, this method won't change it.
151      *
152      * @internal
153      */
154     virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft,
155             LEGlyphStorage &glyphStorage, LEErrorCode &success);
156 
157     le_bool fVersion2;
158 
159 private:
160 
161     MPreFixups *fMPreFixups;
162 
163 };
164 
165 U_NAMESPACE_END
166 #endif
167 
168