fontservices/textshaperplugin/IcuSource/layout/LEInsertionList.h
changeset 0 1fb32624e06b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fontservices/textshaperplugin/IcuSource/layout/LEInsertionList.h	Tue Feb 02 02:02:46 2010 +0200
@@ -0,0 +1,171 @@
+/*
+ **********************************************************************
+ *   Copyright (C) 1998-2004, International Business Machines
+ *   Corporation and others.  All Rights Reserved.
+ **********************************************************************
+ */
+
+#ifndef __LEINSERTIONLIST_H
+#define __LEINSERTIONLIST_H
+
+#include "LETypes.h"
+
+U_NAMESPACE_BEGIN
+
+struct InsertionRecord;
+
+/**
+ * This class encapsulates the callback used by <code>LEInsertionList</code>
+ * to apply an insertion from the insertion list.
+ *
+ * @internal
+ */
+class LEInsertionCallback
+{
+public:
+    /**
+     * This method will be called by <code>LEInsertionList::applyInsertions</code> for each
+     * entry on the insertion list.
+     *
+     * @param atPosition the position of the insertion
+     * @param count the number of glyphs to insert
+     * @param newGlyphs the address of the glyphs to insert
+     *
+     * @return <code>TRUE</code> if <code>LEInsertions::applyInsertions</code> should
+     *         stop after applying this insertion.
+     *
+     * @internal
+     */
+    virtual le_bool applyInsertion(le_int32 atPosition, le_int32 count, LEGlyphID newGlyphs[]) = 0;
+};
+
+/**
+ * This class is used to keep track of insertions to an array of
+ * <code>LEGlyphIDs</code>. The insertions are kept on a linked
+ * list of <code>InsertionRecords</code> so that the glyph array
+ * doesn't have to be grown for each insertion. The insertions are
+ * stored on the list from leftmost to rightmost to make it easier
+ * to do the insertions.
+ *
+ * The insertions are applied to the array by calling the
+ * <code>applyInsertions</code> method, which calls a client
+ * supplied <code>LEInsertionCallback</code> object to actually
+ * apply the individual insertions.
+ *
+ * @internal
+ */
+class LEInsertionList : public UObject
+{
+public:
+    /**
+     * Construct an empty insertion list.
+     *
+     * @param rightToLeft <code>TRUE</code> if the glyphs are stored
+     *                    in the array in right to left order.
+     *
+     * @internal
+     */
+    LEInsertionList(le_bool rightToLeft);
+
+    /**
+     * The destructor.
+     */
+    ~LEInsertionList();
+
+    /**
+     * Add an entry to the insertion list.
+     *
+     * @param position the glyph at this position in the array will be
+     *                 replaced by the new glyphs.
+     * @param count the number of new glyphs
+     * @param success set to an error code if the auxillary data cannot be retrieved.
+     *
+     * @return the address of an array in which to store the new glyphs. This will
+     *         <em>not</em> be in the glyph array.
+     *
+     * @internal
+     */
+    LEGlyphID *insert(le_int32 position, le_int32 count,
+        LEErrorCode &success);
+
+    /**
+     * Return the number of new glyphs that have been inserted.
+     *
+     * @return the number of new glyphs which have been inserted
+     *
+     * @internal
+     */
+    le_int32 getGrowAmount();
+
+    /**
+     * Call the <code>LEInsertionCallback</code> once for each
+     * entry on the insertion list.
+     *
+     * @param callback the <code>LEInsertionCallback</code> to call for each insertion.
+     *
+     * @return <code>TRUE</code> if <code>callback</code> returned <code>TRUE</code> to
+     *         terminate the insertion list processing.
+     *
+     * @internal
+     */
+    le_bool applyInsertions(LEInsertionCallback *callback);
+
+    /**
+     * Empty the insertion list and free all associated
+     * storage.
+     *
+     * @internal
+     */
+    void reset();
+
+    /**
+     * ICU "poor man's RTTI", returns a UClassID for the actual class.
+     *
+     * @stable ICU 2.8
+     */
+    virtual UClassID getDynamicClassID() const;
+
+    /**
+     * ICU "poor man's RTTI", returns a UClassID for this class.
+     *
+     * @stable ICU 2.8
+     */
+    static UClassID getStaticClassID();
+
+private:
+
+    /**
+     * The head of the insertion list.
+     *
+     * @internal
+     */
+    InsertionRecord *head;
+
+    /**
+     * The tail of the insertion list.
+     *
+     * @internal
+     */
+    InsertionRecord *tail;
+
+    /**
+     * The total number of new glyphs on the insertion list.
+     *
+     * @internal
+     */
+    le_int32 growAmount;
+
+    /**
+     * Set to <code>TRUE</code> if the glyphs are in right
+     * to left order. Since we want the rightmost insertion
+     * to be first on the list, we need to append the
+     * insertions in this case. Otherwise they're prepended.
+     *
+     * @internal
+     */
+    le_bool  append;
+};
+
+U_NAMESPACE_END
+#endif
+