1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
|
/*
* mng_callbacks.c - Callback functions for libmng
*
* Copyright (C) 2005 Bernard Blackham <bernard@blackham.com.au>
*
* This file is subject to the terms and conditions of the GNU General Public
* License v2. See the file COPYING in the main directory of this archive for
* more details.
*
*/
#include <stdio.h>
#include <libmng.h>
#include <sys/time.h>
#include <time.h>
#include "splash.h"
mng_ptr fb_mng_memalloc(mng_size_t len)
{
return calloc(1, len);
}
void fb_mng_memfree(mng_ptr p, mng_size_t len)
{
free(p);
}
static mng_bool fb_mng_openstream(mng_handle handle)
{
mng_anim *mng = mng_get_userdata(handle);
if (mng->data == NULL || mng->len == 0)
return MNG_FALSE;
mng->ptr = 0;
mng->open = 1;
return MNG_TRUE;
}
static mng_bool fb_mng_closestream(mng_handle handle)
{
mng_anim *mng = mng_get_userdata(handle);
mng->open = 0;
return MNG_TRUE;
}
static mng_bool fb_mng_readdata(mng_handle handle, mng_ptr buf,
mng_uint32 len, mng_uint32p pread)
{
mng_anim *mng = mng_get_userdata(handle);
char *src_buf;
if (mng->data == NULL || !mng->open)
return MNG_FALSE;
src_buf = ((char*)mng->data) + mng->ptr;
if (mng->ptr + len > mng->len)
len = mng->len - mng->ptr;
memcpy(buf, src_buf, len);
if (pread)
*pread = len;
mng->ptr += len;
return MNG_TRUE;
}
static mng_ptr fb_mng_getcanvasline(mng_handle handle, mng_uint32 line_num)
{
mng_anim *mng = mng_get_userdata(handle);
if (mng->canvas == NULL || line_num >= mng->canvas_h) {
fprintf(stderr, "%s(mngh, %d): Requested invalid line or canvas was NULL.\n",
__FUNCTION__, line_num);
return MNG_NULL;
}
return mng->canvas + (line_num * mng->canvas_w * mng->canvas_bytes_pp);
}
static mng_bool fb_mng_refresh(mng_handle handle, mng_uint32 x, mng_uint32 y,
mng_uint32 width, mng_uint32 height)
{
/* FIXME */
return MNG_TRUE;
}
static mng_uint32 fb_mng_gettickcount(mng_handle handle)
{
struct timeval tv;
mng_anim *mng = mng_get_userdata(handle);
if (gettimeofday(&tv, NULL) < 0) {
perror("fb_mng_gettickcount: gettimeofday");
abort();
}
if (mng->start_time.tv_sec == 0) {
mng->start_time.tv_sec = tv.tv_sec;
mng->start_time.tv_usec = tv.tv_usec;
}
return ((tv.tv_sec - mng->start_time.tv_sec)*1000) +
((tv.tv_usec - mng->start_time.tv_usec)/1000);
}
static mng_bool fb_mng_settimer(mng_handle handle, mng_uint32 msecs)
{
mng_anim *mng = mng_get_userdata(handle);
mng->wait_msecs = msecs;
return MNG_TRUE;
}
static mng_bool fb_mng_processheader(mng_handle handle, mng_uint32 width,
mng_uint32 height)
{
mng_anim *mng = mng_get_userdata(handle);
free(mng->canvas);
mng->canvas_bytes_pp = 4;
if ((mng->canvas = malloc(width*height*mng->canvas_bytes_pp)) == NULL) {
fprintf(stderr, "%s: Unable to allocate memory for MNG canvas\n",
__FUNCTION__);
return MNG_FALSE;
}
mng->canvas_w = width;
mng->canvas_h = height;
mng_set_canvasstyle(handle, MNG_CANVAS_RGBA8);
mng_set_bgcolor(handle, 0, 0, 0); /* FIXME - make configurable? */
return MNG_TRUE;
}
static mng_bool fb_mng_errorproc(mng_handle handler, mng_int32 code,
mng_int8 severity, mng_chunkid chunkname, mng_uint32 chunkseq,
mng_int32 extra1, mng_int32 extra2, mng_pchar errtext)
{
fprintf(stderr, "libmng error: Code: %d, Severity: %d - %s\n",
code, severity, errtext);
abort();
return MNG_TRUE;
}
#ifdef MNG_SUPPORT_TRACE
static mng_bool fb_mng_traceproc(mng_handle handle, mng_int32 funcnr,
mng_int32 seq, mng_pchar funcname)
{
fprintf(stderr, "libmng trace: %s (seq %d\n)", funcname, seq);
return MNG_TRUE;
}
#endif
mng_retcode mng_init_callbacks(mng_handle handle)
{
mng_retcode ret;
#define set_cb(x) \
if ((ret = mng_setcb_##x(handle, fb_mng_##x)) != MNG_NOERROR) \
return ret;
set_cb(errorproc);
set_cb(openstream);
set_cb(closestream);
set_cb(readdata);
set_cb(getcanvasline);
set_cb(refresh);
set_cb(gettickcount);
set_cb(settimer);
set_cb(processheader);
#ifdef MNG_SUPPORT_TRACE
set_cb(traceproc);
#endif
#undef set_cb
return MNG_NOERROR;
}
|