[lazarus] Bitmap transparency?
Mattias Gaertner
nc-gaertnma at netcologne.de
Mon Nov 10 18:05:24 EST 2003
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.
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.
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.
Mattias
More information about the Lazarus
mailing list