[Lazarus] fpimage use of Lazarus
Mattias Gaertner
nc-gaertnma at netcologne.de
Sat Feb 16 18:54:58 CET 2008
On Sat, 16 Feb 2008 17:35:13 +0100
Marco van de Voort <marcov at stack.nl> wrote:
> On Sat, Feb 16, 2008 at 02:32:24PM +0100, Mattias Gaertner wrote:
> > Marco van de Voort <marcov at stack.nl> wrote:
> > > In this context one should also see my "which properties"
> > > question. If I expand TFPMemoryImage with scanline (because it
> > > has storage), I couldn't use it in the readers or writers,
> > > because then they wouldn't work anymore with tlazintfimage. So
> > > more or less you confirmed my doubts, Lazarus is not using
> > > TFPMemoryImage.
> >
> > Correct. TFPMemoryImage knows only one format. The LCL needs a
> > flexible one, that supports at least all memory formats of all
> > widgetsets - which afaik excludes only compressed and floating
> > point memory formats.
>
> > > So probably the ancestor class should get a scanline property with
> > > some abstract methods, and TLazIntfImage needs to override that
> > > too.
> >
> > TLazIntfImage.GetDataLineStart?
>
> Exactly. Maybe a scanline property:
> property scanline[row:integer]:pointer read getdatalinestart;
>
> This is how I got so far:
>
> - TFPCustomImage gets an scanline /getdatalinestart pointer that can
> get the address of the first pixel per scanline. The Lazarus
> derivative already has something like that, so I propose to use that
> function name.
> - When reading, a reader must determine the bitcount per pixel (bpp),
> and pass it to an abstract virtual TFPCustomImage method which
> returns the actual bpp to be used. (the increment needed to get from
> (0,row) to (n,row). This allows one and the same reader/writer with
> different internal representations and supported bpp counts. Working
> title for this function is supportbpp.
> - The above supportbpp call (which must happen before the definitive
> setsize) is the only thing that changes for existing
> pixel property based reader to be compatible with also newer
> customimages.
> - The old situation (using existing readers/writers with existing
> tfpcustomimages remains the same.
> - Since this is possible, I also leave TMemoryImage alone for compat,
> and make a new class for more efficient purposes. It only gets the
> scanline support added, but always returns 32bpp as bitcount.
> - Anyone accessing scanline must check the bpp property to determine
> the granularity.
> - I'm still thinking about a property that signals scanline support.
> This would allow readers/writers to fall back to pixels for special
> customimages that don't support scanline.
>
> So in short, scanline support is added with as only compat limitation
> that a reader must pass on the bitcount before the main setsize. This
> avoids the current situation that the image must allocate for the
> worst case situation. Other changes only need fixing in existing
> fpimage usage if you really want to use newer features.
>
> This also allows me to fiddle around without hurting Lazarus too
> much, and confirm that the scheme works with the existing supported
> formats.
>
> In general it allows to speed up relative basic readers and writers a
> magnitude (from pixel to row based) at the expense of more code in
> reader/writer, but that is not forced. E.g. one could only optimize
> certain many used cases of a graph format like this, and leave the
> oddball options to the existing reader. It also allows image formats
> to not allocate the worst case amount of mem (maxbpp*rowsize*height).
You only mention bpp. What about the other 14 properties to describe a
row?
Mattias
More information about the Lazarus
mailing list