--- /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