1
0
Fork 0
forked from len0rd/rockbox
foxbox/apps/plugins/imageviewer/jpegp/BUFFILEGETC.c
Roman Artiukhin b8238f7b20 imageviewer: Initial support for JPEG progressive images. Add decoder
Added jpeg decoder jpegp.c using RAINBOW lib. Currently enabled only for pictures not supported by old decoder (as old decoder more optimized for low mem targets)

Someone TODO:
 * Old decoder has optimized downscale logic which new decoder doesn't have (it gives big difference in required memory and time for decoding). This logic should be ported/adapted if possible.

 * Add smooth downscaling.

 * Grayscale support

Change-Id: Ie96bc62848b51cc6a3942f8e069ec6ab02dc1c56
2024-10-14 09:19:34 -04:00

94 lines
1.8 KiB
C

/* Simple buffered version of file reader.
* JPEG decoding seems to work faster with it.
* Not fully tested. In case of any issues try FILEGETC (see SOURCES)
* */
#include "rb_glue.h"
static int fd;
static unsigned char buff[256]; //TODO: Adjust it...
static int length = 0;
static int cur_buff_pos = 0;
static int file_pos = 0;
extern int GETC(void)
{
if (cur_buff_pos >= length)
{
length = rb->read(fd, buff, sizeof(buff));
file_pos += length;
cur_buff_pos = 0;
}
return buff[cur_buff_pos++];
}
// multibyte readers: host-endian independent - if evaluated in right order (ie. don't optimize)
extern int GETWbi(void) // 16-bit big-endian
{
return ( GETC()<<8 ) | GETC();
}
extern int GETDbi(void) // 32-bit big-endian
{
return ( GETC()<<24 ) | ( GETC()<<16 ) | ( GETC()<<8 ) | GETC();
}
extern int GETWli(void) // 16-bit little-endian
{
return GETC() | ( GETC()<<8 );
}
extern int GETDli(void) // 32-bit little-endian
{
return GETC() | ( GETC()<<8 ) | ( GETC()<<16 ) | ( GETC()<<24 );
}
// seek
extern void SEEK(int d)
{
int newPos = cur_buff_pos + d;
if (newPos < length && newPos >= 0)
{
cur_buff_pos = newPos;
return;
}
file_pos = rb->lseek(fd, (cur_buff_pos - length) + d, SEEK_CUR);
cur_buff_pos = length = 0;
}
extern void POS(int d)
{
cur_buff_pos = length = 0;
file_pos = d;
rb->lseek(fd, d, SEEK_SET);
}
extern int TELL(void)
{
return file_pos + cur_buff_pos - length;
}
// OPEN/CLOSE file
extern void *OPEN(char *f)
{
printf("Opening %s\n", f);
cur_buff_pos = length = file_pos = 0;
fd = rb->open(f,O_RDONLY);
if ( fd < 0 )
{
printf("Error opening %s\n", f);
return NULL;
}
return &fd;
}
extern int CLOSE(void)
{
cur_buff_pos = length = file_pos = 0;
return rb->close(fd);
}