Files
player/Project/Src/JPEG/picdeco.c

218 lines
4.6 KiB
C
Raw Permalink Normal View History

2025-06-27 00:32:57 +08:00
#include "main.h"
#include "picdeco.h"
FIL File_JPEG;
JDEC JPEG_Dev;
FIL *f_jpeg = &File_JPEG;
JDEC *jpeg_dev = &JPEG_Dev;
2025-06-28 22:15:49 +08:00
__attribute__((aligned(4))) u8 jpg_buffer[JPEG_BufferSize];
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
static u16 JPEG_X = 0; //ͼƬ<CDBC><C6AC>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
static u16 JPEG_Y = 0; //ͼƬ<CDBC><C6AC>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD>ļ<EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
static UINT In_Func (JDEC* jdec,BYTE* buff,UINT ndata)
{
2025-06-28 22:15:49 +08:00
UINT rb;
2025-06-27 00:32:57 +08:00
FIL *dev=(FIL*)jdec->device;
if(buff)
{
f_read(dev,buff,ndata,&rb);
return rb;
}
else return (f_lseek(dev,f_tell(dev)+ndata)==FR_OK)?ndata:0;
}
//#define COLOR565TO888(color) (((color&0xf800)<<8)|(color&0x07e0)<<5|((color&0x001f)<<3))
2025-07-05 19:47:28 +08:00
//ֱ<>Ӱ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ
2025-06-27 00:32:57 +08:00
static UINT Out_Func (JDEC* jdec,void* bitmap,JRECT* rect)
{
u16 m,n;
2025-07-05 19:47:28 +08:00
u16 x = rect->left,y = 0; //ʵ<><CAB5>Ҫ<EFBFBD><D2AA>ʾ<EFBFBD><CABE>X<EFBFBD><58>Y<EFBFBD><59><EFBFBD><EFBFBD>
u16 *PointColor = bitmap; //<2F><><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>ɫ
2025-06-27 00:32:57 +08:00
u16 JPEG_Width = rect->right-rect->left+1;
u16 JPEG_Height = rect->bottom-rect->top+1;
for(m=0;m<JPEG_Height;m++)
{
2025-07-05 19:47:28 +08:00
y=(8193*(rect->top+m))>>13; //ʵ<><CAB5><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>y<EFBFBD><79><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
for(n=0;n<JPEG_Width;n++)
{
2025-07-05 19:47:28 +08:00
x=(8193*(rect->left+n))>>13; //ʵ<><CAB5><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>x<EFBFBD><78><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
//extern u32* LCD_ADDR;
if (x<480&y<272)
{
int point=(480*272-1)-((y+JPEG_Y)*480+(JPEG_X+x));
//if ((point>=0)&&(point<480*272))
//LCD_ADDR[point]=COLOR565TO888((*PointColor));
}
PointColor++;
}
}
2025-07-05 19:47:28 +08:00
return 0; //<2F>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>0
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EBB2A2>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ
2025-06-27 00:32:57 +08:00
u8 JPEG_Show(const u8 *filename,u16 x,u16 y)
{
2025-07-05 19:47:28 +08:00
u8 JPEG_Res; // <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
JPEG_X = x;
JPEG_Y = y;
2025-07-05 19:47:28 +08:00
JPEG_Res = f_open(f_jpeg,(const TCHAR*)filename,FA_READ);//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
if( JPEG_Res == FR_OK ) //<2F><>ȡJPEG<45>ļ<EFBFBD><C4BC>ɹ<EFBFBD>
2025-06-27 00:32:57 +08:00
{
2025-07-05 19:47:28 +08:00
JPEG_Res = jd_prepare(jpeg_dev,In_Func,jpg_buffer,JPEG_BufferSize,f_jpeg); //׼<><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( JPEG_Res == JDR_OK ) //<2F><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9>ɹ<EFBFBD>
2025-06-27 00:32:57 +08:00
{
2025-07-05 19:47:28 +08:00
JPEG_Res=jd_decomp(jpeg_dev,Out_Func,0); //<2F><><EFBFBD><EFBFBD>JPEG<45>Ľ<EFBFBD><C4BD><EFBFBD><EBB2A2>ʾ
2025-06-27 00:32:57 +08:00
}
}
2025-07-05 19:47:28 +08:00
f_close(f_jpeg); //<2F>ر<EFBFBD><D8B1>ļ<EFBFBD>
2025-06-27 00:32:57 +08:00
return JPEG_Res;
}
BITMAP_Struct *g_BITMAP_struct=0;
2025-07-05 19:47:28 +08:00
//ͼ<>񻺴浽<F1BBBAB4>ڴ<EFBFBD>
2025-06-27 00:32:57 +08:00
static UINT Out_Func2 (JDEC* jdec,void* bitmap,JRECT* rect)
{
u16 m,n;
2025-07-05 19:47:28 +08:00
u16 x = rect->left,y = 0; //ʵ<><CAB5>Ҫ<EFBFBD><D2AA>ʾ<EFBFBD><CABE>X<EFBFBD><58>Y<EFBFBD><59><EFBFBD><EFBFBD>
u16 *PointColor = bitmap; //<2F><><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>ɫ
2025-06-27 00:32:57 +08:00
u16 JPEG_Width = rect->right-rect->left+1;
u16 JPEG_Height = rect->bottom-rect->top+1;
u16 *buff=g_BITMAP_struct->buff;
int buff_size=g_BITMAP_struct->x_size*g_BITMAP_struct->y_size-1;
for(m=0;m<JPEG_Height;m++)
{
2025-07-05 19:47:28 +08:00
y=(8193*(rect->top+m))>>13; //ʵ<><CAB5><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>y<EFBFBD><79><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
for(n=0;n<JPEG_Width;n++)
{
int temp=0;
2025-07-05 19:47:28 +08:00
x=(8193*(rect->left+n))>>13; //ʵ<><CAB5><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>x<EFBFBD><78><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
//temp=buff_size-(y*g_BITMAP_struct->x_size+x);
temp=(y*g_BITMAP_struct->x_size+x);
buff[temp]=*PointColor;
PointColor++;
}
}
2025-07-05 19:47:28 +08:00
return 0; //<2F>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>0
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EBB2A2>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><E6B4A2><EFBFBD>ڴ<EFBFBD>
2025-06-27 00:32:57 +08:00
u8 JPEG_Decode(const u8 *filename,BITMAP_Struct *bitmap)
{
2025-07-05 19:47:28 +08:00
u8 JPEG_Res; // <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
g_BITMAP_struct=bitmap;
2025-07-05 19:47:28 +08:00
JPEG_Res = f_open(f_jpeg,(const TCHAR*)filename,FA_READ);//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
if( JPEG_Res == FR_OK ) //<2F><>ȡJPEG<45>ļ<EFBFBD><C4BC>ɹ<EFBFBD>
2025-06-27 00:32:57 +08:00
{
2025-07-05 19:47:28 +08:00
JPEG_Res = jd_prepare(jpeg_dev,In_Func,jpg_buffer,JPEG_BufferSize,f_jpeg); //׼<><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( JPEG_Res == JDR_OK ) //<2F><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9>ɹ<EFBFBD>
2025-06-27 00:32:57 +08:00
{
g_BITMAP_struct->x_size=jpeg_dev->width;
g_BITMAP_struct->y_size=jpeg_dev->height;
g_BITMAP_struct->buff=mymalloc_exm(jpeg_dev->width*jpeg_dev->height*2);
if (g_BITMAP_struct->buff!=0)
{
2025-07-05 19:47:28 +08:00
JPEG_Res=jd_decomp(jpeg_dev,Out_Func2,0); //<2F><><EFBFBD><EFBFBD>JPEG<45>Ľ<EFBFBD><C4BD><EFBFBD><EBB2A2>ʾ
2025-06-27 00:32:57 +08:00
}
else
{
JPEG_Res=(u8)-1;
}
}
}
2025-07-05 19:47:28 +08:00
f_close(f_jpeg); //<2F>ر<EFBFBD><D8B1>ļ<EFBFBD>
2025-06-27 00:32:57 +08:00
return JPEG_Res;
}
struct data_struct
{
u8 *data;
u32 offset;
u32 size;
};
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD>ڴ<EFBFBD><DAB4>ж<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
static UINT In_Func_Ram (JDEC* jdec,BYTE* buff,UINT ndata)
{
u32 rb;
struct data_struct *data=(struct data_struct *)jdec->device;
if (data->size>data->offset+ndata)
{
rb=ndata;
}
else
{
rb=data->size-(data->offset);
}
if(buff)
{
mymemcpy (buff,&data->data[data->offset],rb);
data->offset+=rb;
return rb;
}
else
{
return rb;
}
}
2025-07-05 19:47:28 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B4A2>ram<61>е<EFBFBD>jpeg<65><67><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
u8 JPEG_Decode_Ram(u8 *data,u32 size,BITMAP_Struct *bitmap)
{
2025-07-05 19:47:28 +08:00
u8 JPEG_Res; // <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
g_BITMAP_struct=bitmap;
2025-07-05 19:47:28 +08:00
if( data ) //<2F><>ȡJPEG<45>ļ<EFBFBD><C4BC>ɹ<EFBFBD>
2025-06-27 00:32:57 +08:00
{
struct data_struct data_struct={0};
data_struct.data=data;
data_struct.size=size;
2025-07-05 19:47:28 +08:00
JPEG_Res = jd_prepare(jpeg_dev,In_Func_Ram,jpg_buffer,JPEG_BufferSize,&data_struct); //׼<><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( JPEG_Res == JDR_OK ) //<2F><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9>ɹ<EFBFBD>
2025-06-27 00:32:57 +08:00
{
g_BITMAP_struct->x_size=jpeg_dev->width;
g_BITMAP_struct->y_size=jpeg_dev->height;
g_BITMAP_struct->buff=mymalloc(jpeg_dev->width*jpeg_dev->height*2);
if (g_BITMAP_struct->buff!=0)
{
2025-07-05 19:47:28 +08:00
JPEG_Res=jd_decomp(jpeg_dev,Out_Func2,0); //<2F><><EFBFBD><EFBFBD>JPEG<45>Ľ<EFBFBD><C4BD><EFBFBD><EBB2A2>ʾ
2025-06-27 00:32:57 +08:00
}
else
{
JPEG_Res=(u8)-1;
}
}
}
return JPEG_Res;
}