Hi!

Are you making a new mask image every frame? (If your not you can probably ignore this.) If so you should try to only create it at the begining of the program. In half pseudo code, half VCL (so if you don't use it consider it more psuedo code), half something else it would look like this:

[pascal]
var
MyBitmap, MyMask: TBitmap;

procedure StartUp;
var
x,y: Integer;
begin
MyBitmap.LoadFromFile('Picture.bmp');
MyMask.Canvas.Draw(0,0,MyBitmap);
MyMask.Mask(clFuchsia);
{this could be improved using scanlines}
for y := 0 to MyBitmap.Height - 1 do
for x := 0 to MyBitmap.Width - 1 do
begin
if MyBitmap.Canvas.Pixels[x,y] = clFuchsia then
MyBitmap.Canvas.Pixels[x,y] := clBlack;
end;
end;

procedure Draw(Canv: TCanvas);
begin
Canv.Copymode := cmSrcAnd;
Canv.CopyRect(DestRect, MyMask.Canvas, SourceRect);
Canv.Copymode := cmSrcPaint;
Canv.CopyRect(DestRect, MyBitmap.Canvas, SourceRect);
end;

{hmm... maybe not so much pseudo code... }
[/pascal]

Notice that I haven't check how much time, memory or anything else this code takes and there are probably many other, better, ways of doing it.

By the way, how much faster was BitBlt vs. Canvas.Draw?