Wednesday, May 14, 2008

New 0.9.26 features. Part 2. ImageList effects

I think that almost nobody knows that internally the LCL TCustomImageList contains an array of 32 bit (rgb + alpha) data. In this array the imagelist stores images in the best quality. When it is needed the imagelist use this array to create a widget set imagelist (at this moment this is only the case for the win32 widget set) with the best possible quality. Any time we can access the 32 bit image data and we can do any manipulation with it. If you ever worked with image data you should know that 32 bit data is one the easiest formats for manipulations.

But what manipulations do applications (controls) usually need? The most often used manipulation is the transform from multi-color to gray image. It is used for example in menus and bitbtns (a button with an image). The next two often used manipulations are image highlighting and shadowing, which are also used in menus and buttons.

So I added TCustomImageList.Draw(... ADrawEffect: TGraphicsDrawEffect) and TCustomImageList.GetBitmap(... AEffect: TGraphicsDrawEffect).

At this picture you can see all effects currently supported by the imagelist. And this is the description:
  1. Normal - no effect. You get an original image without any transform.
  2. Disabled - gray image. Red = Green = Blue. We get every component value by the following formula: (Red + Green + Blue) / 3.
  3. Highlighted - a bit shining image. To achieve shining we alphablend the original image with white.
  4. Shadowed - opposite of highlighted. To achieve shadowing we alphablend the original image with black.
  5. 1Bit - this effect is used for drawing bitbtn glyphs in windows applications with no theme support. Windows just cannot draw gray images - they can use only 3 colors on a button: clBtnFace (transparent), clBtnShadow and clBtnHighlight. To support disabled bitmap drawing on such buttons we have added this special effect. We are using a special formula to achieve sharp edges in order to save all image details.
Currently every bitbtn and menu use these methods to draw their glyphs. When you disable them , the gdeDisabled effect is used, when you move a mouse pointer over a control, gdeHighlight is used and when you press a control gdeShadowed is used.
Of course, these imagelist methods can be useful not only for menus and buttons - you can use them for your own controls and other needs too. And we hope you will do that. :-)


Vitaly said...

Thanks! This is a very useful feature, had to implement it myself in Delphi. Glad, you took care of it in Lazarus :)

One suggestion though, the difference between the normal and highlighted states is too subtle and thus barely visible. Could use a bit more "light" there :)

Unknown said...

Look at graphtype and suggest a better GlowShadow constant value :)

Anonymous said...
This comment has been removed by the author.
Anonymous said...

Hmm... I tried changing the value of the GlowShadow constant to 68, which gives a more distinguishable level of highlighting. However, GlowShadow affects the darkening level too, which I was happy with... Overall, 68 looks better for me, but some feedback from other Lazarus users would be nice.

Unknown said...

Ok. In r15272 I splited GlowShadow and increased Glow.

Vitaly said...

Awesome! Thanks a lot!

Android app developers said...

I got a adequate ball to appointment your blog, because its accepting the lots of arresting admonition and to accoutrement the adequate timing.

Android developer