#include <stdlib.h>
#include <stdio.h>

#include <flex.h>

#include <oslib/osspriteop.h>
#include <oslib/jpeg.h>

#include "ztypes.h"
#include "osdepend.h"
#include "fileio.h"
#include "riscosio.h"
#include "blorb.h"
#include "v6.h"
#include "v6ro.h"
#include "graphics.h"
#include "jpegro.h"


int get_jpeg_dimensions(int r, int chunknum, short *w, short *h)
{
    os_error *e;
    bb_err_t err;
    bb_result_t res;
    int width, height;

    NOT_USED(r);

    err = bb_load_chunk_by_number(blorb_map, bb_method_Memory, &res, chunknum);
    if (err) fatal_lookup_1("BlorbErr", bb_err_to_string(err));

    e = xjpeginfo_dimensions(res.data.ptr, (int) res.length, SKIP,
                             &width, &height, SKIP, SKIP, SKIP);
    bb_unload_chunk(blorb_map, chunknum);
    if (e)
        warning(e->errmess);
    else
    {
        if (w) *w = width;
        if (h) *h = height;
    }
    return e == NULL;
}

Bitmap *load_jpeg(FILE *fp, gfx_dir *directory, int urgent)
{
    Bitmap *bmp;
    int r;

    if (fseek(fp, directory->image_data_addr, SEEK_SET) != 0)
        fatal_lookup("GfxErr");

    do
        bmp = malloc(sizeof *bmp);
    while (!bmp && urgent && release_memory());
    if (!bmp)
    {
        if (urgent) warning_lookup("NoMemG");
        return NULL;
    }
    bmp->next=NULL;
    bmp->directory=NULL;
    do
        r = flex_alloc((flex_ptr) &bmp->sprite, (int) directory->image_data_length);
    while (!r && urgent && release_memory());
    if (!r)
    {
        free(bmp);
        if (urgent) warning_lookup("NoMemG");
        return NULL;
    }
    bmp->sprite->size = sizeof *bmp->sprite + (int) directory->image_data_length;
    bmp->sprite->sprite_count = 0;
    bmp->sprite->first = bmp->sprite->size;
    bmp->sprite->used = bmp->sprite->first;

    flex_set_budge(0);

    if (fread(bmp->sprite + 1, 1, (size_t) directory->image_data_length, fp) < directory->image_data_length)
        fatal_lookup("GfxErr");

    flex_set_budge(1);

    return bmp;
}
