This is a scratch pad for the Shaped Windows Google Summer of Code 2010 project, by Eli Gottlieb
The code is available here: http://hg.libsdl.org/SDL-gsoc2010_shaped_windows
Status
Documentation
Notes
Pre-Processing
Possible pre-processing pipeline:
input_mask surface -(1)-> 8bit alpha -(2)-> 1bit mask -(3)-> 2D region -(4)-> arch specific set shape
- some setting may be needed for this step, like a key color
- optional, may be enabled via a mode or when architecture needs it
- optional, depends on architecture requirements
- this internal function can receive pointers to all the above and use what it needs
Windows
Regions
Most commonly used is code that essentially sets a "region" which defines which pixels are shown and which are not. Most algorithms uses the Win32 region functions to compose this shape which is simple but works. In any case, the input to this process is a binarized (1bit) image. Note that you don't get any "blending" on the edges with this approach.
Here some other sample code:
Sets shape by generating regions: http://comrade.ownz.com/docs/shapewnd.html
Shape of Form by using background key color: http://msdn.microsoft.com/en-us/beginner/cc963986.aspx
Setting per-Window alpha: http://msdn.microsoft.com/en-us/beginner/cc963986.aspx
Form app in .Net calling the Win32 Api: http://www.codeproject.com/KB/miscctrl/AlphaForm.aspx
Great summary with examples for all modes in Delphi: http://melander.dk/articles/alphasplash/
Layered Window
Now there is another way to provide transparency using a alpha-bitmap in Windows. The API now is the UpdateLayeredWindow() call:
MSDN info: http://msdn.microsoft.com/en-us/library/ms633556%28VS.85%29.aspx
Sample code: http://www.nuonsoft.com/blog/2009/05/27/how-to-use-updatelayeredwindow/
Even with this approach a shape may still be important to get rid of clicks to the window - a window that is almost transparent (i.e. alpha=1) seems to have no shape, but will still receive clicks on those pixels. Note also, that the layered window API is not supported on WinCE (but the shape API is).
OSX
If Cocoa also uses also a shape, it may be good to break out a common "2D shape calculation" algorithm that applies to both architectures.
Shape Regions
Note that a shape structure made out of regions has a list of 2D points defining a polygon AND a add/delete flag. For example a doughnut is made of two circle regions, one added and one deleted.
