summaryrefslogtreecommitdiff
path: root/Build/source/libs/icu/icu-4.6/layout/LEInsertionList.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/icu/icu-4.6/layout/LEInsertionList.cpp')
-rw-r--r--Build/source/libs/icu/icu-4.6/layout/LEInsertionList.cpp96
1 files changed, 96 insertions, 0 deletions
diff --git a/Build/source/libs/icu/icu-4.6/layout/LEInsertionList.cpp b/Build/source/libs/icu/icu-4.6/layout/LEInsertionList.cpp
new file mode 100644
index 00000000000..c64b8a198dc
--- /dev/null
+++ b/Build/source/libs/icu/icu-4.6/layout/LEInsertionList.cpp
@@ -0,0 +1,96 @@
+/*
+ **********************************************************************
+ * Copyright (C) 1998-2008, 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 == NULL) {
+ 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