Re: [AD] implementing seek |
[ Thread Index |
Date Index
| More lists.liballeg.org/allegro-developers Archives
]
On April 7, 2010, Peter Wang wrote:
> On 2010-04-07, Matthew Leverton <meffer@xxxxxxxxxx> wrote:
> > I agree. But what about:
> >
> > ALLEGRO_FILE *f = fopen("images.blob", "rb");
> > int pos = al_fread32le(f);
> > ALLEGRO_BITMAP *bmp1 = al_load_bmp_f(f);
> >
> > al_fseek(f, pos, ALLEGRO_SEEK_SET);
> > pos += al_fread32le(f);
> > ALLEGRO_BITMAP *bmp2 = al_load_bmp_f(f);
> >
> > al_fseek(f, pos, ALLEGRO_SEEK_SET);
> > pos += al_fread32le(f);
> > ALLEGRO_BITMAP *bmp3 = al_load_bmp_f(f);
> >
> > where 'pos' is always pointing to the next position because the file
> > format stored the length?
>
> Intuitively, I would expect it to work. But, actually, it should NOT be
> guaranteed. (You might get away with it if you know exactly the loaders
> you are dealing with.)
>
> It imposes too many constraints on the loader implementation.
> You couldn't use SEEK_END at all, or even SEEK_SET with an absolute
> offset (as you mention).
>
> For a robust solution, the user should pass an ALLEGRO_FILE handle that
> provides a view of exactly one file.
>
> > So one system-wide solution would be something like al_fopen_f or even
> > maybe more simply:
> >
> > al_fseek(f, 1000); // seeks to position 1000
> > al_set_fseek_origin(f, al_ftell(f)); // consider the current position
> > 1000 to be 0.
> > al_fseek(f, 0); // actually seeks to position 1000.
> >
> > ALLEGRO_BITMAP *bmp2 = al_load_bmp_f(f); // guaranteed to work now
> >
> > Basically it's just an offset that gets added to the offset value to
> > SEEK_SET. Now when loading functions want to seek from the "beginning"
> > of the file, the proper location is preserved.
>
> The function you alluded to earlier was cleaner:
>
> ALLEGRO_FILE *al_fopen_slice(ALLEGRO_FILE *f, size_t length);
>
> perhaps combined with memory buffering as an option, for underlying
> streams that don't understand backward seeks. Maybe also mix in
> read/write permissions.
That could work. Could also think about sub files, like A4 had.
> Peter
>
> -------------------------------------------------------------------------
> ----- Download Intel® Parallel Studio Eval
> Try the new software tools for yourself. Speed compiling, find bugs
> proactively, and fine-tune applications for parallel performance.
> See why Intel Parallel Studio got high marks during beta.
> http://p.sf.net/sfu/intel-sw-dev
--
Thomas Fjellstrom
tfjellstrom@xxxxxxxxxx