FILE: Animate.exe Palette Animation in Windows

ID: Q74799


The information in this article applies to:
  • Microsoft Windows Software Development Kit (SDK) 3.1


SUMMARY

"Animation" of the Windows palette is the replacement of one set of colors in the palette by another set of colors. This article discusses animation and how it is used in a Windows-based application. Animate.exe is a sample application that enables you to draw a color wheel and "spin" it using animation can be found in the Microsoft Software Library.


MORE INFORMATION

The following files are available for download from the Microsoft Download Center. Click the file names below to download the files:

Animate.exe

For more information about how to download files from the Microsoft Download Center, please visit the Download Center at the following Web address

http://www.microsoft.com/downloads/search.asp
and then click How to use the Microsoft Download Center.

For an example of animation, consider a chain of rectangles on the screen:

  +------+ +------+ +------+ +------+ +------+ +------+
  |      | |      | |      | |      | |      | |      |
  |idx 20| |idx 21| |idx 22| |idx 20| |idx 21| |idx 22| ...
  |      | |      | |      | |      | |      | |      |
  +------+ +------+ +------+ +------+ +------+ +------+ 
If index 20 is mapped to the color green in the palette, index 21 is mapped to red, and index 22 is mapped to blue, a "Broadway Lights" effect can be achieved by remapping the three colors to the different indexes. For example, mapping red to 20, blue to 21, and green to 22, the "lights" appears to move to the left.

Changing the hardware registers (the system palette) is much faster than redrawing the rectangles, because no pixels need to be updated. Only a very small set of hardware registers need to be changed. This allows for very fast graphical effects.

With video systems capable of supporting 256 colors, these hardware registers are changed through palette animation, and the GDI call, AnimatePalette() was specifically designed for this purpose.

This article is meant to be a supplement to the information provided in the Windows Software Development Kit (SDK) manuals, not a replacement. This article will discuss the actual steps necessary to create and use a palette in an application from a programmer's standpoint.

Q: What is the difference between a logical palette and the lpPaletteColors as referenced in the AnimatePalette() function description?

A: The logical palette is the one made by CreatePalette(), while the lpPaletteColors is a pointer to a separate memory structure that holds the animation colors. For this article, the term "animation palette" will be used to refer to the memory structure pointed to by lpPaletteColors.

Q: What special considerations are necessary for animation?

A: There are two necessary considerations.
  • The palette entry in the logical palette must have theb PC_RESERVED flag. A typical line of code that will be placed into the application prior to the CreatePalette() call to set this flag will be:


  • 
       pLogPal->palPalEntry[PaletteIndex].peFlags = PC_RESERVED; 
  • For ease of programming and animation, sequential indexes for the animated colors in the logical palette should be used. This will allow the smallest possible array to be used to contain the animation palette, and will produce a one-to-one correspondence between the logical palette and the animation palette.


Q: How is palette animation actually done?

A: There are two steps to animating the Palette:
  1. Change the color values in the animation palette to create the desired effect. The following example shifts the colors in the animation palette down one index:


  2. 
       PALETTEENTRY   palentries[210];  /* The animation palette */ 
    
       ...
    
       palentry.peRed   = palentries[209].peRed;
       palentry.peGreen = palentries[209].peGreen;
       palentry.peBlue  = palentries[209].peBlue;
    
       for (i = 209; i > 0; i--)
         {
         palentries[i].peRed   = palentries[i-1].peRed;
         palentries[i].peGreen = palentries[i-1].peGreen;
         palentries[i].peBlue  = palentries[i-1].peBlue;
        }
    
       palentries[0].peRed   = palentry.peRed;
       palentries[0].peGreen = palentry.peGreen;
       palentries[0].peBlue  = palentry.peBlue; 
  3. Call AnimatePalette(). The following example will animate the 210 entries starting at index number 20:


  4. 
       hDC = GetDC(hWnd);
    
       hOldPal = SelectPalette(hDC, hPal, FALSE);
    
       // Call Animate Palette, and realize the colors
       AnimatePalette(hPal, 20, 210, (LPPALETTEENTRY)palentries);
    
       RealizePalette(hDC);
    
       // Housekeep
       SelectPalette(hDC, hOldPal, TRUE);
       ReleaseDC(hWnd, hDC); 

Additional query words:

Keywords : kbfile kbsample kb16bitonly kbGDI kbPalettes kbSDKWin16
Version : WINDOWS:3.1
Platform : WINDOWS
Issue type : kbinfo


Last Reviewed: December 2, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.