Re: Image loading and caching

Olaf Schmidt <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
Am 05.07.2016 um 22:31 schrieb Bryce Harrington:

>> OTOH, it might be worth implementing that in a generic way,
>> maybe even in cairo or some cairo-extension library.
>>
>> What's your opponion on that ?
>
> Caching buffers is a classic cat skinning problem.  :-)
>
> If the code can sit atop Cairo (i.e. exclusively use Cairo's public
> API), then having it be a separate library would be best.

That's the way I use this "ImageList-like Surface-Caching"
in my Widget-Toolkit, which is centered around a separate
library (a COM-wrapper around the cairo-FlatAPI).

There I store (COM-Object-wrapped) cairo-"resource-surfaces"
(which can come from PNGs, ICOs, JPGs and SVGs) in a HashList,
behind String-Keys (once, at resource-loading time, when the
App-Process starts up).

A "BaseWidget"-Object then sports an ImageKey-Property of type String
(instead of Type 'cairo-surface'), which might - or might not be set,
but when used, being more lightweight than a separate Mem-Allocation
in a dedicated Surface for each Widget... most of the image- and icon-
resources in an App are shared ones (and im my approach, they will then
be rendered "by String-Key" into ToolBars - or into Buttons, etc...)

The (Hash)ImageList-implementation is offering these resource-surfaces
process-wide, when the right string-key is used to retrieve them -
and there's a "RenderFromSurface"-method in the CairoContext-Class,
which accepts either a real Surface-ObjectInstance in the appropriate
Param-Position, or alternatively a StringKey which points into that 
global ImageList.

Also when Widget-Hierarchies are serialized (to JSON or XML), such a
Resource-StringKey is easily saved along with other Widget-properties
(as e.g. its Dimensions, BackColor, CaptionText etc.)

The only thing which has to be ensured, when such a saved Widget-
Hierarchy is later on "reloaded and sited", is that the global
ImageList was filled beforehand, the "shared surface-instances" in
place already, waiting for their "rendering-requests per String-Key"...

> Also, would be good to know if it could apply to use cases beyond
> widget toolkits.

One usecase I see, would be related to e.g. repeated Surface-renderings
into PDF-Pages (e.g. always the same Logo on each page) - but I'm aware,
that there's already the MIME-type related cairo-APIs, which try to
cover that...

Maybe an "official implementation" of such a "cairo-Surface-Cache"
could re-use these already existing Mime-APIs somehow... (using
the ..., char *data, ... parameter as the String-Key under which they
are reachable by a generic rendering-function, which accepts this
'char-data-key' as a valid replacement to a "real surface-pointer".

Olaf




-- 
cairo mailing list
[email protected]
https://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.