+ uint8_ *aLightMap;
+ uint16_ nFalloffDiameter, nFalloffRadius;
+ uint16_ nLightDiameter, nLightRadius;
+ float nAccelX, nAccelY;
+ float nAccelMax;
+ float nVelocityX, nVelocityY;
+ float nVelocityMax;
+ float nXPos, nYPos;
+} SSpotLight;
+
+
+/* The entire program's operation is contained within this structure. */
+typedef struct
+{
+ /* XWindows specific variables. */
+ Display *dpy;
+ Window Win;
+ Screen *screen;
+ Pixmap source;
+ GC GraphicsContext;
+ XColor *xColors;
+ uint32_ *aColors;
+ XImage *pXImage;
+#ifdef HAVE_XSHM_EXTENSION
+ XShmSegmentInfo XShmInfo;
+ Bool bUseShm;
+#endif /* HAVE_XSHM_EXTENSION */
+
+ uint8_ nColorCount; /* Number of colors used. */
+ uint8_ bytesPerPixel;
+ uint16_ iWinWidth, iWinHeight;
+ uint16_ *aBumpMap; /* The actual bump map. */
+ SSpotLight SpotLight;
+
+ int delay;
+ int duration;
+ time_t start_time;
+
+ async_load_state *img_loader;
+} SBumps;
+
+
+static void SetPalette(Display *, SBumps *, XWindowAttributes * );
+static void InitBumpMap(Display *, SBumps *, XWindowAttributes * );
+static void InitBumpMap_2(Display *, SBumps *);
+static void SoftenBumpMap( SBumps * );
+
+
+
+
+/* This function pointer will point to the appropriate PutPixel*() function below. */
+static void (*MyPutPixel)( int8_ *, uint32_ );
+
+static void PutPixel32( int8_ *pData, uint32_ pixel )
+{
+ *(uint32_ *)pData = pixel;
+}
+
+static void PutPixel24( int8_ *pData, uint32_ pixel )
+{
+ pData[ 2 ] = ( pixel & 0x00FF0000 ) >> 16;
+ pData[ 1 ] = ( pixel & 0x0000FF00 ) >> 8;
+ pData[ 0 ] = ( pixel & 0x000000FF );
+}
+
+static void PutPixel16( int8_ *pData, uint32_ pixel )
+{
+ *(uint16_ *)pData = (uint16_)pixel;
+}
+
+static void PutPixel8( int8_ *pData, uint32_ pixel )
+{
+ *(uint8_ *)pData = (uint8_)pixel;
+}
+
+/* Creates the light map, which is a circular image... going from black around the edges
+ * to white in the center. */
+static void CreateSpotLight( SSpotLight *pSpotLight, uint16_ iDiameter, uint16_ nColorCount )
+{
+ double nDist;
+ int16_ iDistX, iDistY;
+ uint8_ *pLOffset;