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

Reply via email to