On 6/26/06, Paul Michell <[EMAIL PROTECTED]> wrote:
Does any one know of a Linux API call that performs the same function as
StretchDIBits on Windows? I am looking for a fast way of transferring a
memory buffer containing a 24bpp image to the screen. I would like to avoid
having to add additional dependencies beyond those required for a standard
LCL program, or having to transfer to some intermediate buffer (such as a
TBitmap) first.
TtCanvas.StretchDraw works reasonably well. There are some issues,
however. I will post some code from the virtual magnifying glass to
show you how I did things differently on Windows and Unix to get both
working well when performing stretch operation:
{$IFDEF Win32}
if vConfigurations.invertColors then
begin
DestCanvas.Brush.Color := clWhite;
DestCanvas.FillRect(Bounds(ClientLeft, ClientTop, ClientWidth,
ClientHeight));
end;
StretchBlt(DestCanvas.Handle, ClientLeft, ClientTop, ClientWidth,
ClientHeight,
bmpDisplay.Canvas.Handle, ScreenRect.Left, ScreenRect.Top,
ScreenRect.Right - ScreenRect.Left, ScreenRect.Bottom -
ScreenRect.Top, dwROP);
{$ENDIF}
{$IFDEF Unix}
// Cleans the screen to solve a bug on some systems. Possibly a gtk bug
DestCanvas.Brush.Color := clWhite;
DestCanvas.FillRect(Bounds(ClientLeft, ClientTop, ClientWidth,
ClientHeight));
{*******************************************************************
* Paints in two steps. First copies a rect from bmpDisplay, and
then enlarges it
* This is required on Gtk because StretchBlt only accepts SrcX = SrcY = 0
*******************************************************************}
bmpEnlargedDisplay.Canvas.CopyRect(
Bounds(0, 0, ScreenRect.Right - ScreenRect.Left,
ScreenRect.Bottom - ScreenRect.Top),
bmpDisplay.Canvas, ScreenRect);
bmpEnlargedDisplay.Height := ScreenRect.Bottom - ScreenRect.Top;
bmpEnlargedDisplay.Width := ScreenRect.Right - ScreenRect.Left;
DestCanvas.StretchDraw(
Bounds(ClientLeft, ClientTop, ClientWidth, ClientHeight),
bmpEnlargedDisplay);
{$ENDIF}
--
Felipe Monteiro de Carvalho
_________________________________________________________________
To unsubscribe: mail [EMAIL PROTECTED] with
"unsubscribe" as the Subject
archives at http://www.lazarus.freepascal.org/mailarchives