3 * (C) Copyright IBM Corp. 2002-2008 - All Rights Reserved
8 #include "LEGlyphStorage.h"
9 #include "MPreFixups.h"
19 MPreFixups::MPreFixups(le_int32 charCount
)
20 : fFixupData(NULL
), fFixupCount(0)
22 fFixupData
= LE_NEW_ARRAY(FixupData
, charCount
);
25 MPreFixups::~MPreFixups()
27 LE_DELETE_ARRAY(fFixupData
);
31 void MPreFixups::add(le_int32 baseIndex
, le_int32 mpreIndex
)
33 // NOTE: don't add the fixup data if the mpre is right
34 // before the base consonant glyph.
35 if (baseIndex
- mpreIndex
> 1) {
36 fFixupData
[fFixupCount
].fBaseIndex
= baseIndex
;
37 fFixupData
[fFixupCount
].fMPreIndex
= mpreIndex
;
43 void MPreFixups::apply(LEGlyphStorage
&glyphStorage
, LEErrorCode
& success
)
45 if (LE_FAILURE(success
)) {
49 for (le_int32 fixup
= 0; fixup
< fFixupCount
; fixup
+= 1) {
50 le_int32 baseIndex
= fFixupData
[fixup
].fBaseIndex
;
51 le_int32 mpreIndex
= fFixupData
[fixup
].fMPreIndex
;
52 le_int32 mpreLimit
= mpreIndex
+ 1;
54 while (glyphStorage
[baseIndex
] == 0xFFFF || glyphStorage
[baseIndex
] == 0xFFFE) {
58 while (glyphStorage
[mpreLimit
] == 0xFFFF || glyphStorage
[mpreLimit
] == 0xFFFE) {
62 if (mpreLimit
== baseIndex
) {
66 LEErrorCode success
= LE_NO_ERROR
;
67 le_int32 mpreCount
= mpreLimit
- mpreIndex
;
68 le_int32 moveCount
= baseIndex
- mpreLimit
;
69 le_int32 mpreDest
= baseIndex
- mpreCount
;
70 LEGlyphID
*mpreSave
= LE_NEW_ARRAY(LEGlyphID
, mpreCount
);
71 le_int32
*indexSave
= LE_NEW_ARRAY(le_int32
, mpreCount
);
73 if (mpreSave
== NULL
|| indexSave
== NULL
) {
74 LE_DELETE_ARRAY(mpreSave
);
75 LE_DELETE_ARRAY(indexSave
);
76 success
= LE_MEMORY_ALLOCATION_ERROR
;
82 for (i
= 0; i
< mpreCount
; i
+= 1) {
83 mpreSave
[i
] = glyphStorage
[mpreIndex
+ i
];
84 indexSave
[i
] = glyphStorage
.getCharIndex(mpreIndex
+ i
, success
); //charIndices[mpreIndex + i];
87 for (i
= 0; i
< moveCount
; i
+= 1) {
88 LEGlyphID glyph
= glyphStorage
[mpreLimit
+ i
];
89 le_int32 charIndex
= glyphStorage
.getCharIndex(mpreLimit
+ i
, success
);
91 glyphStorage
[mpreIndex
+ i
] = glyph
;
92 glyphStorage
.setCharIndex(mpreIndex
+ i
, charIndex
, success
);
95 for (i
= 0; i
< mpreCount
; i
+= 1) {
96 glyphStorage
[mpreDest
+ i
] = mpreSave
[i
];
97 glyphStorage
.setCharIndex(mpreDest
, indexSave
[i
], success
);
100 LE_DELETE_ARRAY(indexSave
);
101 LE_DELETE_ARRAY(mpreSave
);