[lazarus] Bitmap transparency?

Micha Nelissen M.Nelissen at student.tue.nl
Tue Nov 11 02:00:55 EST 2003

Mattias Gaertner wrote:

> On Mon, 10 Nov 2003 08:23:10 +0100
> Micha Nelissen <M.Nelissen at student.tue.nl> wrote:
>>Mattias Gaertner wrote:
>>>On Sun, 09 Nov 2003 18:23:39 +0100
>>>Micha Nelissen <M.Nelissen at student.tue.nl> wrote:
>>>>Mattias Gaertner wrote:
>>>>>On Sun, 09 Nov 2003 15:08:06 +0100
>>>>>Micha Nelissen <M.Nelissen at student.tue.nl> wrote:
>>>>>>I have been looking, but I can't find it in the archives / code: what 
>>>>>>functions do I need to implement?
>>>>>See winapih.inc, search for RawImage.
>>>>>See graphtype.pp for the RawImage format. 
>>>>>intfgraphics.pas contains the TLazIntfImage which uses the 5 functions.
>>>>Is GetDescriptionFromDevice only used to create a device compatible 
>>>I guess, you mean the right thing.
>>>GetDescriptionFromDevice should return only a RawImage description. No
>>>width, no height. Just the information about color depth, bits per
>>>pixel,... . No real data. This information is used to calculate the
>>>needed memory and to know, how to set pixels.
>>Ok, so what fields need to be filled in GetDescriptionFromDevice?
> For the default, simply use FillChar(,0);.
> Set all except the -
>     Format: TRawImageColorFormat;
>     HasPalette: boolean; 
>     Depth: cardinal; 
> -   Width: cardinal;
> -   Height: cardinal;
> -   PaletteColorCount: integer;
>     ByteOrder: TRawImageByteOrder;
>     LineOrder: TRawImageLineOrder;
> -   ColorCount: cardinal; 
>     BitsPerPixel: cardinal;
>     LineEnd: TRawImageLineEnd;
>     RedPrec: cardinal; 
>     RedShift: cardinal;
>     GreenPrec: cardinal;
>     GreenShift: cardinal;
>     BluePrec: cardinal;
>     BlueShift: cardinal;
>     AlphaPrec: cardinal;
>     AlphaShift: cardinal;
>     AlphaSeparate: boolean;
>     AlphaBitsPerPixel: cardinal; 
>     AlphaLineEnd: TRawImageLineEnd;
>>>>If so, this can be done in win32 via CreateCompatibleBitmap. 
>>>>Retrieving all information requested by TRawImageDescription from a 
>>>>device context is very tedious, requires handling several cases (because
>>>>in win32 objective a DC is a 'stateless' something to be drawn to).
>>>>Second reason is that the following lcl call CreateBitmapFromRawImage 
>>>>will use CreateBitmap which is not recommended by the win32 docs for 
>>>>most bitmaps:
>>>>While the CreateBitmap function can be used to create color bitmaps, for
>>>>performance reasons applications should use CreateBitmap to create 
>>>>monochrome bitmaps and CreateCompatibleBitmap to create color bitmaps. 
>>>>When a color bitmap returned from CreateBitmap is selected into a device
>>>>context, Windows must ensure that the bitmap matches the format of the 
>>>>device context it is being selected into. 
>>>Sounds like what we want. With the information in the RawImage
>>>description the data created already matches the color format. The
>>>interface only needs to setup the header.
>>>The idea is to implement "CreateCompatibleBitmap" in a platform
>>>independent way.
>>>Under win32 afaik you would normally use CreateCompatibleBitmap to
>>>create a bitmap. 
>>The 'compatible' in CreateCompatibleBitmap means compatible to some DC. 
>>With the current 5 fpimage functions, this function cannot be used, 
>>because I don't know what DC to create a compatible bitmap to.
>>What I was trying to say is: in the example at the top of the 
>>intfgraphics unit, there is the sequence (GetDescriptionFromDevice, 
>>CreateBitmap); my question is: is GetDescriptionFromDevice in any other 
>>context? Ie. is it used for anything else than calling CreateBitmap 
>>later on? Otherwise we could remove the GetDescriptionFromDevice and 
>>replace it with CreateBitmapCompatibleToDevice, as you suggested later 
>>in this post.
> The goal of TLazIntfImage/fpImage is not only to handle interface images,
> but to work with them. If an application needs information about the image
> format of a DC, why should it create a bitmap? So, I think,
> GetDescriptionFromDevice is a useful function.

Ok, in my recent commit I have implemented it except for the RedPrec and 
shift etc.

> If the win32 intf needs to create a bitmap to get the needed information, it
> can create a small bitmap 1x1 and release it instantly.

Ok. I'll come up with something.

> About CreateBitmapCompatibleToDevice:
> I think, you are right. It does not make much sense to create a RawImage
> from incompatible data. The conversion process should be done by
> TLazIntfImage and not by the interface. So, I think, I will change
> TLazIntfmage to store a DC and to use CreateBitmapCompatibleToDevice instead
> of CreateBitmapFromRawImage. But then we also need a function
> CreateBitmapCompatibleToBitmap.

CreateBitmapCompatibleToBitmap? Nice challenge... :). Ah, there is a 
CreateBitmapIndirect too. It should be doable.



More information about the Lazarus mailing list