home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 18 / amigaformatcd18.iso / mui / mui_developer / extclasses / mcc_tron / developer / source / tron.c < prev    next >
C/C++ Source or Header  |  1997-03-10  |  8KB  |  400 lines

  1. /*
  2.  
  3.         Tron.mcc (c) Copyright 1995-96 by kmel, Klaus Melchior
  4.  
  5.         Registered MUI class, Serial Number: 0002
  6.  
  7.         tron.c
  8.  
  9. */
  10.  
  11.  
  12.  
  13.  
  14. /* SMAKE */
  15.  
  16. /*** includes ***/
  17.  
  18. #ifdef __KMEL
  19.     #include <kmel/kmel.h>
  20.     #include <kmel/kmel_debug.h>
  21.  
  22.     #include <mui/tron_mcc.h>
  23. #else
  24.     #include <clib/alib_protos.h>
  25.     #include <clib/graphics_protos.h>
  26.     #include <clib/utility_protos.h>
  27.     #include <clib/muimaster_protos.h>
  28.     #include <pragmas/muimaster_pragmas.h>
  29.     #include <libraries/mui.h>
  30.  
  31.     #if MUIMASTER_VLATEST <= 14
  32.         #include "mui/mui33_mcc.h"
  33.     #endif
  34.  
  35.     #include "mui/tron_mcc_private.h"
  36.  
  37.     #define DB / ## /
  38. #endif
  39.  
  40.  
  41. #define D / ## /
  42.  
  43.  
  44. #define CLASS       MUIC_Tron
  45. #define SUPERCLASS  MUIC_Area
  46.  
  47. struct Data
  48. {
  49.     LONG  Pen1;
  50.     LONG  Pen2;
  51.     LONG  PenB;
  52.     LONG  Speed;
  53.  
  54.     struct MUI_RenderInfo *mri;
  55.     BOOL refresh;
  56.     BOOL showhide;
  57. };
  58.  
  59. #include "rev/Tron.mcc.rev"
  60.  
  61. #define UserLibID "$VER: " __VERS " (" __DATE ") " __VERSCR
  62. #define VERSION __VERSION
  63. #define REVISION __REVISION
  64. #define MASTERVERSION 14
  65.  
  66. #include "mui/mccheader.c"
  67.  
  68.  
  69. /*** subs ***/
  70.  
  71. void release_pen(struct MUI_RenderInfo *mri, LONG *pen)
  72. {
  73.     if(*pen != -1)
  74.     {
  75.         /*** only valid between Setup/Cleanup ! ***/
  76.         if(mri)
  77.             MUI_ReleasePen(mri, *pen);
  78.  
  79.         *pen = -1;
  80.     }
  81. }
  82.  
  83. void obtain_pen(struct MUI_RenderInfo *mri, LONG *pen, struct MUI_PenSpec *ps)
  84. {
  85.     /*** only valid between Setup/Cleanup ! ***/
  86.     if(mri)
  87.     {
  88.         release_pen(mri, pen);
  89.         *pen = MUI_ObtainPen(mri, ps, 0);
  90.     }
  91. }
  92.  
  93.  
  94. void RedrawAll(Object *obj, struct Data *data)
  95. {
  96.     /*** only valid between Show/Hide ! ***/
  97.     if(data->showhide)
  98.     {
  99.         SetAPen(_rp(obj), MUIPEN(data->PenB));
  100.         RectFill(_rp(obj), _mleft(obj), _mtop(obj), _mright(obj), _mbottom(obj));
  101.  
  102.         SetAPen(_rp(obj), MUIPEN(data->Pen1));
  103.         RectFill(_rp(obj), _mleft(obj), _mtop(obj), _mleft(obj) + data->Speed, _mbottom(obj));
  104.  
  105.         SetAPen(_rp(obj), MUIPEN(data->Pen2));
  106.         RectFill(_rp(obj), _mright(obj) - data->Speed, _mtop(obj), _mright(obj), _mbottom(obj));
  107.     }
  108.  
  109. }
  110.  
  111.  
  112.  
  113. ULONG ASM _New(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  114. {
  115.     struct Data *data;
  116.  
  117.     if (!(obj = (Object *)DoSuperMethodA(cl, obj, msg)))
  118.         return(0);
  119.  
  120.     /*** init data ***/
  121.     data = INST_DATA(cl, obj);
  122.  
  123.     data->Pen1    = -1;
  124.     data->Pen2    = -1;
  125.     data->PenB    = -1;
  126.     data->Speed   = DEFAULT_SPEED;
  127.  
  128.     data->mri     = NULL;
  129.     data->refresh = FALSE;
  130.  
  131.     /*** trick to set arguments ***/
  132.     msg->MethodID = OM_SET;
  133.     DoMethodA(obj, (Msg)msg);
  134.     msg->MethodID = OM_NEW;
  135.  
  136.     return((ULONG)obj);
  137. }
  138.  
  139.  
  140.  
  141. ULONG ASM _Dispose(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  142. {
  143.     return(DoSuperMethodA(cl,obj,msg));
  144. }
  145.  
  146.  
  147.  
  148. ULONG ASM _Set(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  149. {
  150.     struct Data *data = INST_DATA(cl, obj);
  151.     struct TagItem *tags,*tag;
  152.  
  153.     for(tags=((struct opSet *)msg)->ops_AttrList; tag=NextTagItem(&tags); )
  154.     {
  155.         switch(tag->ti_Tag)
  156.         {
  157.             case MUIA_Tron_Speed:
  158.                 DB("SET MUIA_Tron_Speed; %ld\n", tag->ti_Data);
  159.                 if(data->Speed != tag->ti_Data)
  160.                 {
  161.                     data->Speed = tag->ti_Data;
  162.                     data->refresh = TRUE;
  163.                 }
  164.             break;
  165.  
  166.             case MUIA_Tron_PenSpec1:
  167.                 if(data->mri)
  168.                 {
  169.                     obtain_pen(data->mri, &data->Pen1, (struct MUI_PenSpec *)tag->ti_Data);
  170.                     data->refresh = TRUE;
  171.                 }
  172.             break;
  173.  
  174.             case MUIA_Tron_PenSpec2:
  175.                 if(data->mri)
  176.                 {
  177.                     obtain_pen(data->mri, &data->Pen2, (struct MUI_PenSpec *)tag->ti_Data);
  178.                     data->refresh = TRUE;
  179.                 }
  180.             break;
  181.  
  182.             case MUIA_Tron_PenSpecB:
  183.                 if(data->mri)
  184.                 {
  185.                     obtain_pen(data->mri, &data->PenB, (struct MUI_PenSpec *)tag->ti_Data);
  186.                     data->refresh = TRUE;
  187.                 }
  188.             break;
  189.  
  190.         }
  191.     }
  192.  
  193.     if(data->refresh)
  194.     {
  195.         if(data->mri)
  196.             MUI_Redraw(obj, MADF_DRAWOBJECT);
  197.  
  198.         data->refresh = FALSE;
  199.     }
  200.  
  201.     return(DoSuperMethodA(cl, obj, msg));
  202. }
  203.  
  204.  
  205. static ULONG ASM _Get(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  206. {
  207. //    struct Data *data = INST_DATA(cl, obj);
  208.     ULONG *store = ((struct opGet *)msg)->opg_Storage;
  209.  
  210.     switch( ((struct opGet *)msg)->opg_AttrID )
  211.     {
  212.         case MUIA_Version:  *store = VERSION;  return(TRUE); break;
  213.         case MUIA_Revision: *store = REVISION; return(TRUE); break;
  214.     }
  215.  
  216.     return(DoSuperMethodA(cl, obj, msg));
  217. }
  218.  
  219.  
  220. static ULONG ASM _Setup(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) struct MUIP_Setup *msg)
  221. {
  222.     struct Data *data = INST_DATA(cl, obj);
  223.     Object *pd_obj;
  224.     ULONG l;
  225.  
  226.     if(!(DoSuperMethodA(cl,obj,(Msg)msg)))
  227.         return(FALSE);
  228.  
  229.     data->mri = msg->RenderInfo;
  230.  
  231.     /*** create objects ***/
  232.     pd_obj = MUI_NewObject(MUIC_Pendisplay, TAG_DONE);
  233.  
  234.     DB("pd_obj:%08lx\n", pd_obj);
  235.  
  236.     /*** get pen 1 ***/
  237.     if(DoMethod(obj, MUIM_GetConfigItem, MUICFG_Tron_Pen1, &l))
  238.     {
  239.         obtain_pen(data->mri, &data->Pen1, (struct MUI_PenSpec *)l);
  240.     }
  241.     else
  242.     {
  243.         if(pd_obj)
  244.         {
  245.             struct MUI_PenSpec *pen;
  246.  
  247.             DoMethod(pd_obj, MUIM_Pendisplay_SetMUIPen, DEFAULT_PEN1);
  248.             get(pd_obj, MUIA_Pendisplay_Spec, &pen);
  249.             obtain_pen(data->mri, &data->Pen1, pen);
  250.         }
  251.     }
  252.     
  253.     DB("Obtain Pen1: %ld\n", MUIPEN(data->Pen1));
  254.  
  255.     /*** get pen 2 ***/
  256.     if(DoMethod(obj, MUIM_GetConfigItem, MUICFG_Tron_Pen2, &l))
  257.     {
  258.         obtain_pen(data->mri, &data->Pen2, (struct MUI_PenSpec *)l);
  259.     }
  260.     else
  261.     {
  262.         if(pd_obj)
  263.         {
  264.             struct MUI_PenSpec *pen;
  265.  
  266.             DoMethod(pd_obj, MUIM_Pendisplay_SetMUIPen, DEFAULT_PEN2);
  267.             get(pd_obj, MUIA_Pendisplay_Spec, &pen);
  268.             obtain_pen(data->mri, &data->Pen2, pen);
  269.         }
  270.     }
  271.     DB("Obtain Pen2: %ld\n", MUIPEN(data->Pen2));
  272.  
  273.     /*** get pen B ***/
  274.     if(DoMethod(obj, MUIM_GetConfigItem, MUICFG_Tron_PenB, &l))
  275.     {
  276.         obtain_pen(data->mri, &data->PenB, (struct MUI_PenSpec *)l);
  277.     }
  278.     else
  279.     {
  280.         if(pd_obj)
  281.         {
  282.             struct MUI_PenSpec *pen;
  283.  
  284.             DoMethod(pd_obj, MUIM_Pendisplay_SetMUIPen, DEFAULT_PENB);
  285.             get(pd_obj, MUIA_Pendisplay_Spec, &pen);
  286.             obtain_pen(data->mri, &data->PenB, pen);
  287.         }
  288.     }
  289.     DB("Obtain PenB: %ld\n", MUIPEN(data->PenB));
  290.  
  291.  
  292.     /*** get speed ***/
  293.     if(DoMethod(obj, MUIM_GetConfigItem, MUICFG_Tron_Speed, &l))
  294.     {
  295.         data->Speed = *(ULONG *)l;
  296.     }
  297.     else
  298.         data->Speed = DEFAULT_SPEED;
  299.     DB("Speed: %ld\n", data->Speed);
  300.  
  301.     /*** dispose created objects ***/
  302.     if(pd_obj)
  303.         MUI_DisposeObject(pd_obj);
  304.  
  305.     return(TRUE);
  306. }
  307.  
  308.  
  309. static ULONG ASM _Cleanup(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  310. {
  311.     struct Data *data = INST_DATA(cl, obj);
  312.  
  313.     release_pen(data->mri, &data->Pen1);
  314.     release_pen(data->mri, &data->Pen2);
  315.     release_pen(data->mri, &data->PenB);
  316.  
  317.     data->mri = NULL;
  318.  
  319.     return(DoSuperMethodA(cl,obj,msg));
  320. }
  321.  
  322.  
  323. STATIC ULONG ASM _Show(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  324. {
  325.     struct Data *data = INST_DATA(cl, obj);
  326.  
  327.     data->showhide = TRUE;
  328.  
  329.     return(DoSuperMethodA(cl,obj,msg));
  330. }
  331.  
  332.  
  333. STATIC ULONG ASM _Hide(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  334. {
  335.     struct Data *data = INST_DATA(cl, obj);
  336.  
  337.     data->showhide = FALSE;
  338.  
  339.     return(DoSuperMethodA(cl,obj,msg));
  340. }
  341.  
  342.  
  343. ULONG ASM _AskMinMax(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) struct MUIP_AskMinMax *msg)
  344. {
  345.     DoSuperMethodA(cl, obj, (Msg)msg);
  346.  
  347.     msg->MinMaxInfo->MinWidth  += 20;
  348.     msg->MinMaxInfo->DefWidth  += 50;
  349.     msg->MinMaxInfo->MaxWidth  += MUI_MAXMAX;
  350.  
  351.     msg->MinMaxInfo->MinHeight += 20;
  352.     msg->MinMaxInfo->DefHeight += 50;
  353.     msg->MinMaxInfo->MaxHeight += MUI_MAXMAX;
  354.  
  355.     return(0);
  356. }
  357.  
  358. ULONG ASM _Draw(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) struct MUIP_Draw *msg)
  359. {
  360.     struct Data *data = INST_DATA(cl, obj);
  361.  
  362.     /*** first draw the superclass ***/
  363.     DoSuperMethodA(cl, obj, (Msg)msg);
  364.  
  365.     DB("_Draw\n");
  366.  
  367.     /*** move the Tron line ***/
  368.     if(msg->flags & MADF_DRAWUPDATE)
  369.     {
  370.     }
  371.     else if(msg->flags & MADF_DRAWOBJECT)
  372.     {
  373.         RedrawAll(obj, data);
  374.     }
  375.  
  376.     return(0);
  377. }
  378.  
  379.  
  380. ULONG ASM SAVEDS _Dispatcher(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  381. {
  382.     switch(msg->MethodID)
  383.     {
  384.         case OM_NEW        : return(_New      (cl,obj,(APTR)msg));
  385.         case OM_DISPOSE    : return(_Dispose  (cl,obj,(APTR)msg));
  386.         case OM_SET        : return(_Set      (cl,obj,(APTR)msg));
  387.         case OM_GET        : return(_Get      (cl,obj,(APTR)msg));
  388.  
  389.         case MUIM_Setup    : return(_Setup    (cl,obj,(APTR)msg));
  390.         case MUIM_Cleanup  : return(_Cleanup  (cl,obj,(APTR)msg));
  391.         case MUIM_Show     : return(_Show     (cl,obj,(APTR)msg));
  392.         case MUIM_Hide     : return(_Hide     (cl,obj,(APTR)msg));
  393.         case MUIM_AskMinMax: return(_AskMinMax(cl,obj,(APTR)msg));
  394.         case MUIM_Draw     : return(_Draw     (cl,obj,(APTR)msg));
  395.     }
  396.  
  397.     return(DoSuperMethodA(cl,obj,msg));
  398. }
  399.  
  400.