diff -r 000000000000 -r 1fb32624e06b fontservices/textshaperplugin/IcuSource/layout/LEInsertionList.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fontservices/textshaperplugin/IcuSource/layout/LEInsertionList.cpp Tue Feb 02 02:02:46 2010 +0200 @@ -0,0 +1,98 @@ +/* + ********************************************************************** + * Copyright (C) 1998-2004, International Business Machines + * Corporation and others. All Rights Reserved. + ********************************************************************** + */ + +#include "LETypes.h" +#include "LEInsertionList.h" + +U_NAMESPACE_BEGIN + +#define ANY_NUMBER 1 + +struct InsertionRecord +{ + InsertionRecord *next; + le_int32 position; + le_int32 count; + LEGlyphID glyphs[ANY_NUMBER]; +}; + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEInsertionList) + +LEInsertionList::LEInsertionList(le_bool rightToLeft) +: head(NULL), tail(NULL), growAmount(0), append(rightToLeft) +{ + tail = (InsertionRecord *) &head; +} + +LEInsertionList::~LEInsertionList() +{ + reset(); +} + +void LEInsertionList::reset() +{ + while (head != NULL) { + InsertionRecord *record = head; + + head = head->next; + LE_DELETE_ARRAY(record); + } + + tail = (InsertionRecord *) &head; + growAmount = 0; +} + +le_int32 LEInsertionList::getGrowAmount() +{ + return growAmount; +} + +LEGlyphID *LEInsertionList::insert(le_int32 position, le_int32 count, + LEErrorCode &success) +{ + if (LE_FAILURE(success)) { + return 0; + } + + InsertionRecord *insertion = (InsertionRecord *) LE_NEW_ARRAY(char, sizeof(InsertionRecord) + (count - ANY_NUMBER) * sizeof (LEGlyphID)); + + if (!insertion) { + success = LE_MEMORY_ALLOCATION_ERROR; + return 0; + } + + insertion->position = position; + insertion->count = count; + + growAmount += count - 1; + + if (append) { + // insert on end of list... + insertion->next = NULL; + tail->next = insertion; + tail = insertion; + } else { + // insert on front of list... + insertion->next = head; + head = insertion; + } + + return insertion->glyphs; +} + +le_bool LEInsertionList::applyInsertions(LEInsertionCallback *callback) +{ + for (InsertionRecord *rec = head; rec != NULL; rec = rec->next) { + if (callback->applyInsertion(rec->position, rec->count, rec->glyphs)) { + return TRUE; + } + } + + return FALSE; +} + +U_NAMESPACE_END