home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 13 / AACD13.ISO / AACD / Programming / MR_Classes / Dev / Source / tcpalette / Undo.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-08-04  |  1.6 KB  |  88 lines

  1. #define DEBUG
  2. #include <debug.h>
  3.  
  4. #include "private.h"
  5. #include "protos.h"
  6.  
  7. #include <string.h>
  8.  
  9. LONG i_StoreUndoIfNeeded(Class *C, struct Gadget *Gad, Msg M)
  10. {
  11.   struct GadData *gdata;
  12.   
  13.   gdata=INST_DATA(C, Gad);
  14.   
  15.   if(gdata->UndoPen != gdata->ActivePen)
  16.   {
  17.     //DKP("Changing Undopen\n");
  18.     gdata->UndoPenSaved=0;
  19.     gdata->UndoPen=gdata->ActivePen;
  20.     gdata->UndoPenRGB=gdata->Palette[gdata->ActivePen];
  21.   }
  22.   
  23.   if(memcmp(&gdata->Palette[gdata->ActivePen], &gdata->UndoPenRGB, sizeof(gdata->UndoPenRGB)) &&
  24.      (gdata->UndoPenSaved==0))
  25.   {
  26.     //DKP("Adding Undo\n");
  27.     gdata->UndoPenSaved=1;
  28.     i_AddUndo(gdata, gdata->ActivePen, &gdata->UndoPenRGB, 0);
  29.     i_NotifyUndo(C,Gad,M,0);
  30.   }
  31.   return(1);
  32. }
  33.  
  34.  
  35. LONG i_AddUndo(struct GadData *gdata, ULONG Pen, struct TCPaletteRGB *RGB, ULONG Linked)
  36. {
  37.   UBYTE x;
  38.  
  39.   //DKP("i_AddUndo Pen=%ld Linked=%ld\n",Pen,Linked);
  40.  
  41.   x=gdata->UndoStart;
  42.  
  43.   gdata->UndoStart++;
  44.   
  45.   if(gdata->UndoLength<255)
  46.   {
  47.     gdata->UndoLength++;
  48.   }
  49.  
  50.   if(RGB)    
  51.     gdata->UndoPalette[x]=*RGB;
  52.   else
  53.     gdata->UndoPalette[x]=gdata->Palette[Pen];
  54.     
  55.   gdata->UndoLinked[x]=Linked;
  56.   gdata->UndoPenNumber[x]=Pen;
  57.   
  58.   return(1);
  59. }
  60.  
  61. LONG i_GetUndo(Class *C, struct Gadget *Gad, Msg M)
  62. {
  63.   struct GadData *gdata;
  64.   UBYTE x,go;
  65.   
  66.   gdata=INST_DATA(C, Gad);
  67.  
  68.   gdata->UndoPen=-1;
  69.  
  70.   if(gdata->UndoLength)
  71.   {
  72.     x=gdata->UndoStart-1;
  73.     do 
  74.     {
  75.       go=gdata->UndoLinked[x];
  76.       gdata->Palette[gdata->UndoPenNumber[x]]=gdata->UndoPalette[x];
  77.       gdata->UndoLinked[x]=0;
  78.       gdata->UndoLength--;
  79.       x--;
  80.     } while(go);
  81.     gdata->UndoStart=x+1;
  82.   }
  83.   
  84.   i_NotifyUndo(C,Gad,M,0);  
  85.   
  86.   return(1);
  87. }
  88.