home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / dirs / rramdisk_451.lzh / 'Liner / Source / color.c < prev    next >
C/C++ Source or Header  |  1991-02-06  |  7KB  |  282 lines

  1. /*Color.c*/
  2. /*Puts up a color requestor to get the screen colors for 'Liner*/
  3.  
  4. #include <exec/types.h>
  5. #include <intuition/intuition.h>
  6. #include <exec/exec.h>
  7. #include <graphics/displayinfo.h>
  8. #include <utility/tagitem.h>
  9. #include <libraries/gadtools.h>
  10.  
  11. extern struct TextAttr Topaz;
  12.  
  13. #include "ColorWdw.h"
  14.  
  15. struct IntuitionBase *IntuitionBase;
  16. struct GfxBase *GfxBase;
  17.  
  18. struct Window *Wdw;
  19.  
  20. #define Rp Wdw->RPort
  21. #define Vp Wdw->WScreen->ViewPort
  22.  
  23. #define RED 1
  24. #define GREEN 2
  25. #define BLUE 3
  26.  
  27. #define SLIDER_WIDTH_15KHZ 4096
  28. #define SLIDER_WIDTH_31KHZ 16383
  29.  
  30. #define SLIDER_MULT_15KHZ 4369
  31. #define SLIDER_MULT_31KHZ 21845
  32.  
  33. extern ColorReq();
  34. void UpdateColorReg();
  35. void RestoreColors();
  36. void SetSliders();
  37.  
  38. struct TagItem bbTag[]=
  39. {
  40.    {GT_VisualInfo,NULL},
  41.    {TAG_DONE,NULL}
  42. };
  43.  
  44.  
  45. ColorReq(Scrn,Type,VisInfo)
  46. struct Screen *Scrn;
  47. ULONG Type;
  48. APTR VisInfo;
  49. {
  50.    struct Gadget *it;
  51.    struct PropInfo *prop;
  52.  
  53.    ULONG Class;
  54.    SHORT MouseX;
  55.    USHORT color=0;
  56.    struct IntuiMessage *mesg;
  57.    USHORT CurrentGadget;
  58.    USHORT Colors[4];
  59.    ULONG OldColors[4];
  60.    UWORD SliderMult;
  61.    struct textFont *Topaz_tf;
  62.    UWORD Y_Add;
  63.    UBYTE DivBy;
  64.    struct Gadget *IAGadget;
  65.    BYTE c;
  66.  
  67.    ULONG rgb;
  68.  
  69.       /*Make room for the title bar*/
  70.    NewWindowStructure1.Height+=(Y_Add=Scrn->Font->ta_YSize-Topaz.ta_YSize);
  71.  
  72.    NewWindowStructure1.Type=CUSTOMSCREEN;
  73.    NewWindowStructure1.Screen=(struct Screen *)Scrn;
  74.  
  75.    Topaz_tf=(struct textFont *)OpenFont(&Topaz);
  76.  
  77.    if(Topaz_tf == NULL)    /*If topaz 8 couldn't be opened*/
  78.       return(FALSE);       /*The machine deserves to crash :-) */
  79.  
  80.    MakeButtonGadgets(&ColorBar,&Reset,VisInfo,&Topaz,1,Y_Add);
  81.  
  82.    BlueSlider.TopEdge+=Y_Add;
  83.    RedSlider.TopEdge+=Y_Add;
  84.    GreenSlider.TopEdge+=Y_Add;
  85.  
  86.    if(Type & VGA_MONITOR_ID) /*If productivity mode*/
  87.    {        /*Give the users the more limited color choices*/
  88.       DivBy=4;
  89.       SliderMult=SLIDER_MULT_31KHZ;
  90.       GreenSliderSInfo.HorizBody=RedSliderSInfo.HorizBody=
  91.         BlueSliderSInfo.HorizBody=SLIDER_WIDTH_31KHZ;
  92.    }
  93.    else
  94.    {
  95.       DivBy=1;
  96.       SliderMult=SLIDER_MULT_15KHZ;
  97.       GreenSliderSInfo.HorizBody=RedSliderSInfo.HorizBody=
  98.         BlueSliderSInfo.HorizBody=SLIDER_WIDTH_15KHZ;
  99.    }
  100.  
  101.    Wdw=(struct Window *)OpenWindow(&NewWindowStructure1);
  102.    if(Wdw==NULL)
  103.       return(FALSE);
  104.  
  105.    NewWindowStructure1.Height-=Y_Add;
  106.  
  107.    SetFont(Wdw->RPort,Topaz_tf);
  108.    bbTag[0].ti_Data=(Tag)VisInfo;
  109.  
  110.       /*Draw bevel boxes around various parts of the window*/
  111.    DrawBevelBoxA(Wdw->RPort,35,38+Y_Add,192,11,bbTag);
  112.    DrawBevelBoxA(Wdw->RPort,35,27+Y_Add,192,11,bbTag);
  113.    DrawBevelBoxA(Wdw->RPort,35,16+Y_Add,192,11,bbTag);
  114.    DrawBevelBoxA(Wdw->RPort,286,15+Y_Add,29,35,bbTag);
  115.    DrawBevelBoxA(Wdw->RPort,7,51+Y_Add,262,16,bbTag);
  116.  
  117.       /*Draws the four screen colors (so the user can select which*/
  118.       /*one he wants to change.  Rather useful...*/
  119.    SetAPen(Rp,1);
  120.    RectFill(Rp,9+64,53+Y_Add,9+127,64+Y_Add);
  121.    SetAPen(Rp,2);
  122.    RectFill(Rp,9+128,53+Y_Add,9+191,64+Y_Add);
  123.    SetAPen(Rp,3);
  124.    RectFill(Rp,9+192,53+Y_Add,9+255,64+Y_Add);
  125.    PrintIText(Rp,&IntuiTextList1,0,Y_Add);
  126.  
  127.       /*Store the colors before we do anything*/
  128.    for(c=0;c<4;c++)
  129.       OldColors[c]=GetRGB4(Vp.ColorMap,c);
  130.  
  131.    rgb=GetRGB4(Vp.ColorMap,0);
  132.  
  133.    SetSliders(Colors,SliderMult,rgb,DivBy);
  134.  
  135.    UpdateNum(RED,Colors[RED],Y_Add,DivBy);
  136.    UpdateNum(GREEN,Colors[GREEN],Y_Add,DivBy);
  137.    UpdateNum(BLUE,Colors[BLUE],Y_Add,DivBy);
  138.  
  139.    RefreshGadgets(&RedSlider,Wdw,NULL);
  140.  
  141.    for(;;)
  142.    {
  143.       Wait(1<<Wdw->UserPort->mp_SigBit);
  144.       while((mesg=(struct IntuiMessage *)GetMsg(Wdw->UserPort))!=NULL)
  145.       {
  146.      it=(APTR)mesg->IAddress;
  147.      Class=mesg->Class;
  148.      MouseX=mesg->MouseX;
  149.      IAGadget=(APTR)mesg->IAddress;
  150.      ReplyMsg(mesg);
  151.  
  152.      switch(Class)
  153.      {
  154.         case GADGETUP:
  155.            RestoreColors(OldColors,color,Colors,SliderMult,Y_Add,DivBy);
  156.            break;
  157.         case CLOSEWINDOW:
  158.            CloseWindow(Wdw);
  159.            CloseFont(Topaz_tf);
  160.            FreeGadgets(ColorBar.NextGadget);
  161.  
  162.            BlueSlider.TopEdge-=Y_Add;
  163.            RedSlider.TopEdge-=Y_Add;
  164.            GreenSlider.TopEdge-=Y_Add;
  165.  
  166.            return(TRUE);
  167.         case GADGETDOWN:
  168.            CurrentGadget=it->GadgetID;
  169.            if(CurrentGadget < 4)
  170.            {
  171.           prop=(APTR)it->SpecialInfo;
  172.           UpdateNum(CurrentGadget,(Colors[CurrentGadget]=
  173.             (prop->HorizPot) >> 12 ),Y_Add,DivBy);
  174.           UpdateColorReg(color,Colors,&Vp);
  175.            }
  176.            else
  177.            {
  178.           color=(MouseX-9)/64;
  179.           rgb=GetRGB4(Vp.ColorMap,color);
  180.  
  181.           SetSliders(Colors,SliderMult,rgb,DivBy);
  182.  
  183.           UpdateNum(RED,Colors[RED],Y_Add,DivBy);
  184.           UpdateNum(GREEN,Colors[GREEN],Y_Add,DivBy);
  185.           UpdateNum(BLUE,Colors[BLUE],Y_Add,DivBy);
  186.  
  187.           RefreshGadgets(&RedSlider,Wdw,NULL);
  188.           SetAPen(Rp,color);
  189.           RectFill(Rp,290,17+Y_Add,310,47+Y_Add);
  190.            }
  191.            break;
  192.         case MOUSEMOVE:
  193.            UpdateNum(CurrentGadget,
  194.              (Colors[CurrentGadget]=(prop->HorizPot >> 12)),Y_Add,DivBy);
  195.            UpdateColorReg(color,Colors,&Vp);
  196.      }
  197.       }
  198.    }
  199. }
  200.  
  201. UpdateNum(Color,value,Y_Add,DivBy)
  202. USHORT Color,value;
  203. UWORD Y_Add;
  204. UBYTE DivBy;
  205. {
  206.    char Num[4];
  207.    UBYTE TrueValue = value/DivBy;
  208.  
  209.    if(value > 15)
  210.       return(FALSE); /*Get rid of funny answers*/
  211.    SetAPen(Rp,1);
  212.    Move(Rp,15,15+(Color*10)+Y_Add);
  213.  
  214.    if(TrueValue > 9)
  215.       stci_d(Num,value);
  216.    else
  217.    {
  218.       stci_d(&Num[1],TrueValue);
  219.       Num[0]=' ';
  220.    }
  221.    Text(Rp,Num,2);
  222.    return(TRUE);
  223. }
  224.  
  225. void UpdateColorReg(reg,colors,ViewPort)
  226. USHORT reg,*colors;
  227. struct ViewPort *ViewPort;
  228. {
  229.    SetRGB4(ViewPort,reg,colors[RED],colors[GREEN],colors[BLUE]);
  230. }
  231.  
  232. void RestoreColors(OldColors,curreg,Colors,SliderMult,Y_Add,DivBy)
  233. ULONG *OldColors;
  234. BYTE curreg;
  235. USHORT *Colors;
  236. UWORD SliderMult;
  237. UWORD Y_Add;
  238. UBYTE DivBy;
  239. {
  240.    BYTE c;
  241.    USHORT red,green,blue;
  242.  
  243.    for(c=0;c<4;c++)
  244.    {
  245.       red = (OldColors[c]>>8) & 0xF;
  246.       green = (OldColors[c]>>4) & 0xF;
  247.       blue = OldColors[c] & 0xF;
  248.       SetRGB4(&Vp,c,red,green,blue);
  249.       if(c==curreg)
  250.       {
  251.      SetSliders(Colors,SliderMult,OldColors[c],DivBy);
  252.  
  253.      UpdateNum(RED,Colors[RED],Y_Add,DivBy);
  254.      UpdateNum(GREEN,Colors[GREEN],Y_Add,DivBy);
  255.      UpdateNum(BLUE,Colors[BLUE],Y_Add,DivBy);
  256.  
  257.       }
  258.    }
  259. }
  260.  
  261. void SetSliders(Colors,SliderMult,rgb,DivBy)
  262. USHORT *Colors;
  263. UWORD SliderMult;
  264. ULONG rgb;
  265. UBYTE DivBy;
  266. {
  267.    UBYTE Color;
  268.  
  269.    Color=(rgb >> 8 & 0x0F) / DivBy;
  270.    RedSliderSInfo.HorizPot=(Colors[RED]=Color*DivBy) * SliderMult;
  271.  
  272.    Color=(rgb & 0x0F) / DivBy;
  273.    BlueSliderSInfo.HorizPot=(Colors[BLUE]=Color*DivBy) * SliderMult;
  274.  
  275.    Color=(rgb >> 4 & 0x0F) / DivBy;
  276.    GreenSliderSInfo.HorizPot=(Colors[GREEN]=Color*DivBy) * SliderMult;
  277.  
  278.    RefreshGadgets(&RedSlider,Wdw,NULL);
  279. }
  280.  
  281. /*~~~End of color.c*/
  282.