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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|