home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / OTL-MC7.DMS / in.adf / classsource.lha / ClassSource / BOOPSI / images / picture.c < prev   
Encoding:
C/C++ Source or Header  |  1995-02-12  |  4.3 KB  |  192 lines

  1. #include <classes/BOOPSI/images.h>
  2. #include <classes/BOOPSI/boopsilib.h>
  3.  
  4. #pragma -
  5. #include <pragma/utility_lib.h>
  6. #include <clib/alib_protos.h>
  7. #include <pragma/intuition_lib.h>
  8. #include <pragma/graphics_lib.h>
  9. #pragma +
  10.  
  11. struct InstanceData {
  12.     struct Image *image;
  13.     UWORD bpen;
  14. };
  15.  
  16. PictureClass::PictureClass()
  17.     : BoopsiClass(sizeof(struct InstanceData),(ULONG (*)()) &dispatcher,IMAGECLASS,NULL)
  18. {
  19. }
  20.  
  21. ULONG PictureClass::dispatcher(Class *cl, Object *o, Msg msg)
  22. {
  23.     struct InstanceData *data;
  24.     ULONG retval = FALSE;
  25.     switch (msg->MethodID)
  26.     {
  27.         case OM_NEW:
  28.         {
  29.             Object *object;
  30.             if (object = (Object *) DoSuperMethodA(cl,o,msg))
  31.             {
  32.                 data = (struct InstanceData *) INST_DATA(cl,object);
  33.                 data->image = NULL;
  34.                 data->bpen = BACKGROUNDPEN;
  35.                 TagItemCursorC tic(((struct opSet *) msg)->ops_AttrList);
  36.                 while (!tic.isDone()) {
  37.                     /* register */ ULONG ticData = tic.itemData();
  38.                     switch (tic.itemTag())
  39.                     {
  40.                         case IA_BGPen:
  41.                             data->bpen = (UWORD) ticData;
  42.                             break;
  43.                         case PICA_Image:
  44.                             data->image = (struct Image *) ticData;
  45.                             break;
  46.                         default:
  47.                             break;
  48.                     };
  49.                     tic.next();
  50.                 };
  51.                 retval = (ULONG) object;
  52.             };
  53.             break;
  54.         };
  55.         case OM_DISPOSE:
  56.         {
  57.             data = (struct InstanceData *) INST_DATA(cl,o);
  58.             retval = DoSuperMethodA(cl,o,msg);
  59.             break;
  60.         };
  61.         case OM_GET:
  62.         {
  63.             data = (struct InstanceData *) INST_DATA(cl,o);
  64.             switch (((struct opGet *) msg)->opg_AttrID)
  65.             {
  66.                 case IA_Left:
  67.                     *(((struct opGet *) msg)->opg_Storage) = ((struct Gadget *) o)->LeftEdge;
  68.                     retval = TRUE;
  69.                     break;
  70.                 case IA_Top:
  71.                     *(((struct opGet *) msg)->opg_Storage) = ((struct Gadget *) o)->TopEdge;
  72.                     retval = TRUE;
  73.                     break;
  74.                 case IA_Width:
  75.                     *(((struct opGet *) msg)->opg_Storage) = ((struct Gadget *) o)->Width;
  76.                     retval = TRUE;
  77.                     break;
  78.                 case IA_Height:
  79.                     *(((struct opGet *) msg)->opg_Storage) = ((struct Gadget *) o)->Height;
  80.                     retval = TRUE;
  81.                     break;
  82.                 case IA_BGPen:
  83.                     *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->bpen;
  84.                     retval = TRUE;
  85.                     break;
  86.                 case PICA_Image:
  87.                     *(((struct opGet *) msg)->opg_Storage) = (ULONG) data->image;
  88.                     retval = TRUE;
  89.                     break;
  90.                 default:
  91.                     retval = DoSuperMethodA(cl,o,msg);
  92.                     break;
  93.             };
  94.             break;
  95.         };
  96.         case OM_SET:
  97.         {
  98.             data = (struct InstanceData *) INST_DATA(cl,o);
  99.             TagItemCursorC tic(((struct opSet *) msg)->ops_AttrList);
  100.             while (!tic.isDone()) {
  101.                 /* register */ ULONG ticData = tic.itemData();
  102.                 switch (tic.itemTag())
  103.                 {
  104.                     case IA_BGPen:
  105.                         data->bpen = (UWORD) ticData;
  106.                         break;
  107.                     case PICA_Image:
  108.                         data->image = (struct Image *) ticData;
  109.                         break;
  110.                     default:
  111.                         break;
  112.                 };
  113.                 tic.next();
  114.             };
  115.             retval = DoSuperMethodA(cl,o,msg);
  116.             break;
  117.         };
  118.         case IM_DRAW:
  119.         {
  120.             data = (struct InstanceData *) INST_DATA(cl,o);
  121.             render(cl,(struct Image *) o, (struct impDraw *) msg, data);
  122.             break;
  123.         };
  124. /*
  125.         case IM_HITTEST:
  126.         {
  127.             retval = TRUE;
  128.             break;
  129.         };
  130.         case IM_ERASE:
  131.         {
  132.             data = (struct InstanceData *) INST_DATA(cl,o);
  133.             break;
  134.         };
  135.         case IM_DRAWFRAME:
  136.         {
  137.             data = (struct InstanceData *) INST_DATA(cl,o);
  138.             render(cl,(struct Image *) o, (struct impDraw *) msg, data);
  139.             break;
  140.         };
  141.         case IM_HITFRAME:
  142.         {
  143.             retval = TRUE;
  144.             break;
  145.         };
  146.         case IM_ERASEFRAME:
  147.         {
  148.             data = (struct InstanceData *) INST_DATA(cl,o);
  149.             break;
  150.         };
  151.         case IM_FRAMEBOX:
  152.         {
  153.             data = (struct InstanceData *) INST_DATA(cl,o);
  154.             break;
  155.         };
  156. */
  157.         default:
  158.         {
  159.             retval = DoSuperMethodA(cl,o,msg);
  160.             break;
  161.         };
  162.     };
  163.     return retval;
  164. }
  165.  
  166. ULONG PictureClass::render(Class *cl, struct Image *im,
  167.     struct impDraw *msg, struct InstanceData *data)
  168. {
  169.     WORD x = im->LeftEdge + msg->imp_Offset.X;
  170.     WORD y = im->TopEdge + msg->imp_Offset.Y;
  171.     if (msg->imp_DrInfo)
  172.         SetAPen(msg->imp_RPort,msg->imp_DrInfo->dri_Pens[data->bpen])
  173.     else
  174.         SetAPen(msg->imp_RPort,0);
  175.     SetDrMd(msg->imp_RPort,JAM1);
  176.     RectFill(msg->imp_RPort, x, y,
  177.      x + im->Width - 1, y + im->Height - 1);
  178.     SuperDrawImageState(msg->imp_RPort, data->image,NULL,
  179.         im->LeftEdge + msg->imp_Offset.X,
  180.         im->TopEdge + msg->imp_Offset.Y,
  181.         im->Width, im->Height,
  182.         msg->imp_State, msg->imp_DrInfo);
  183.     return TRUE;
  184. }
  185.  
  186. // *************************************************************
  187.  
  188. PictureClass PictureC::pic;
  189.  
  190. // *************************************************************
  191.  
  192.