[fpc-pascal] FPImage and GetDataLineStart

michael.vancanneyt at wisa.be michael.vancanneyt at wisa.be
Thu Apr 21 16:09:14 CEST 2011

On Thu, 21 Apr 2011, Leonardo M. Ramé wrote:

> --- On Thu, 4/21/11, Marco van de Voort <marcov at stack.nl> wrote:
>> From: Marco van de Voort <marcov at stack.nl>
>> Subject: Re: [fpc-pascal] FPImage and GetDataLineStart
>> To: "FPC-Pascal users discussions" <fpc-pascal at lists.freepascal.org>
>> Date: Thursday, April 21, 2011, 6:41 AM
>> In our previous episode, Sven Barth
>> said:
>> > Am 20.04.2011 22:20, schrieb Leonardo M. Ram?:
>> > > Hi, I need to write a function that replaces
>> TLazIntfImage by using fpImage, and I can't find an
>> alternative to GetDataLineStart. How can I replace it?.
>> > 
>> > Maybe I get your intention wrong, but TLazIntfImage is
>> already using 
>> > fpImage and it derives from a TFPCustomImage itself.
>> True, but TFPCustomImage is abstact wrt memory layout and
>> doens't provide
>> row level access, only pixel level access.
>> Only TFPMemoryImage adds the memory access, but IIRC only
>> 64-bit pixels.
>> (16-bit RGBA)
>> While these abstractions make it easy to make fp/fcl-image
>> somewhat
>> complete, they are also very memory hungry and slow.
>> IIRC I accelerated loading/saving simple 8-bit BMP images
>> 20 to 50 times in
>> my work code.
> Do you care to share some insights about what you did to accelerate it?

It is really very easy to accelerate it:

* Create a TFPCustomImage descendant that is limited to the bit depth you need.
* Do not use palette.
* Implement GetPixel and SetPixel so they convert from 64-bit from/to the depth you used
* Implement a GetScanLine/SetScanLine specific to your bit depth.

You can now load/save the image very fast using the GetScanLine/SetScanLine,
and all other FPIMage operations will work equally well.

Following prior discussions on the list, I have a sample implementation
ready (simple RGB, no alpha), but it is not yet committed. 
It's maybe 20 lines of code.

I'll try and commit it tonight.


More information about the fpc-pascal mailing list