[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 
>>>>bitmap? 
>>>
>>>
>>>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.

Regards,

Micha.








More information about the Lazarus mailing list