rework undo compression, add shift viewer overwr/copy/clip/splice, fix paste edl...
[goodguy/history.git] / cinelerra-5.1 / cinelerra / undostack.h
index 9fbbd0052ea680d5572a1f4015dafffcd31e4d9e..e6791d0a27d65441a6d3073272f047b22fb15a63 100644 (file)
@@ -2,21 +2,21 @@
 /*
  * CINELERRA
  * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
 /*
  * CINELERRA
  * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
+ *
  */
 
 #ifndef UNDOSTACK_H
  */
 
 #ifndef UNDOSTACK_H
 #define UNDOLEVELS 500
 #define UNDO_KEY_INTERVAL 100
 
 #define UNDOLEVELS 500
 #define UNDO_KEY_INTERVAL 100
 
-// The undo stack is a series of key undo buffers and
-// incremental undo buffers.  The incremental buffers
-// store the differences in the most compact way possible:
-// a series of offsets, sizes and values.  This should allow
-// a huge number of undo updates.
+
+#define hash_sz2 8
+#define hash_sz  (1<<hash_sz2)
+#define hash_sz1 (hash_sz-1)
+#define va 0
+#define vb 1
+
+class UndoHash
+{
+public:
+       UndoHash(char *txt, int len, UndoHash *nxt);
+       ~UndoHash();
+
+       UndoHash *nxt;
+       char *txt;  int len;
+       int line[2], occurs[2];
+};
+
+class UndoHashTable
+{
+public:
+       UndoHashTable();
+       ~UndoHashTable();
+       UndoHash *add(char *txt, int len);
+
+       UndoHash *table[hash_sz];
+       UndoHash *bof, *eof;
+};
+
+class UndoLine
+{
+public:
+       UndoLine(UndoHash *hash);
+       UndoLine(UndoHashTable *hash, char *txt, int len);
+       ~UndoLine();
+       int eq(UndoLine *ln);
+
+       char *txt;  int len;
+       UndoHash *hash;
+};
+
+class UndoVersion : public ArrayList<UndoLine *>
+{
+public:
+       UndoVersion(int v) { ver = v; }
+       ~UndoVersion() { remove_all_objects(); }
+       int ver;
+
+       void scan_lines(UndoHashTable *hash, char *sp, char *ep);
+};
 
 
 class UndoStackItem : public ListItem<UndoStackItem>
 
 
 class UndoStackItem : public ListItem<UndoStackItem>
@@ -56,15 +101,9 @@ public:
 // The string must be deleted by the user.
        char* get_data();
        char* get_filename();
 // The string must be deleted by the user.
        char* get_data();
        char* get_filename();
-       int has_data();
        int get_size();
        int is_key();
        uint64_t get_flags();
        int get_size();
        int is_key();
        uint64_t get_flags();
-       
-
-// Get pointer to incremental data for use in an apply_difference command.
-       char* get_incremental_data();
-       int get_incremental_size();
 
        void set_creator(void *creator);
        void* get_creator();
 
        void set_creator(void *creator);
        void* get_creator();
@@ -78,7 +117,7 @@ private:
 
 // type of modification
        uint64_t load_flags;
 
 // type of modification
        uint64_t load_flags;
-       
+
 // data after the modification for redos
        char *data;
        int data_size;
 // data after the modification for redos
        char *data;
        int data_size;
@@ -94,22 +133,22 @@ class UndoStack : public List<UndoStackItem>
 public:
        UndoStack();
        ~UndoStack();
 public:
        UndoStack();
        ~UndoStack();
-       
+
+// get current undo/redo stack item
+       UndoStackItem *get_current_undo();
+       UndoStackItem *get_current_redo();
+
 // Create a new undo entry and put on the stack.
 // The current pointer points to the new entry.
 // delete future undos if in the middle
 // delete undos older than UNDOLEVELS if last
        UndoStackItem* push();
 
 // Create a new undo entry and put on the stack.
 // The current pointer points to the new entry.
 // delete future undos if in the middle
 // delete undos older than UNDOLEVELS if last
        UndoStackItem* push();
 
-// move to the previous undo entry
-       void pull();
-
-
 // move to the next undo entry for a redo
        UndoStackItem* pull_next();
 
        void dump(FILE *fp=stdout);
 // move to the next undo entry for a redo
        UndoStackItem* pull_next();
 
        void dump(FILE *fp=stdout);
-       
+
        UndoStackItem* current;
 };
 
        UndoStackItem* current;
 };