home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 269.lha / MelaniePaint_v.60 / sources / mpaint.c < prev    next >
C/C++ Source or Header  |  1989-07-16  |  21KB  |  746 lines

  1. /*============================================================================*/
  2. /*  MPaint.c: by Kevin T. Seghetti                          */
  3. /*  Simple paint program, main module                          */
  4. /*============================================================================*/
  5.  
  6. /*============================================================================*/
  7. /*  includes                                      */
  8. /*============================================================================*/
  9.  
  10. #include "equates.h"
  11. #include <functions.h>
  12. #include <exec/types.h>
  13. #include <intuition/intuition.h>
  14.  
  15. #include <graphics/gfx.h>
  16. #include "iff/jiff.h"
  17.  
  18. /*============================================================================*/
  19. /*  external declarations                              */
  20. /*============================================================================*/
  21.  
  22. extern void HandleMenu(),DrawContLine(),(*DrawRoutineList[])();
  23. extern long ForeColor,BackColor,OutlineColor,DrawMode;
  24. extern FLAG noUndo;
  25. extern char Crd[20];
  26. extern struct IntuiText *CoordIntuiText;
  27. extern struct Remember *MenuRemember;
  28.  
  29. /*============================================================================*/
  30. /*  Global Variable declarations                          */
  31. /*============================================================================*/
  32.  
  33. struct IntuitionBase *IntuitionBase;
  34. struct GfxBase *GfxBase;
  35.  
  36. struct Screen *MPaintScreen = NULL;
  37. struct Window *MPaintWindow = NULL,*ToolWindow = NULL,*PaletteWindow = NULL,*HistWindow = NULL,*CoordWindow = NULL;
  38. struct RastPort *VRastPort = NULL;
  39. struct Menu *MPaintMenu;
  40. struct Remember *ToolRemember,*PaletteRemember,*HistRemember,*CoordRemember;
  41. struct ILBM_info  *info;
  42. struct RastPort UndoRastPort;
  43. struct BitMap UndoBitMap;
  44.  
  45. int i,CurrWindow,GridX,GridY,MaxColor,PaletteColorMode,Function_DrawMode;
  46. SHORT mx,my,PaintWidth,PaintHeight;
  47. FLAG Continue,SelectDown,UndoBuffer = FALSE,PropGadgDown = FALSE,Grid = FALSE,ChoosingBackColor = FALSE,PatternOn = FALSE;
  48. UBYTE *TempPlane = 0;
  49. UWORD *ColorPTR,CurrGadg;
  50. ULONG Class,Code,Qualifier;
  51. void (*DrawRoutine)();
  52. struct Gadget *GadgetPTR;
  53. struct TmpRas myTmpRas;
  54. struct Gadget *OldGadget = 0;
  55. struct PropInfo *TempProp;
  56. struct Gadget *TempGadget;
  57.  
  58. UWORD areabuffer[250];
  59. struct AreaInfo myAreaInfo;
  60.  
  61. USHORT areaPattern[] =
  62. {
  63.     0xaaaa,
  64.     0x5555
  65. };
  66.  
  67. /*============================================================================*/
  68. /*  default colors                                  */
  69. /*============================================================================*/
  70.  
  71. UWORD colortable[32] =
  72. {
  73.     0,0xfff,0xf00,0x0f0,0x00f,0xff0,0x0ff,0xf0f,
  74.     0x8a8,0xa88,0x080,0x008,0x888,0x808,0x088,0x880,
  75.     0xeee,0xddd,0xccc,0xbbb,0xaaa,0x999,0x888,0x777,
  76.     0x666,0x555,0x444,0x333,0x222,0x111,0x000,0x00f
  77. };
  78.  
  79. /*============================================================================*/
  80. /*  Initial Screen Definition                              */
  81. /*============================================================================*/
  82.  
  83. struct NewScreen NewMPaintScreen =
  84. {
  85.     0,0,320,200,5,        /* leftedge, topedge, width, height, depth */
  86.     0,1,            /* detail and block pens */
  87.     NULL,           /* Viewmodes */
  88.     CUSTOMSCREEN,        /* screen type */
  89.     NULL,            /* font pointer */
  90.     (UBYTE *)"MPaint Screen", /* screen title */
  91.     NULL,            /* pointer to screen gadgets */
  92.     NULL            /* custom bitmap pointer */
  93. };
  94.  
  95. /*============================================================================*/
  96. /*  Return palette settings to default                          */
  97. /*============================================================================*/
  98.  
  99. RestorePalette()
  100. {
  101.     int i;
  102.     if(ColorPTR)
  103.     for(i=0;i<32;i++)
  104.         ColorPTR[i] = colortable[i];
  105. }
  106.  
  107. /*============================================================================*/
  108. /*  free a set of bitplanes                              */
  109. /*============================================================================*/
  110.  
  111. void
  112. myfree_planes(bmap)
  113. register struct BitMap *bmap;
  114. {
  115.     PLANEPTR plane;
  116.     long length;
  117.     short i;
  118.  
  119.     length = bmap->BytesPerRow * bmap->Rows;
  120.  
  121.     for (i=0; i<bmap->Depth; i++)
  122.     if ( (plane = bmap->Planes[i]) != NULL)
  123.      {
  124.         rfree(plane, length);
  125.         bmap->Planes[i] = NULL;
  126.      }
  127. }
  128.  
  129. /*============================================================================*/
  130. /*  cleanup: Program finished, time to free all memory and resources          */
  131. /*============================================================================*/
  132.  
  133. cleanup(text,err)
  134. char *text;
  135. int err;
  136. {
  137.     if(text)
  138.     DoAutoRequest(MPaintWindow,text,NULL,"Ok");
  139.  
  140.     if(MPaintWindow)
  141.      {
  142.     ClearMenuStrip(MPaintWindow);
  143.     CloseWindow(MPaintWindow);
  144.      }
  145.  
  146.     if(ToolWindow)
  147.     CloseToolWindow();
  148.  
  149.     if(PaletteWindow)
  150.     ClosePaletteWindow();
  151.  
  152.     if(HistWindow)
  153.     CloseHistWindow();
  154.  
  155.     if(CoordWindow)
  156.     CloseCoordWindow();
  157.  
  158.     if(UndoBuffer)
  159.      {
  160.     myfree_planes( UndoRastPort.BitMap);
  161.      }
  162.  
  163.     DeleteAllPages();
  164.  
  165.     CloseVScreen();
  166.  
  167.     if(GfxBase)
  168.     CloseLibrary(GfxBase);
  169.     if(IntuitionBase)
  170.     CloseLibrary(IntuitionBase);
  171.  
  172.     if(MenuRemember)
  173.     FreeRemember(&MenuRemember,(long)TRUE);
  174.  
  175.     if(TempPlane)
  176.     FreeRaster(TempPlane,(long)PaintWidth,(long)PaintHeight);
  177.  
  178.     exit(err);
  179. }
  180.  
  181. /*============================================================================*/
  182. /*  Open all libraries we will use                          */
  183. /*============================================================================*/
  184.  
  185. OpenLibrarys()
  186. {
  187.     IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",REVISION);
  188.     if(!IntuitionBase)
  189.     cleanup("Cannot Open Intuition Library",ERR_NOLIB);
  190.  
  191.     GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",REVISION);
  192.     if(!GfxBase)
  193.     cleanup("Cannot Open Graphics Library",ERR_NOLIB);
  194. }
  195.  
  196. /*----------------------------------------------------------------------------*/
  197.  
  198. InitVScreen()
  199. {
  200.     MPaintScreen = OpenScreen(&NewMPaintScreen);
  201.     if(!MPaintScreen)
  202.     cleanup("Cannot open custom screen",5);
  203.     MaxColor = 32;
  204.     PaintWidth = 320;
  205.     PaintHeight = 200;
  206.  
  207.     ColorPTR = AllocMem((long)sizeof(UWORD[32]),NULL);
  208.     if(!ColorPTR)
  209.     cleanup("not enough memory");
  210.     RestorePalette();
  211.     LoadRGB4(&MPaintScreen->ViewPort,ColorPTR,32L);
  212. }
  213.  
  214. /*============================================================================*/
  215.  
  216. CloseVScreen()
  217. {
  218.     if(MPaintScreen)
  219.     CloseScreen(MPaintScreen);
  220.  
  221.     if(ColorPTR)
  222.     FreeMem(ColorPTR,(long)sizeof(UWORD[32]));
  223. }
  224.  
  225. /*============================================================================*/
  226.  
  227. InitTempPlane()
  228. {
  229.     TempPlane = AllocRaster((long)PaintWidth,(long)PaintHeight);
  230.     if(!TempPlane)
  231.     cleanup("no memory for TmpRas",ERR_NOMEM);
  232.     InitTmpRas(&myTmpRas,TempPlane,(long)(PaintWidth/8)*PaintHeight);
  233.     VRastPort->TmpRas = &myTmpRas;
  234.  
  235.     InitArea(&myAreaInfo,areabuffer, 100L);
  236.     VRastPort->AreaInfo=&myAreaInfo;
  237. }
  238.  
  239. /*============================================================================*/
  240.  
  241. InitDefaults()
  242. {
  243.     ForeColor = 1;
  244.     SetAPen(VRastPort,(long)ForeColor);
  245.     DrawRoutine = DrawContLine;
  246.     DrawMode = JAM2;
  247.     Function_DrawMode = JAM2;
  248.     SelectDown = FALSE;
  249.     PaletteColorMode = COLORMODE_NORMAL;
  250.     GridX = 10;
  251.     GridY = 10;
  252. }
  253.  
  254. /*============================================================================*/
  255.  
  256. InitUndoBuffer()
  257. {
  258.     long Depth;
  259.  
  260.     Depth = Num2Bit((long)MaxColor);
  261.  
  262.     InitRastPort(&UndoRastPort);
  263.     UndoRastPort.Mask = (1<<Depth)-1;
  264.  
  265.     InitBitMap(&UndoBitMap,Depth,(long)PaintWidth,(long)PaintHeight);
  266.  
  267.     UndoRastPort.BitMap = &UndoBitMap;
  268.  
  269.     for (i=0; i<Depth; i++)
  270.     if ((UndoRastPort.BitMap->Planes[i] = ralloc(PaintWidth*(PaintHeight/8))) == NULL)
  271.      {
  272.         myfree_planes( UndoRastPort.BitMap );
  273.         UndoBuffer = FALSE;
  274.         return();
  275.      }
  276.     UndoBuffer = TRUE;
  277.     noUndo = FALSE;
  278.     SaveToUndoBuffer();
  279. }
  280.  
  281. /*============================================================================*/
  282. /*  put_ea_cmap: convert IFF colormap to Amiga colormap               */
  283. /*============================================================================*/
  284.  
  285. /*put_ea_cmap given an ea-type color map:
  286.         an array of unsigned chars of form ea_cmap[] = {r, g, b, r, g, b...}
  287.   turn it into an amiga-type color map:
  288.         an array of unsigned short of form amiga_cmap = {0xrgb, 0xrgb, ...}
  289.   and then tell Dale this is the colors we want for our viewport */
  290. void
  291. put_ea_cmap(cmap, colors)
  292. unsigned char *cmap;
  293. int colors;
  294. {
  295. unsigned short amy_cmap[MAXCOL];
  296. int i;
  297. unsigned char r, g, b;
  298.  
  299. if (colors > MAXCOL)    /*color clipping*/
  300.     colors = MAXCOL;
  301. for (i=0; i<colors; i++)
  302.     {
  303.     amy_cmap[i] =
  304.         ((cmap[0] & 0xf0) << 4) + (cmap[1] & 0xf0) + ((cmap[2] & 0xf0) >> 4);
  305.     cmap += 3;
  306.     }
  307. LoadRGB4( &MPaintScreen->ViewPort, amy_cmap, (long)colors);
  308. for(i=0;i<colors;i++)
  309.  {
  310.     ColorPTR[i] = amy_cmap[i];
  311.  }
  312. }
  313.  
  314. /*============================================================================*/
  315. /*  ConvertToDecimal: this is MUCH faster than using sprintf              */
  316. /*============================================================================*/
  317.  
  318. ConvertToDecimal(text,num)
  319. char *text;
  320. int num;
  321. {
  322.     int temp;
  323.  
  324.     temp = '0';
  325.     while(num>99)
  326.      {    num -=100;
  327.     temp+=1;
  328.      }
  329.     *text++ = temp;
  330.  
  331.     temp = '0';
  332.     while(num>9)
  333.      {    num -=10;
  334.     temp+=1;
  335.      }
  336.     *text++ = temp;
  337.     *text = num + '0';
  338. }
  339.  
  340. /*============================================================================*/
  341. /*  UpdateCoordinates: Print the current mouse coordinates in coord window    */
  342. /*============================================================================*/
  343.  
  344. UpdateCoordinates()
  345. {
  346.     if(CoordWindow)
  347.      {
  348.     ConvertToDecimal(Crd,MPaintScreen->MouseX);
  349.     Crd[3] = ',';
  350.     ConvertToDecimal(&Crd[4],MPaintScreen->MouseY);
  351.     Crd[7] = 0;
  352.  
  353.     PrintIText(CoordWindow->RPort,CoordIntuiText,5L,12L);
  354.      }
  355. }
  356.  
  357. /*============================================================================*/
  358. /*  Dispatch:all drawing operations are called from here              */
  359. /*============================================================================*/
  360.  
  361. Dispatch()
  362. {
  363.     if(Grid)
  364.      {
  365.     mx = (int)(mx/GridX) * GridX;
  366.     my = (int)(my/GridY) * GridY;
  367.      }
  368.         if(CoordWindow)
  369.         UpdateCoordinates();
  370.  
  371.     if(Class == MOUSEBUTTONS && Code == SELECTDOWN)
  372.     SaveToUndoBuffer();
  373.     (*DrawRoutine)();
  374. }
  375.  
  376. /*============================================================================*/
  377. /*  converts a proportional value to a # between 0 and 15              */
  378. /*============================================================================*/
  379.  
  380. USHORT PotConvert16(value)
  381.  USHORT value;
  382. {   return(15 - (value/(0xFFFF/15)));
  383. }
  384.  
  385. /*============================================================================*/
  386. /*  converts a # between 0 & 15 to a proportional value               */
  387. /*============================================================================*/
  388.  
  389. USHORT ConvertToPot16(value)
  390.  USHORT value;
  391. {   return((15 - value) * (0xffff/15));
  392. }
  393.  
  394. /*============================================================================*/
  395. /*  search a GList for a particular gadget                      */
  396. /*============================================================================*/
  397.  
  398. struct Gadget *
  399. FindGadget(GList,GadgetID)
  400. struct Gadget *GList;
  401. USHORT GadgetID;
  402. {
  403.     while(GList->GadgetID != GadgetID && GList->NextGadget != 0)
  404.     GList = GList->NextGadget;
  405.     return(GList);
  406. }
  407.  
  408. /*============================================================================*/
  409. /*  This is where all input events are parsed                      */
  410. /*  menu choices are handled in "menuparse.c"                                 */
  411. /*============================================================================*/
  412.  
  413. HandleInput(message)
  414. struct IntuiMessage *message;
  415. {
  416.     UWORD TempColor,NewColor;
  417.     struct StringInfo *TempString;
  418.  
  419.     if(message)
  420.      {
  421.     Class=message->Class;
  422.     Code=message->Code;
  423.     Qualifier=message->Qualifier;
  424.     mx=message->MouseX;
  425.     my=message->MouseY;
  426.     GadgetPTR = (struct Gadget *)message->IAddress;
  427.     ReplyMsg(message);
  428.      }
  429.  
  430.     if(CoordWindow)
  431.     UpdateCoordinates();
  432.  
  433.     switch(Class)
  434.      {    case MOUSEMOVE:
  435.         switch(CurrWindow)
  436.          {
  437.         case WINDOW_PAINT:
  438.             Dispatch();
  439.             break;
  440.         case WINDOW_PALETTE:
  441.             if(PropGadgDown)
  442.             UpdateColor();
  443.             break;
  444.          }
  445.         break;
  446.     case MOUSEBUTTONS:
  447.         switch(Code)
  448.          {    case  SELECTDOWN:
  449.             SelectDown = TRUE;
  450.             Dispatch();
  451.             break;
  452.         case SELECTUP:
  453.             SelectDown = FALSE;
  454.             Dispatch();
  455.             if(Function_DrawMode == DRAWMODE_CYCLE)
  456.             UpdatePropGadgets();
  457.             break;
  458.          }
  459.         break;
  460.     case MENUPICK:
  461.         HandleMenu(Code);
  462.         break;
  463.     case CLOSEWINDOW:
  464.         if(CurrWindow == WINDOW_TOOLS)
  465.         CloseToolWindow();
  466.         else if(CurrWindow == WINDOW_PALETTE)
  467.         ClosePaletteWindow();
  468.         else if(CurrWindow == WINDOW_HIST)
  469.         CloseHistWindow();
  470.         if(CurrWindow == WINDOW_COORD)
  471.         CloseCoordWindow();
  472.         break;
  473.     case GADGETDOWN:
  474.         if(CurrWindow == WINDOW_PALETTE)
  475.         if(GadgetPTR->SpecialInfo)
  476.          {
  477.             TempProp = (struct PropInfo *)GadgetPTR->SpecialInfo;
  478.             CurrGadg = GadgetPTR->GadgetID;
  479.             PropGadgDown = TRUE;
  480.          }
  481.         break;
  482.     case GADGETUP:
  483.         if(CurrWindow == WINDOW_TOOLS)
  484.          {
  485.         if(GadgetPTR->GadgetID >= TOOL_GADG_START)
  486.             DrawRoutine = DrawRoutineList[GadgetPTR->GadgetID-TOOL_GADG_START];
  487.         else if(GadgetPTR->GadgetID < 32 /*&& ToolWindow*/)
  488.          {  if(ChoosingBackColor)
  489.              {
  490.             SetBackColor((long)GadgetPTR->GadgetID);
  491.              }
  492.             else
  493.             SetForeColor((long)GadgetPTR->GadgetID);
  494.          }
  495.         else if(GadgetPTR->GadgetID == TOOL_GADG_UNDO)
  496.             DoUndo();
  497.         else if(GadgetPTR->GadgetID == TOOL_GADG_BACK)
  498.             ChoosingBackColor = GadgetPTR->Flags & SELECTED;
  499.         else if(GadgetPTR->GadgetID == TOOL_GADG_PATTERN)
  500.          {
  501.             if(GadgetPTR->Flags & SELECTED)
  502.              {
  503.             PatternOn = TRUE;
  504.             SetAfPt(VRastPort,&areaPattern[0],1L);
  505.              }
  506.             else
  507.              {
  508.             PatternOn = FALSE;
  509.             SetAfPt(VRastPort,0L,0L);
  510.              }
  511.          }
  512.          }
  513.         if(CurrWindow == WINDOW_COORD)
  514.          {
  515.         switch(GadgetPTR->GadgetID)
  516.          {
  517.             case COORD_GADG_GRID:
  518.             if(GadgetPTR->Flags & SELECTED)
  519.                 Grid = TRUE;
  520.             else Grid = FALSE;
  521.             break;
  522.             case COORD_GADG_GRIDX:
  523.             TempString = (struct StringInfo *)GadgetPTR->SpecialInfo;
  524.             if(TempString->LongInt < 1 || TempString->LongInt > PaintWidth)
  525.                 DoAutoRequest(MPaintWindow,"Invalid Entry, Try again",NULL,"Ok");
  526.             else GridX = TempString->LongInt;
  527.             break;
  528.             case COORD_GADG_GRIDY:
  529.             TempString = (struct StringInfo *)GadgetPTR->SpecialInfo;
  530.             if(TempString->LongInt < 1 || TempString->LongInt > PaintWidth)
  531.                 DoAutoRequest(MPaintWindow,"Invalid Entry, Try again",NULL,"Ok");
  532.             else GridY = TempString->LongInt;
  533.             break;
  534.          }
  535.          }
  536.         if(CurrWindow == WINDOW_PALETTE)
  537.          {
  538.         PropGadgDown = FALSE;
  539.         if(GadgetPTR->GadgetID >= PALETTE_GADG_START && GadgetPTR->GadgetID <= PALETTE_GADG_PROP_BLUE)
  540.          {
  541.             SetScreenTitle("MPaint");
  542.             PaletteColorMode = COLORMODE_NORMAL;
  543.             TempColor = ColorPTR[ForeColor];
  544.             switch(GadgetPTR->GadgetID)
  545.              {
  546.             case PALETTE_GADG_RED_PLUS2:
  547.                 for(i=0;i<MaxColor;++i)
  548.                 ColorPTR[i] = Palette_IncRed(ColorPTR[i]);
  549.                 UpdatePropGadgets();
  550.                 break;
  551.             case PALETTE_GADG_GREEN_PLUS2:
  552.                 for(i=0;i<MaxColor;++i)
  553.                 ColorPTR[i] = Palette_IncGreen(ColorPTR[i]);
  554.                 UpdatePropGadgets();
  555.                 break;
  556.             case PALETTE_GADG_BLUE_PLUS2:
  557.                 for(i=0;i<MaxColor;++i)
  558.                 ColorPTR[i] = Palette_IncBlue(ColorPTR[i]);
  559.                 UpdatePropGadgets();
  560.                 break;
  561.             case PALETTE_GADG_RED_MINUS2:
  562.                 for(i=0;i<MaxColor;++i)
  563.                 ColorPTR[i] = Palette_DecRed(ColorPTR[i]);
  564.                 UpdatePropGadgets();
  565.                 break;
  566.             case PALETTE_GADG_GREEN_MINUS2:
  567.                 for(i=0;i<MaxColor;++i)
  568.                 ColorPTR[i] = Palette_DecGreen(ColorPTR[i]);
  569.                 UpdatePropGadgets();
  570.                 break;
  571.             case PALETTE_GADG_BLUE_MINUS2:
  572.                 for(i=0;i<MaxColor;++i)
  573.                 ColorPTR[i] = Palette_DecBlue(ColorPTR[i]);
  574.                 UpdatePropGadgets();
  575.                 break;
  576.             case PALETTE_GADG_PROP_RED:
  577.                 TempProp = (struct PropInfo *)GadgetPTR->SpecialInfo;
  578.                 ColorPTR[ForeColor] = Palette_SetRed(ColorPTR[ForeColor],PotConvert16(TempProp->VertPot));
  579.                 UpdatePropGadgets();
  580.                 break;
  581.             case PALETTE_GADG_PROP_GREEN:
  582.                 TempProp = (struct PropInfo *)GadgetPTR->SpecialInfo;
  583.                 ColorPTR[ForeColor] = Palette_SetGreen(ColorPTR[ForeColor],PotConvert16(TempProp->VertPot));
  584.                 UpdatePropGadgets();
  585.                 break;
  586.             case PALETTE_GADG_PROP_BLUE:
  587.                 TempProp = (struct PropInfo *)GadgetPTR->SpecialInfo;
  588.                 ColorPTR[ForeColor] = Palette_SetBlue(ColorPTR[ForeColor],PotConvert16(TempProp->VertPot));
  589.                 UpdatePropGadgets();
  590.                 break;
  591.              }
  592.             LoadRGB4(&MPaintScreen->ViewPort,ColorPTR,MaxColor);
  593.          }
  594.         else if(GadgetPTR->GadgetID < 32 && PaletteWindow)
  595.             switch(PaletteColorMode)
  596.              {
  597.             case COLORMODE_NORMAL:
  598.                 SetForeColor((long)GadgetPTR->GadgetID);
  599.                 break;
  600.             case COLORMODE_COPY:
  601.                 ColorPTR[GadgetPTR->GadgetID] = ColorPTR[ForeColor];
  602.                 SetScreenTitle("MPaint");
  603.                 PaletteColorMode = COLORMODE_NORMAL;
  604.                 LoadRGB4(&MPaintScreen->ViewPort,ColorPTR,MaxColor);
  605.                 break;
  606.             case COLORMODE_EXCHNG:
  607.                 TempColor = ColorPTR[ForeColor];
  608.                 ColorPTR[ForeColor]= ColorPTR[GadgetPTR->GadgetID];
  609.                 ColorPTR[GadgetPTR->GadgetID] = TempColor;
  610.                 SetScreenTitle("MPaint");
  611.                 PaletteColorMode = COLORMODE_NORMAL;
  612.                 LoadRGB4(&MPaintScreen->ViewPort,ColorPTR,MaxColor);
  613.                 break;
  614.              }
  615.         else if(GadgetPTR->GadgetID == PALETTE_GADG_COPY)
  616.          {
  617.             SetScreenTitle("Choose color to copy to");
  618.             PaletteColorMode = COLORMODE_COPY;
  619.          }
  620.         else if(GadgetPTR->GadgetID == PALETTE_GADG_EXCHNG)
  621.          {
  622.             SetScreenTitle("Choose color to exchange with");
  623.             PaletteColorMode = COLORMODE_EXCHNG;
  624.          }
  625.          }
  626.         break;
  627.      }
  628. }
  629.  
  630. /*============================================================================*/
  631.  
  632. HandlePaintWindowInput()
  633. {
  634.     struct IntuiMessage *message;
  635.     CurrWindow = WINDOW_PAINT;
  636.     while ((message = (struct IntuiMessage *)GetMsg(MPaintWindow->UserPort)) != NULL)
  637.      {
  638.     if(message->Class == MOUSEMOVE)
  639.      {
  640.         while(message->Class == MOUSEMOVE)
  641.          {
  642.         mx=message->MouseX;
  643.         my=message->MouseY;
  644.         ReplyMsg(message);
  645.  
  646.         message = (struct IntuiMessage *)GetMsg(MPaintWindow->UserPort);
  647.         if(message == NULL)
  648.          {
  649.             Class = MOUSEMOVE;
  650.             HandleInput(NULL);
  651.             break;
  652.          }
  653.          }
  654.      }
  655.     HandleInput(message);
  656.      }
  657. }
  658.  
  659. /*============================================================================*/
  660. /*  Main entry point of program                           */
  661. /*  First will initialize everything, then will load file if name specified,  */
  662. /*  then enter main loop                              */
  663. /*============================================================================*/
  664.  
  665. main(argc,argv)
  666. int argc;
  667. char *argv[];
  668. {
  669.     int x,y,color,Result;
  670.     struct IntuiMessage *message;
  671.     long WaitBits;
  672.  
  673.     MenuRemember = NULL;
  674.  
  675.     OpenLibrarys();
  676.     InitVScreen();
  677.     InitMenus();
  678.     InitWindow();
  679.     InitUndoBuffer();
  680.  
  681.     VRastPort = MPaintWindow->RPort;
  682.  
  683.     InitTempPlane();                            /* for area and flood operations */
  684.     InitDefaults();                             /* setup default configuration */
  685.  
  686.     if(argc > 1)                                /* if command line filename,*/
  687.     MIFFLoad(argv[1]);                      /* load it                  */
  688.  
  689.     Continue = TRUE;
  690.     while(Continue)
  691.      {
  692.     WaitBits = (1L<<MPaintWindow->UserPort->mp_SigBit);
  693.     if(ToolWindow)
  694.         WaitBits |=(1L<<ToolWindow->UserPort->mp_SigBit);
  695.     if(PaletteWindow)
  696.         WaitBits |=(1L<<PaletteWindow->UserPort->mp_SigBit);
  697.     if(HistWindow)
  698.         WaitBits |=(1L<<HistWindow->UserPort->mp_SigBit);
  699.     if(CoordWindow)
  700.         WaitBits |=(1L<<CoordWindow->UserPort->mp_SigBit);
  701.  
  702.     Wait(WaitBits);
  703.  
  704.     HandlePaintWindowInput();
  705.     if(ToolWindow)
  706.         while ((message = (struct IntuiMessage *)GetMsg(ToolWindow->UserPort)) != NULL)
  707.          {
  708.         CurrWindow = WINDOW_TOOLS;
  709.         HandleInput(message);
  710.         if(!ToolWindow)
  711.             break;
  712.          }
  713.     if(PaletteWindow)
  714.         while ((message = (struct IntuiMessage *)GetMsg(PaletteWindow->UserPort)) != NULL)
  715.          {
  716.         CurrWindow = WINDOW_PALETTE;
  717.         HandleInput(message);
  718.         if(!PaletteWindow)
  719.             break;
  720.          }
  721.     if(HistWindow)
  722.         while ((message = (struct IntuiMessage *)GetMsg(HistWindow->UserPort)) != NULL)
  723.          {
  724.         CurrWindow = WINDOW_HIST;
  725.         HandleInput(message);
  726.         if(!HistWindow)
  727.             break;
  728.          }
  729.     if(CoordWindow)
  730.         while ((message = (struct IntuiMessage *)GetMsg(CoordWindow->UserPort)) != NULL)
  731.          {
  732.         CurrWindow = WINDOW_COORD;
  733.         HandleInput(message);
  734.         if(!CoordWindow)
  735.             break;
  736.          }
  737.      }
  738.     cleanup(NULL,0);                /* user quit, time to cleanup */
  739. }
  740.  
  741. /*============================================================================*/
  742. /*  end of MPaint.c                                  */
  743. /*============================================================================*/
  744.  
  745.  
  746.