home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 568b.lha / PowerSource_v3.0 / source.lzh / source / spal.c < prev    next >
C/C++ Source or Header  |  1991-09-15  |  8KB  |  297 lines

  1. /*---------------------------------------------------------------------*
  2.    spal.c Version 3.0 -  © Copyright 1990-91 Jaba Development
  3.  
  4.    Author  : Jan van den Baard
  5.    Purpose : Editing the screen colors ( can be used as a seperate
  6.                                          module for your own progs )
  7.  *---------------------------------------------------------------------*/
  8.  
  9. #define REDVAL          REDINFO.VertPot/0x1111
  10. #define GREENVAL        GREENINFO.VertPot/0x1111
  11. #define BLUEVAL         BLUEINFO.VertPot/0x1111
  12.  
  13. static struct TextAttr TOPAZ80 =
  14.  { (STRPTR)"topaz.font",8,FS_NORMAL,0
  15.  };
  16.  
  17. static struct Gadget CGads[32];
  18. static struct Image CIMags[32];
  19.  
  20. static struct IntuiText REDTEXT =
  21.  { 0,0,JAM1,5,-9,&TOPAZ80,(UBYTE *)"R",NULL
  22.  };
  23. static struct IntuiText GREENTEXT =
  24.  { 0,0,JAM1,5,-9,&TOPAZ80,(UBYTE *)"G",NULL
  25.  };
  26. static struct IntuiText BLUETEXT =
  27.  { 0,0,JAM1,5,-9,&TOPAZ80,(UBYTE *)"B",NULL
  28.  };
  29. static struct IntuiText OKTEXT =
  30.  { 0,0,JAM1,38,3,&TOPAZ80,(UBYTE *)"OK",NULL
  31.  };
  32. static struct IntuiText RESETTEXT =
  33.  { 0,0,JAM1,26,3,&TOPAZ80,(UBYTE *)"RESET",NULL
  34.  };
  35. static struct IntuiText CANCELTEXT =
  36.  { 0,0,JAM1,22,3,&TOPAZ80,(UBYTE *)"CANCEL",NULL
  37.  };
  38.  
  39. static struct PropInfo REDINFO =
  40.  { AUTOKNOB|FREEVERT,0x0000,0x0000,0x0000,0x1000,0,0,0,0,0,0
  41.  };
  42. static struct PropInfo GREENINFO =
  43.  { AUTOKNOB|FREEVERT,0x0000,0x0000,0x0000,0x1000,0,0,0,0,0,0
  44.  };
  45. static struct PropInfo BLUEINFO =
  46.  { AUTOKNOB|FREEVERT,0x0000,0x0000,0x0000,0x1000,0,0,0,0,0,0
  47.  };
  48.  
  49. static struct Image REDIMAGE;
  50. static struct Image GREENIMAGE;
  51. static struct Image BLUEIMAGE;
  52.  
  53. static SHORT ORCPAIRS[] =
  54.  { -1,-1,92,-1,92,13,-1,13,-1,-1
  55.  };
  56. static struct Border ORCBORD =
  57.  { 0,0,0,0,JAM1,5,(SHORT *)&ORCPAIRS,NULL
  58.  };
  59.  
  60. static struct Gadget REDGAD =
  61.  { &CGads[0],8,21,20,75,GADGHCOMP,RELVERIFY|FOLLOWMOUSE,PROPGADGET,
  62.    (APTR)&REDIMAGE,NULL,&REDTEXT,NULL,(APTR)&REDINFO,0,NULL
  63.  };
  64. static struct Gadget GREENGAD =
  65.  { &REDGAD,30,21,20,75,GADGHCOMP,RELVERIFY|FOLLOWMOUSE,PROPGADGET,
  66.    (APTR)&GREENIMAGE,NULL,&GREENTEXT,NULL,(APTR)&GREENINFO,1,NULL
  67.  };
  68. static struct Gadget BLUEGAD =
  69.  { &GREENGAD,52,21,20,75,GADGHCOMP,RELVERIFY|FOLLOWMOUSE,PROPGADGET,
  70.    (APTR)&BLUEIMAGE,NULL,&BLUETEXT,NULL,(APTR)&BLUEINFO,2,NULL
  71.  };
  72. static struct Gadget OKGAD =
  73.  { &BLUEGAD,76,13,92,13,GADGHCOMP,RELVERIFY,BOOLGADGET,
  74.    (APTR)&ORCBORD,NULL,&OKTEXT,NULL,NULL,3,NULL
  75.  };
  76. static struct Gadget RESETGAD =
  77.  { &OKGAD,76,30,92,13,GADGHCOMP,RELVERIFY,BOOLGADGET,
  78.    (APTR)&ORCBORD,NULL,&RESETTEXT,NULL,NULL,4,NULL
  79.  };
  80. static struct Gadget CANCELGAD =
  81.  { &RESETGAD,76,47,92,13,GADGHCOMP,RELVERIFY,BOOLGADGET,
  82.    (APTR)&ORCBORD,NULL,&CANCELTEXT,NULL,NULL,5,NULL
  83.  };
  84.  
  85. static struct Gadget CGAD =
  86.  { NULL,0,0,0,0,GADGHNONE|GADGIMAGE,GADGIMMEDIATE,
  87.    BOOLGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL
  88.  };
  89. static struct Image CIMAG =
  90.  { 0,0,0,0,1,NULL,0,0,NULL
  91.  };
  92.  
  93. static struct NewWindow nw =
  94.  { 0,0,177,122,0,1,MOUSEMOVE|GADGETUP|GADGETDOWN,
  95.    WINDOWDRAG|SMART_REFRESH|ACTIVATE|RMBTRAP,
  96.    NULL,NULL,(UBYTE *)"Set Colors",NULL,NULL,0,0,0,0,WBENCHSCREEN
  97.  };
  98.  
  99. static struct Window       *CReqWind;
  100. static struct Screen       *AScreen;
  101. static struct IntuiMessage *CReqMsg;
  102. static struct RastPort     *CRP;
  103. static struct Gadget       *IdGad;
  104. static ULONG                class, ID, AMC;
  105. static USHORT              *ResetPal, ActCol = 0;
  106. static UBYTE vals[16] =
  107.  { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
  108.  };
  109.  
  110. extern struct IntuitionBase *IntuitionBase;
  111.  
  112. static VOID DrawRect(col,x1,y1,x2,y2)
  113.    USHORT col,x1,y1,x2,y2;
  114. {
  115.    SetAPen(CRP,col);
  116.    SetDrMd(CRP,JAM1);
  117.    Move(CRP,x1,y1); Draw(CRP,x2,y1);
  118.    Draw(CRP,x2,y2); Draw(CRP,x1,y2);
  119.    Draw(CRP,x1,y1);
  120. }
  121.  
  122. static VOID calc(wi,he,c,top)
  123.    register SHORT wi,he,top;
  124.    register USHORT c;
  125. {
  126.    CIMags[c]                  = CIMAG;
  127.    CIMags[c].PlaneOnOff       = c;
  128.    CIMags[c].Width            = wi;
  129.    CIMags[c].Height           = he;
  130.  
  131.    CGads[c]                   = CGAD;
  132.    CGads[c].Width             = wi;
  133.    CGads[c].Height            = he;
  134.    if(c < 16) CGads[c].LeftEdge          = 8 + (wi * c);
  135.    else       CGads[c].LeftEdge          = 8 + (wi * (c - 16));
  136.    CGads[c].TopEdge           = top;
  137.    CGads[c].GadgetRender      = (APTR)&CIMags[c];
  138.    CGads[c].GadgetID          = c + 6;
  139.    CGads[c].NextGadget        = &CGads[c + 1];
  140. }
  141.  
  142. static VOID EvaluateGads()
  143. {
  144.    register USHORT i;
  145.  
  146.    AMC = (1L << AScreen->BitMap.Depth);
  147.  
  148.    if(AMC == 2)       for(i=0;i<AMC;i++) calc(80,20,i,98);
  149.    else if(AMC == 4)  for(i=0;i<AMC;i++) calc(40,20,i,98);
  150.    else if(AMC == 8)  for(i=0;i<AMC;i++) calc(20,20,i,98);
  151.    else if(AMC == 16) for(i=0;i<AMC;i++) calc(10,20,i,98);
  152.    else            {  for(i=0;i<16;i++)  calc(10,10,i,98);
  153.                       for(   ;i<32;i++)  calc(10,10,i,108); }
  154.    CGads[i-1].NextGadget = NULL;
  155. }
  156.  
  157. static VOID PrintCol()
  158. {
  159.    UBYTE rgb[3];
  160.  
  161.    SetAPen(CRP,0);
  162.    SetBPen(CRP,1);
  163.    SetDrMd(CRP,JAM2);
  164.    rgb[0] = vals[REDVAL];
  165.    rgb[1] = vals[GREENVAL];
  166.    rgb[2] = vals[BLUEVAL];
  167.    Move(CRP,111,81);
  168.    Text(CRP,(char *)&rgb[0],3);
  169. }
  170.  
  171. static VOID SetCol(num)
  172.    ULONG num;
  173. {
  174.    register int i;
  175.    USHORT Col,x,y,x1,y1,xx,yy,xx1,yy1;
  176.    UBYTE r,g,b;
  177.    ULONG Pos;
  178.  
  179.    x  = CGads[num].LeftEdge;
  180.    y  = CGads[num].TopEdge;
  181.    x1 = x + CGads[num].Width-1;
  182.    y1 = y + CGads[num].Height-1;
  183.  
  184.    xx  = CGads[ActCol].LeftEdge;
  185.    yy  = CGads[ActCol].TopEdge;
  186.    xx1 = xx + CGads[ActCol].Width-1;
  187.    yy1 = yy + CGads[ActCol].Height-1;
  188.  
  189.    DrawRect(ActCol,xx,yy,xx1,yy1);
  190.    DrawRect(0,x,y,x1,y1);
  191.  
  192.    DrawRect(0,75,63,168,95);
  193.    SetAPen(CRP,num);
  194.    RectFill(CRP,76,64,167,94);
  195.    DrawRect(0,105,73,139,83);
  196.    SetAPen(CRP,1);
  197.    RectFill(CRP,106,74,138,82);
  198.  
  199.    ActCol = num;
  200.    Col=GetRGB4(AScreen->ViewPort.ColorMap,num);
  201.    Pos = RemoveGList(CReqWind,&BLUEGAD,3);
  202.    r = (Col >> 8) & 0x0F;
  203.    g = (Col >> 4) & 0x0F;
  204.    b = (Col     ) & 0x0F;
  205.    REDINFO.VertPot = r * 0x1111;
  206.    GREENINFO.VertPot = g * 0x1111;
  207.    BLUEINFO.VertPot = b * 0x1111;
  208.    AddGList(CReqWind,&BLUEGAD,Pos,3,NULL);
  209.    RefreshGList(&BLUEGAD,CReqWind,NULL,3);
  210.    PrintCol();
  211. }
  212.  
  213. static VOID MakeCol()
  214. {
  215.    SetRGB4(&AScreen->ViewPort,ActCol,REDVAL,GREENVAL,BLUEVAL);
  216.    PrintCol();
  217. }
  218.  
  219. static LONG GetIntuiMsg()
  220. {
  221.    if((CReqMsg = (struct IntuiMessage *)GetMsg(CReqWind->UserPort)))
  222.    {   class = CReqMsg->Class;
  223.        IdGad = (struct Gadget *)CReqMsg->IAddress;
  224.        ID    = IdGad->GadgetID;
  225.        ReplyMsg((struct Message *)CReqMsg);
  226.        return(TRUE);
  227.    }
  228.    return(FALSE);
  229. }
  230.  
  231. static VOID CleanUp()
  232. {
  233.    if(ResetPal) FreeMem(ResetPal,64L);
  234.    while(GetIntuiMsg());
  235.    if(CReqWind) CloseWindow(CReqWind);
  236. }
  237.  
  238. static VOID Reset()
  239. {
  240.    LoadRGB4(&AScreen->ViewPort,ResetPal,AMC);
  241.    SetCol(ActCol);
  242. }
  243.  
  244. LONG SetPalette(x,y,s)
  245.    USHORT x,y;
  246.    struct Screen *s;
  247. {
  248.    if(s)
  249.    {   AScreen = nw.Screen = s;
  250.        nw.Type = CUSTOMSCREEN;
  251.    }
  252.    else AScreen = IntuitionBase->ActiveScreen;
  253.    nw.LeftEdge = x;
  254.    nw.TopEdge = y;
  255.    EvaluateGads();
  256.    if(!(CReqWind = OpenWindow(&nw))) return 1L;
  257.    CRP = CReqWind->RPort;
  258.    if(!(ResetPal = AllocMem(64L,MEMF_PUBLIC)))
  259.    {   CleanUp();
  260.        return 3L;
  261.    }
  262.    CopyMem((void *)AScreen->ViewPort.ColorMap->ColorTable,(void *)ResetPal,64L);
  263.    SetAPen(CRP,1);
  264.    RectFill(CRP,3,11,173,119);
  265.    AddGList(CReqWind,&CANCELGAD,-1L,6+AMC,NULL);
  266.    RefreshGList(&CANCELGAD,CReqWind,NULL,6+AMC);
  267.    SetCol(0);
  268.    FOREVER
  269.    {   Wait(1<<CReqWind->UserPort->mp_SigBit);
  270.        while(GetIntuiMsg())
  271.        {   switch(class)
  272.            {   case GADGETUP: switch(ID)
  273.                               {   case 3:  CleanUp();
  274.                                            return 0L;
  275.                                            break;
  276.                                   case 4:  Reset();
  277.                                            break;
  278.                                   case 5:  Reset();
  279.                                            CleanUp();
  280.                                            return 2L;
  281.                                            break;
  282.                                   default: break;
  283.                               }
  284.                               break;
  285.              case GADGETDOWN: if(ID >= 6 && ID <= 6+AMC) SetCol(ID-6);
  286.                               break;
  287.              case MOUSEMOVE:  while(class == MOUSEMOVE)
  288.                               {   while(GetIntuiMsg());
  289.                                   MakeCol();
  290.                               }
  291.                               break;
  292.              default:         break;
  293.            }
  294.        }
  295.    }
  296. }
  297.