fontservices/textshaperplugin/IcuSource/layout/LEInsertionList.cpp
changeset 0 1fb32624e06b
--- /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