home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / disk / misc / dcmp / source / source.lha / pointer.c < prev    next >
C/C++ Source or Header  |  1992-10-02  |  10KB  |  335 lines

  1. /*------------------------------------------------*
  2.   $Id: pointer.c,v 1.5 92/11/03 17:14:37 tf Exp $
  3.   MousePointer images and support functions
  4.   written by Tobias Ferber on 17-Feb-92
  5.  *------------------------------------------------*/
  6.  
  7. #include <exec/types.h>
  8. #include <exec/memory.h>
  9. #include <intuition/intuition.h>
  10. #include <intuition/intuitionbase.h>
  11. #include <intuition/preferences.h>
  12.  
  13. static char rcs_id[] = "$Id: pointer.c,v 1.5 92/11/03 17:14:37 tf Exp $";
  14.  
  15. /*
  16.  * This code imports both:
  17.  */
  18.  
  19. extern struct IntuitionBase *IntuitionBase;
  20. extern struct GfxBase *GfxBase;
  21.  
  22. /*
  23.  * A mouse pointer is nothing else than a sprite. Here we expect the
  24.  * mouse pointer to be sprite #0 (with color registers 17,18 and 19)
  25.  * Sprites are handled with the SpriteImage structure which *MUST*
  26.  * be located in CHIP memory (!)  This structure looks as follows:
  27.  *
  28.  * struct SpriteImage
  29.  * { USHORT posctl[2];         * used by simple sprite machine
  30.  *   USHORT data[HEIGHT][2];   * actual sprite image, 2 planes
  31.  *   USHORT reserved[2];       * initialized to 0x0,0x0
  32.  * };
  33.  *
  34.  */
  35.  
  36. #define SPRITEIMAGE_SIZE(h) (4+4*(h)+4)
  37.  
  38. /*
  39.  * We need this to restore the old color map
  40.  */
  41.  
  42. static USHORT MouseColors[3];
  43.  
  44. #define SetColor(vp,reg,val) SetRGB4(vp,reg,((val)>>8)&0x0F,   \
  45.                                             ((val)>>4)&0x0F,   \
  46.                                             ((val)>>0)&0x0F )
  47.  
  48.  
  49. /*
  50.  * FUNCTIONs
  51.  *
  52.  *   SaveMouseColors(), ResoreMouseColors()
  53.  *
  54.  * SYNOPSIS
  55.  *
  56.  *   void SaveMouseColors(Window);
  57.  *   void RestoreMouseColors(Windo);
  58.  *
  59.  *   struct Window *Window;
  60.  *
  61.  * DESCRIPTION
  62.  *
  63.  *   Save/resore the curent mouse pointer colors in the given window.
  64.  *   The mouse pointer is assumed to be sprite #0 and so (only) the color
  65.  *   registers 17, 18 and 19 are saved.
  66.  *
  67.  * NOTE
  68.  *
  69.  *   RestoreMouseColors() can only restore the *LAST* saved colors.
  70.  */
  71.  
  72. void SaveMouseColors(struct Window *Window)
  73. { struct ColorMap *cm= Window->WScreen->ViewPort.ColorMap;
  74.   MouseColors[0]= GetRGB4(cm,17);
  75.   MouseColors[1]= GetRGB4(cm,18);
  76.   MouseColors[2]= GetRGB4(cm,19);
  77. }
  78.  
  79. void RestoreMouseColors(struct Window *Window)
  80. { struct ViewPort *vp= &Window->WScreen->ViewPort;
  81.   SetColor(vp,17,MouseColors[0]);
  82.   SetColor(vp,18,MouseColors[1]);
  83.   SetColor(vp,19,MouseColors[2]);
  84. }
  85.  
  86. /*
  87.  * FUNCTION
  88.  *
  89.  *   SetMousePointer -- Change the mouse pointer image in a window
  90.  *
  91.  * SYNOPSIS
  92.  *
  93.  *   image= SetMousePointer(Window, data, height, width, dx, dy, colors);
  94.  *
  95.  *   struct SpriteImage *image;
  96.  *   struct Window *Window;
  97.  *   USHORT data[height][2];
  98.  *   WORD   height, width;
  99.  *   WORD   dx, dy;
  100.  *   USHORT colors[3];
  101.  *
  102.  * DESCRIPTION
  103.  *
  104.  *   Set the mouse pointer image in the given window.  The image `data' does
  105.  *   *NOT* need to be located in CHIP memory, `height' and `width' define the
  106.  *   image dimensions.  The mouse pointer is expected to be sprite 0 and so
  107.  *   it's `colors' (reg. 17,18,19) will be set according to the given color
  108.  *   table.  The hot spot is set to (-dx|-dy).
  109.  *   A pointer to the allocated SpriteImage structure will be returned, NULL
  110.  *   if there was an error.
  111.  *
  112.  * NOTE
  113.  *
  114.  *   Maximum width for sprites is 16 !
  115.  *   Do not forget to UnsetMousePointer() before calling SetMousePointer()
  116.  *   again or before closing your window !
  117.  */
  118.  
  119. USHORT *SetMousePointer(Window, data, height, width, dx, dy, colors)
  120. struct Window *Window;
  121. USHORT *data;
  122. WORD height, width, dx,dy;
  123. USHORT colors[3];
  124. { USHORT *image= (USHORT *)AllocMem(SPRITEIMAGE_SIZE(height),MEMF_CHIP|MEMF_CLEAR);
  125.   if(image)
  126.   { int i;
  127.     USHORT *ptr= &image[2];  /* pointer to SpriteImage->data */
  128.     for(i=0; i<height; i++)
  129.     { *ptr++ = *data++;  /* copy plane 0 */
  130.       *ptr++ = *data++;  /* copy plane 1 */
  131.     }
  132.     SaveMouseColors(Window);
  133.     SetPointer(Window, image, height, width, dx, dy);
  134.     if(colors)
  135.     { struct ViewPort *vp= &Window->WScreen->ViewPort;
  136.       SetColor(vp,17,colors[0]);
  137.       SetColor(vp,18,colors[1]);
  138.       SetColor(vp,19,colors[2]);
  139.     }
  140.   }
  141.   return(image);
  142. }
  143.  
  144. /*
  145.  * and...
  146.  */
  147.  
  148. void UnsetMousePointer(struct Window *Window, USHORT *image, WORD height)
  149. { if(image) FreeMem(image,SPRITEIMAGE_SIZE(height));
  150.   ClearPointer(Window);
  151.   RestoreMouseColors(Window);
  152. }
  153.  
  154. /*
  155.  * FUNCTIONs
  156.  *
  157.  *   FlipPointerX(),FlipPointerY(),FlipPointerZ()
  158.  *
  159.  * SYNOPSIS
  160.  *
  161.  *   void FlipPointerX(Window);
  162.  *   void FlipPointerY(Window);
  163.  *   void FlipPointerZ(Window);
  164.  *
  165.  *   struct Window *Window;
  166.  *
  167.  * DESCRIPTION
  168.  *
  169.  *   Flip the current mouse pointer image either along the x-axis (horizontally)
  170.  *   or along the y-axis (vertically).  FlipPointerZ() will simply swap the 2
  171.  *   planes of the current pointer.  In any case we will me flip the hot spot
  172.  *   with the image.
  173.  *
  174.  */
  175.  
  176. void FlipPointerX(struct Window *Window)
  177. { if(Window->Pointer && Window->PtrHeight > 0)
  178.   { BYTE height= Window->PtrHeight,
  179.           width= Window->PtrWidth,
  180.              dy= Window->YOffset,
  181.              dx= -(15+ Window->XOffset);
  182.                  /* ^ NOT Window->PtrWidth! (we flipped a WORD!) */
  183.     USHORT t, *image= Window->Pointer,
  184.                *data= &Window->Pointer[2]; /* SpriteImage->data */
  185.     int i, r, n= 2* Window->PtrHeight;
  186.     ClearPointer(Window);
  187.     for(i=0; i<n; i++)
  188.     { t= 0;
  189.       for(r=0; r<16; r++)
  190.         t |= ( ((data[i]>>r) & 0x0001) << (15-r) );
  191.       data[i]= t;
  192.     }
  193.     SetPointer(Window,image,height,width,dx,dy);
  194.   }
  195. }
  196.  
  197. void FlipPointerY(struct Window *Window)
  198. { if(Window->Pointer && Window->PtrHeight > 1)
  199.   { BYTE height= Window->PtrHeight,
  200.           width= Window->PtrWidth,
  201.              dx= Window->XOffset,
  202.              dy= -(Window->PtrHeight+Window->YOffset);
  203.     ULONG t, *ptr= (ULONG *)Window->Pointer; /* SpriteImage */
  204.     int i, n= 1+ Window->PtrHeight;
  205.     ClearPointer(Window);
  206.     for(i=1; i<=n/2; i++)  /* begin with i=1: SpriteImage->data */
  207.     { t= ptr[i];
  208.       ptr[i]= ptr[n-i];
  209.       ptr[n-i]= t;
  210.     }
  211.     SetPointer(Window,ptr,height,width,dx,dy);
  212.   }
  213. }
  214.  
  215. void FlipPointerZ(struct Window *Window)
  216. { if(Window->Pointer && Window->PtrHeight > 0);
  217.   { USHORT t, *ptr= &Window->Pointer[2];
  218.     int i, height= Window->PtrHeight;
  219.     for(i=0; i<2*height; i+=2)
  220.     { t= ptr[i];
  221.       ptr[i]= ptr[i+1];
  222.       ptr[i+1]= t;
  223.     }
  224.   }
  225. }
  226.  
  227. #include "images.h"  /* images.S declarations */
  228.  
  229. struct PointerImage
  230. { USHORT *Data;            /* the pointer matrix */
  231.   WORD Height, Width;      /* the dimensions */
  232.   WORD xOffset, yOffset;   /* the hot spot position */
  233.   UWORD *ColorTable;       /* the sprite colors */
  234.   USHORT *Image;           /* the SpriteImage structure */
  235. };
  236.  
  237. struct PointerImage PointerImages[] = {
  238.   (USHORT *)NULL,                  0, 0, 0, 0,(USHORT *)NULL,         NULL,
  239.   (USHORT *)&GlovePointer[0][0],  14,15, 0, 0,&GloveColors[0],        NULL,
  240.   (USHORT *)&GrabbingGlove[0][0], 14,15, 0, 0,&GloveColors[0],        NULL,
  241.   (USHORT *)&SleepingGlove[0][0], 14,15, 0, 0,&GloveColors[0],        NULL,
  242.   (USHORT *)&DragingGlove[0][0],  12,15,-4,-6,&GloveColors[0],        NULL,
  243.   (USHORT *)&Nessie[0][0],        16,16, 0,-6,&NessieColors[0],       NULL,
  244.   (USHORT *)&BusyBee[0][0],       16,16, 0, 0,&BusyBeeColors[0],      NULL,
  245.   (USHORT *)&ZZBubble[0][0],      22,15,-5, 0,&ZZBubbleColors[0],     NULL,
  246.   (USHORT *)&StopWatch[0][0],     16,16,-5, 0,&StopWatchColors[0],    NULL,
  247.   (USHORT *)&HourGlass[0][0],     24,15, 0, 0,&HourGlassColors[0],    NULL,
  248.   (USHORT *)&DottyPointer[0][0],  13,14, 0, 0,&DottyPointerColors[0], NULL,
  249.   (USHORT *)&Standard20[0][0],    11,11, 0, 0,&Standard20Colors[0],   NULL,
  250.   (USHORT *)&CrossHair[0][0],     13,13,-6,-6,&CrossHairColors[0],    NULL,
  251.   (USHORT *)&TinyPointer[0][0],    5, 5, 0, 0,&TinyColors[0],         NULL,
  252.   (USHORT *)&BugPointer[0][0],    12,11,-6,-2,&BugPointerColors[0],   NULL,
  253.   (USHORT *)&Invisible[0][0],      1,16, 0, 0,(USHORT *)NULL,         NULL,
  254. };
  255.  
  256. /* image numbers */
  257.  
  258. #define SMI_NONE         -1
  259. #define SMI_PREFS         0
  260. #define SMI_KLONDIKE      1
  261. #define SMI_GRABGLOVE     2
  262. #define SMI_SLEEPGLOVE    3
  263. #define SMI_DRAGGLOVE     4
  264. #define SMI_NESSIE        5
  265. #define SMI_BUSYBEE       6
  266. #define SMI_ZZBUBBLE      7
  267. #define SMI_STOPWATCH     8
  268. #define SMI_HOURGLASS     9
  269. #define SMI_DOTTY        10
  270. #define SMI_STANDARD20   11
  271. #define SMI_CROSSHAIR    12
  272. #define SMI_TINY         13
  273. #define SMI_BUG          14
  274. #define SMI_INVISIBLE    15
  275.  
  276. /* current pointer image */
  277.  
  278. static struct PointerImage *cpi= (struct PointerImage *)NULL;
  279.  
  280. /*
  281.  * FUNCTION
  282.  *
  283.  *   SetPointerImage() -- Set a pre-defined pointer image in a window
  284.  *
  285.  * SYNOPSIS
  286.  *
  287.  *   void SetPointerImage(Window, num);
  288.  *
  289.  *   struct Window *Window;
  290.  *   int num;                 * should be one of SMI_xxxxx defined in pointer.h
  291.  *
  292.  * DESCRIPTION
  293.  *
  294.  *   Set the mouse pointer image in the given window.  The pre-defined images
  295.  *   are taken from "images.S".
  296.  *
  297.  * NOTE
  298.  *
  299.  *   Do not forget to UnsetMouseImage() i.e. SetMouseImage(SMI_NONE) before
  300.  *   closing your window !
  301.  */
  302.  
  303. void SetMouseImage(struct Window *Window,int num)
  304. { if(cpi && cpi->Image)
  305.   { UnsetMousePointer(Window, cpi->Image, cpi->Height);
  306.     cpi->Image= (USHORT *)NULL;
  307.     cpi= (struct PointerImage *)NULL;
  308.   }
  309.   else SaveMouseColors(Window);  /* first call */
  310.  
  311.   if(num>=0) cpi= &PointerImages[num];
  312.  
  313.   if(num==0) /* Set the preferences mouse pointer */
  314.   { struct Preferences prefs;
  315.     GetPrefs(&prefs, sizeof(struct Preferences));
  316.  
  317.     /* init values for UnsetMousePointer() */
  318.  
  319.     cpi->Height= 16; /* Kickstart 1.3 standard height */
  320.  
  321.     /* Preferences.PointerMatrix[] is a SpriteImage structure */
  322.  
  323.     cpi->Image= SetMousePointer(Window, &prefs.PointerMatrix[2], 16, 16,
  324.                                 prefs.XOffset, prefs.YOffset, &prefs.color17);
  325.   }
  326.   else if(num>0)
  327.   { cpi->Image= SetMousePointer(Window, cpi->Data,
  328.                                         cpi->Height,
  329.                                         cpi->Width,
  330.                                         cpi->xOffset,
  331.                                         cpi->yOffset,
  332.                                         cpi->ColorTable );
  333.   }
  334. }
  335.