os/textandloc/fontservices/textshaperplugin/IcuSource/layout/MPreFixups.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/*
sl@0
     2
 *
sl@0
     3
 * (C) Copyright IBM Corp. 2002-2004 - All Rights Reserved
sl@0
     4
 *
sl@0
     5
 */
sl@0
     6
sl@0
     7
#include "LETypes.h"
sl@0
     8
#include "LEGlyphStorage.h"
sl@0
     9
#include "MPreFixups.h"
sl@0
    10
sl@0
    11
U_NAMESPACE_BEGIN
sl@0
    12
sl@0
    13
struct FixupData
sl@0
    14
{
sl@0
    15
    le_int32 fBaseIndex;
sl@0
    16
    le_int32 fMPreIndex;
sl@0
    17
};
sl@0
    18
sl@0
    19
MPreFixups::MPreFixups(le_int32 charCount)
sl@0
    20
    : fFixupData(NULL), fFixupCount(0)
sl@0
    21
{
sl@0
    22
    fFixupData = LE_NEW_ARRAY(FixupData, charCount);
sl@0
    23
}
sl@0
    24
sl@0
    25
MPreFixups::~MPreFixups()
sl@0
    26
{
sl@0
    27
    LE_DELETE_ARRAY(fFixupData);
sl@0
    28
    fFixupData = NULL;
sl@0
    29
}
sl@0
    30
sl@0
    31
void MPreFixups::add(le_int32 baseIndex, le_int32 mpreIndex)
sl@0
    32
{
sl@0
    33
    // NOTE: don't add the fixup data if the mpre is right
sl@0
    34
    // before the base consonant glyph.
sl@0
    35
    if (baseIndex - mpreIndex > 1) {
sl@0
    36
        fFixupData[fFixupCount].fBaseIndex = baseIndex;
sl@0
    37
        fFixupData[fFixupCount].fMPreIndex = mpreIndex;
sl@0
    38
sl@0
    39
        fFixupCount += 1;
sl@0
    40
    }
sl@0
    41
}
sl@0
    42
sl@0
    43
void MPreFixups::apply(LEGlyphStorage &glyphStorage, LEErrorCode& success)
sl@0
    44
{
sl@0
    45
    if (LE_FAILURE(success)) {
sl@0
    46
        return;
sl@0
    47
    }
sl@0
    48
sl@0
    49
    for (le_int32 fixup = 0; fixup < fFixupCount; fixup += 1) {
sl@0
    50
        le_int32 baseIndex = fFixupData[fixup].fBaseIndex;
sl@0
    51
        le_int32 mpreIndex = fFixupData[fixup].fMPreIndex;
sl@0
    52
        le_int32 mpreLimit = mpreIndex + 1;
sl@0
    53
sl@0
    54
        while (glyphStorage[baseIndex] == 0xFFFF || glyphStorage[baseIndex] == 0xFFFE) {
sl@0
    55
            baseIndex -= 1;
sl@0
    56
        }
sl@0
    57
sl@0
    58
        while (glyphStorage[mpreLimit] == 0xFFFF || glyphStorage[mpreLimit] == 0xFFFE) {
sl@0
    59
            mpreLimit += 1;
sl@0
    60
        }
sl@0
    61
sl@0
    62
        if (mpreLimit == baseIndex) {
sl@0
    63
            continue;
sl@0
    64
        }
sl@0
    65
sl@0
    66
        LEErrorCode success = LE_NO_ERROR;
sl@0
    67
        le_int32   mpreCount = mpreLimit - mpreIndex;
sl@0
    68
        le_int32   moveCount = baseIndex - mpreLimit;
sl@0
    69
        le_int32   mpreDest  = baseIndex - mpreCount;
sl@0
    70
        LEGlyphID *mpreSave  = LE_NEW_ARRAY(LEGlyphID, mpreCount);
sl@0
    71
        le_int32  *indexSave = LE_NEW_ARRAY(le_int32, mpreCount);
sl@0
    72
        if (!mpreSave || !indexSave) {
sl@0
    73
            LE_DELETE_ARRAY(mpreSave);
sl@0
    74
            LE_DELETE_ARRAY(indexSave);
sl@0
    75
            success = LE_MEMORY_ALLOCATION_ERROR;
sl@0
    76
            return;
sl@0
    77
        }
sl@0
    78
        le_int32   i;
sl@0
    79
sl@0
    80
        for (i = 0; i < mpreCount; i += 1) {
sl@0
    81
            mpreSave[i]  = glyphStorage[mpreIndex + i];
sl@0
    82
            indexSave[i] = glyphStorage.getCharIndex(mpreIndex + i, success); //charIndices[mpreIndex + i];
sl@0
    83
        }
sl@0
    84
sl@0
    85
        for (i = 0; i < moveCount; i += 1) {
sl@0
    86
            LEGlyphID glyph = glyphStorage[mpreLimit + i];
sl@0
    87
            le_int32 charIndex = glyphStorage.getCharIndex(mpreLimit + i, success);
sl@0
    88
sl@0
    89
            glyphStorage[mpreIndex + i] = glyph;
sl@0
    90
            glyphStorage.setCharIndex(mpreIndex + i, charIndex, success);
sl@0
    91
        }
sl@0
    92
sl@0
    93
        for (i = 0; i < mpreCount; i += 1) {
sl@0
    94
            glyphStorage[mpreDest + i] = mpreSave[i];
sl@0
    95
            glyphStorage.setCharIndex(mpreDest, indexSave[i], success);
sl@0
    96
        }
sl@0
    97
        
sl@0
    98
        LE_DELETE_ARRAY(indexSave);
sl@0
    99
        LE_DELETE_ARRAY(mpreSave);
sl@0
   100
    }
sl@0
   101
}
sl@0
   102
sl@0
   103
U_NAMESPACE_END