]>
Commit | Line | Data |
---|---|---|
73c04bcf A |
1 | /* |
2 | * | |
729e4ab9 | 3 | * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved |
73c04bcf A |
4 | * |
5 | * Developed at DIT - Government of Bhutan | |
6 | * | |
7 | * Contact person: Pema Geyleg - <pema_geyleg@druknet.bt> | |
8 | * | |
9 | * This file is a modification of the ICU file KhmerReordering.cpp | |
10 | * by Jens Herden and Javier Sola who have given all their possible rights to IBM and the Governement of Bhutan | |
11 | * A first module for Dzongkha was developed by Karunakar under Panlocalisation funding. | |
12 | * Assistance for this module has been received from Namgay Thinley, Christopher Fynn and Javier Sola | |
13 | * | |
14 | */ | |
15 | ||
16 | ||
17 | #include "OpenTypeLayoutEngine.h" | |
18 | #include "TibetanLayoutEngine.h" | |
19 | #include "LEGlyphStorage.h" | |
20 | #include "TibetanReordering.h" | |
21 | ||
22 | U_NAMESPACE_BEGIN | |
23 | ||
24 | UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TibetanOpenTypeLayoutEngine) | |
25 | ||
26 | TibetanOpenTypeLayoutEngine::TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, | |
729e4ab9 A |
27 | le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success) |
28 | : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success) | |
73c04bcf A |
29 | { |
30 | fFeatureMap = TibetanReordering::getFeatureMap(fFeatureMapCount); | |
31 | fFeatureOrder = TRUE; | |
32 | } | |
33 | ||
34 | TibetanOpenTypeLayoutEngine::TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, | |
729e4ab9 A |
35 | le_int32 typoFlags, LEErrorCode &success) |
36 | : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success) | |
73c04bcf A |
37 | { |
38 | fFeatureMap = TibetanReordering::getFeatureMap(fFeatureMapCount); | |
39 | fFeatureOrder = TRUE; | |
40 | } | |
41 | ||
42 | TibetanOpenTypeLayoutEngine::~TibetanOpenTypeLayoutEngine() | |
43 | { | |
44 | // nothing to do | |
45 | } | |
46 | ||
47 | // Input: characters | |
48 | // Output: characters, char indices, tags | |
49 | // Returns: output character count | |
50 | le_int32 TibetanOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, | |
51 | LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) | |
52 | { | |
53 | if (LE_FAILURE(success)) { | |
54 | return 0; | |
55 | } | |
56 | ||
57 | if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { | |
58 | success = LE_ILLEGAL_ARGUMENT_ERROR; | |
59 | return 0; | |
60 | } | |
61 | ||
62 | le_int32 worstCase = count * 3; // worst case is 3 for Khmer TODO check if 2 is enough | |
63 | ||
64 | outChars = LE_NEW_ARRAY(LEUnicode, worstCase); | |
65 | ||
66 | if (outChars == NULL) { | |
67 | success = LE_MEMORY_ALLOCATION_ERROR; | |
68 | return 0; | |
69 | } | |
70 | ||
71 | glyphStorage.allocateGlyphArray(worstCase, rightToLeft, success); | |
72 | glyphStorage.allocateAuxData(success); | |
73 | ||
74 | if (LE_FAILURE(success)) { | |
75 | LE_DELETE_ARRAY(outChars); | |
76 | return 0; | |
77 | } | |
78 | ||
79 | // NOTE: assumes this allocates featureTags... | |
80 | // (probably better than doing the worst case stuff here...) | |
81 | le_int32 outCharCount = TibetanReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage); | |
82 | ||
83 | glyphStorage.adoptGlyphCount(outCharCount); | |
84 | return outCharCount; | |
85 | } | |
86 | ||
87 | U_NAMESPACE_END |