#ifndef RESOR_H_INCLUDED
#define RESOR_H_INCLUDED 

#include "rebox.h"

enum ResorKind_ {
  RESOR_NONE          = 0,
  RESOR_BITMAP        = 1, 
  RESOR_FONT          = 2, 
  RESOR_AUDIO_STREAM  = 3, 
  RESOR_SAMPLE        = 4,
  RESOR_CONFIG        = 5,
  RESOR_OTHER         = 8,
  RESOR_TILEMAP       = 9,
};

enum ResorStatus_ {
  RESOR_OK            = 0,
  RESOR_EMPTY         = 1,
  RESOR_ENOENT        = 2,
  RESOR_ENOMEM        = 3,
  RESOR_NULL          = 4,
};


typedef enum ResorKind_         ResorKind;
typedef enum ResorStatus_       ResorStatus;
typedef union ResorData_        ResorData;
typedef struct Resor_           Resor;

union ResorData_ { 
  ALLEGRO_BITMAP        * bitmap;
  ALLEGRO_FONT          * font;
  ALLEGRO_SAMPLE        * sample;
  ALLEGRO_AUDIO_STREAM  * stream;
  ALLEGRO_CONFIG        * config;
  void                  * other;
};


typedef int ResorDestructor(Resor * self); 
typedef void* ResorLoader(const char * vpath, void * extra); 

ALLEGRO_SAMPLE *resor_sample(Resor *self);
ALLEGRO_AUDIO_STREAM *resor_audio_stream(Resor *self);
ALLEGRO_BITMAP *resor_bitmap(Resor *self);
ALLEGRO_FONT *resor_font(Resor *self);
void * resor_other(Resor * self, unsigned kind);

Resor * 
resor_grab_font_from_resor(Resor * res, int  count, int ranges[]);

Resor *resor_load_bitmap(const char *vpath);
Resor *resor_load_bitmap_flags(const char *vpath,int flags);
Resor *resor_load_sample(const char *vpath);
Resor *resor_load_audio_stream(const char *vpath,size_t buffer_count,int samples);
Resor *resor_load_bitmap_font(const char *vpath);
Resor *resor_load_bitmap_font_flags(const char *vpath,int flags);
Resor *resor_load_ttf_font(const char *vpath,int h,int flags);
Resor *resor_load_ttf_font_stretch(const char *vpath,int w,int h,int flags);

Resor *
resor_load_other(const char *vpath, ResorKind kind, 
                 ResorLoader * loader, ResorDestructor * destroy, void *extra);

Resor *resor_new_audio_stream(ALLEGRO_AUDIO_STREAM *stream);
Resor *resor_new_sample(ALLEGRO_SAMPLE *sample);
Resor *resor_new_bitmap(ALLEGRO_BITMAP *bitmap);
Resor *resor_new_font(ALLEGRO_FONT *font);
Resor *resor_new(ResorKind kind,ResorData data,ResorDestructor *free);
Resor *resor_new_other(ResorKind kind, void * data, ResorDestructor * free);

Resor *resor_alloc();
Resor *resor_init(Resor *self,ResorKind kind,ResorData data,ResorDestructor *free);
int resor_kind(Resor *self);
int resor_free(Resor *self);
int resor_done(Resor *self);

bool resor_get_bitmap_format(Resor *self,int *value);
bool resor_get_bitmap_flags(Resor *self,int *value);
bool resor_get_bitmap_height(Resor *self,int *value);
bool resor_get_bitmap_width(Resor *self,int *value);
bool resor_get_ustr_dimensions(Resor *self,ALLEGRO_USTR *text,Rebox *value);
bool resor_get_ustr_width(Resor *self,ALLEGRO_USTR *text,int *value);
bool resor_get_text_dimensions(Resor *self,char *text,Rebox *value);
bool resor_get_text_width(Resor *self,char *text,int *value);
bool resor_get_font_line_height(Resor *self,int *value);
bool resor_get_font_descent(Resor *self,int *value);
bool resor_get_font_ascent(Resor *self,int *value);




#endif /* RESOR_H_INCLUDED */