/* > arspr.c

 *  SJ Middleton, 1993

 * Loading the default sprite out of an ARMovie file

 */

#include "msgs.h"
#include "os.h"
#include "swis.h"
#include "werr.h"
#include "wimpt.h"

#include <stddef.h>

#include "armovie.h"
#include "arspr.h"
#include "utils.h"

#define OOM_ERR_SPRITE  msgs_lookup("arspr0:default sprite")

static mem_allocfn  arspr_alloc = c_alloc;
static mem_freefn   arspr_free = c_free;

BOOL armovie_defaultspritefromfile(unsigned file_handle, int sprite_offset, int sprite_size, sprite_area **area_anchor)
{
    BOOL success = FALSE;
    sprite_size += 4;
    if (arspr_alloc((void **)area_anchor, sprite_size))
    {
        sprite_area *area = *area_anchor;
        area->size = sprite_size;
        if (os_err(file_readfrom(file_handle, &area->number, sprite_size, sprite_offset)) == NULL)
            success = TRUE;
        else
            arspr_free((void **)area_anchor);
    }
    else
        oom_err(OOM_ERR_SPRITE, sprite_size);
    return success;
}

BOOL armovie_defaultsprite(const char *filename, sprite_area **area_anchor)
{
    BOOL        success = FALSE;
    armovie_hdr *hdr = armovie_readhdr(filename);
    if (hdr && hdr->sprite_size)
    {
        unsigned    file_handle;
        if (os_err(file_open(fopt_Read, filename, &file_handle)) == NULL)
        {
            success = armovie_defaultspritefromfile(file_handle, hdr->sprite_offset, hdr->sprite_size, area_anchor);
            file_close(file_handle);
        }
    }
    armovie_freehdr(hdr);
    return success;
}

void arspr_registermemfns(mem_allocfn alloc, mem_freefn free)
{
    arspr_alloc = alloc;
    arspr_free = free;
}

/* eof arspr.c */
