home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 13 / AACD13.ISO / AACD / Programming / MR_Classes / Dev / Source / tcpalette / SetAttrs.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-07-15  |  4.0 KB  |  183 lines

  1. #define DEBUG
  2. #include <debug.h>
  3.  
  4. #include "private.h"
  5. #include "protos.h"
  6.  
  7. ULONG Expand(ULONG Value, ULONG Precision);
  8.  
  9.  
  10. ULONG Redraw[]={0, GREDRAW_UPDATE, GREDRAW_REDRAW};
  11.  
  12. ULONG __saveds gad_SetAttrs(Class *C, struct Gadget *Gad, struct opSet *Set)
  13. {
  14.   struct TagItem *tag,*tstate;
  15.   ULONG retval=0,data;
  16.   struct GadData *gdata;
  17.   ULONG redraw=0, update=0;
  18.   
  19.  
  20.   gdata=INST_DATA(C, Gad);
  21.  
  22. //  DKP("SetAttrs()\n");
  23.   
  24.   ProcessTagList(Set->ops_AttrList,tag,tstate)
  25.   {
  26.     data=tag->ti_Data;
  27.     switch(tag->ti_Tag)
  28.     {
  29.       case TCPALETTE_SelectedColor:
  30.         data=min(data,gdata->Pens);
  31.         data=max(0,data);
  32.         gdata->ActivePen=data;
  33.         update=1;
  34.         
  35.         break;
  36.         
  37.       case TCPALETTE_RGBPalette:
  38.         {
  39.           ULONG l;
  40.           struct TCPaletteRGB *rgb;
  41.           
  42.           rgb=(APTR)data;
  43.           
  44.           gdata->UndoLength=0;
  45.           gdata->UndoPen=-1;
  46.           
  47.           for(l=0;l<gdata->Pens;l++)
  48.           {
  49.             gdata->Palette[l]=rgb[l];
  50.           }
  51.           redraw=1;
  52.         }
  53.         break;
  54.  
  55.       case TCPALETTE_LRGBPalette:
  56.         {
  57.           ULONG l;
  58.           struct TCPaletteLRGB *rgb;
  59.           
  60.           rgb=(APTR)data;
  61.           
  62.           gdata->UndoLength=0;
  63.           gdata->UndoPen=-1;
  64.  
  65.           for(l=0;l<gdata->Pens;l++)
  66.           {
  67.             gdata->Palette[l].R=rgb[l].R * 0x01010101;
  68.             gdata->Palette[l].G=rgb[l].G * 0x01010101;
  69.             gdata->Palette[l].B=rgb[l].B * 0x01010101;
  70.           }
  71.           redraw=1;
  72.         }
  73.         break;
  74.  
  75.  
  76.       case TCPALETTE_SelectedRGB:
  77.           i_StoreUndoIfNeeded(C, Gad, (Msg)Set);
  78.           gdata->Palette[gdata->ActivePen]=*((struct TCPaletteRGB *)data);
  79.           update=1;
  80.         break;
  81.         
  82.       case TCPALETTE_SelectedLRGB:
  83.         { 
  84.           struct TCPaletteLRGB *rgb;
  85.  
  86.  
  87.           i_StoreUndoIfNeeded(C, Gad, (Msg)Set);
  88.           rgb=(APTR)&data;
  89.           
  90.           gdata->Palette[gdata->ActivePen].R=rgb->R * 0x01010101;
  91.           gdata->Palette[gdata->ActivePen].G=rgb->G * 0x01010101;
  92.           gdata->Palette[gdata->ActivePen].B=rgb->B * 0x01010101;
  93.           update=1;
  94.         }
  95.         break;
  96.  
  97.       case TCPALETTE_NumColors:
  98.         gdata->Pens=min(data,256);
  99.         gdata->Pens=max(1,gdata->Pens);
  100.         redraw=1;
  101.         break;
  102.         
  103.       case TCPALETTE_ShowSelected:
  104.         gdata->ShowSelected=(data?1:0);
  105.         update=1;
  106.         break;
  107.         
  108.       case TCPALETTE_SelectedRed:
  109.         i_StoreUndoIfNeeded(C, Gad, (Msg)Set);
  110.         gdata->Palette[gdata->ActivePen].R=Expand(data, gdata->Precision);
  111.         update=1;
  112.         break;
  113.       case TCPALETTE_SelectedGreen:
  114.         i_StoreUndoIfNeeded(C, Gad, (Msg)Set);
  115.         gdata->Palette[gdata->ActivePen].G=Expand(data, gdata->Precision);
  116.         update=1;
  117.         break;        
  118.       case TCPALETTE_SelectedBlue:
  119.         i_StoreUndoIfNeeded(C, Gad, (Msg)Set);
  120.         gdata->Palette[gdata->ActivePen].B=Expand(data, gdata->Precision);
  121.         update=1;
  122.         break;
  123.       case TCPALETTE_Precision:
  124.         gdata->Precision=data;
  125.         break;
  126.       
  127.       case TCPALETTE_Orientation:
  128.         gdata->Orientation=data;
  129.         break;
  130.         
  131.       case TCPALETTE_EditMode:
  132.         gdata->EditMode=data;
  133.         gdata->EMPen=gdata->ActivePen;
  134.         update=1;
  135.         break;
  136.       
  137.       case TCPALETTE_Undo:
  138.         i_GetUndo(C, Gad, (Msg)Set);
  139.         redraw=1;
  140.         break;
  141.       
  142.       case GA_Disabled:
  143.         gdata->Disabled=data;
  144.         redraw=1;
  145.         break;
  146.     }
  147.   }
  148.   
  149.   if(redraw | update)
  150.   {
  151.     struct RastPort *rp;
  152.           
  153.     if(rp=ObtainGIRPort(Set->ops_GInfo))
  154.     {
  155.       DoMethod((Object *)Gad,GM_RENDER,Set->ops_GInfo,rp,(redraw?GREDRAW_REDRAW:GREDRAW_UPDATE));
  156.       ReleaseGIRPort(rp);
  157.     }
  158.     
  159.     if(redraw)
  160.     {
  161.       i_Notify(C,Gad,(Msg)Set,0);
  162.     }
  163.   }
  164.   
  165.   return(retval);
  166. }
  167.  
  168. ULONG Expand(ULONG Value, ULONG Precision)
  169. {
  170.   ULONG rv=0;
  171.   LONG l;
  172.  
  173.   Value&=((1<<Precision)-1);
  174.   Value<<=(32-Precision);
  175.   for(l=0;l<32;l+=Precision)
  176.   {
  177.     rv=Value | (rv >> Precision);
  178.   }
  179.   rv=Value | (rv >> Precision);
  180.  
  181.   return(rv);
  182. }
  183.