| User | Revision | Line number | New contents of line |
| XkLi |
0:c546b51ecf0b
|
1
|
#include "jpegutil.h"
|
| XkLi |
0:c546b51ecf0b
|
2
|
|
| XkLi |
0:c546b51ecf0b
|
3
|
FILE *jpegfile;
|
| XkLi |
0:c546b51ecf0b
|
4
|
int jpeg_filesize = 0;
|
| XkLi |
0:c546b51ecf0b
|
5
|
int jpeg_filepos = 0;
|
| XkLi |
0:c546b51ecf0b
|
6
|
|
| XkLi |
0:c546b51ecf0b
|
7
|
unsigned char pjpeg_need_bytes_callback(unsigned char* pBuf, unsigned char buf_size, unsigned char *pBytes_actually_read, void *pCallback_data)
|
| XkLi |
0:c546b51ecf0b
|
8
|
{
|
| XkLi |
0:c546b51ecf0b
|
9
|
unsigned int n = min((unsigned int)(jpeg_filesize - jpeg_filepos), (unsigned int)buf_size);
|
| XkLi |
0:c546b51ecf0b
|
10
|
if (n && (fread(pBuf, 1, n, jpegfile) != n))
|
| XkLi |
0:c546b51ecf0b
|
11
|
return PJPG_STREAM_READ_ERROR;
|
| XkLi |
0:c546b51ecf0b
|
12
|
*pBytes_actually_read = (unsigned char)(n);
|
| XkLi |
0:c546b51ecf0b
|
13
|
jpeg_filepos += n;
|
| XkLi |
0:c546b51ecf0b
|
14
|
return 0;
|
| XkLi |
0:c546b51ecf0b
|
15
|
}
|
| XkLi |
0:c546b51ecf0b
|
16
|
|
| XkLi |
0:c546b51ecf0b
|
17
|
void ReadJPEGFromFile(const char *filename, NokiaLCD *lcd)
|
| XkLi |
0:c546b51ecf0b
|
18
|
{
|
| XkLi |
0:c546b51ecf0b
|
19
|
pjpeg_image_info_t imageInfo;
|
| XkLi |
0:c546b51ecf0b
|
20
|
jpegfile = fopen(filename,"rb");
|
| XkLi |
0:c546b51ecf0b
|
21
|
fseek(jpegfile, 0, SEEK_END);
|
| XkLi |
0:c546b51ecf0b
|
22
|
jpeg_filesize = ftell(jpegfile);
|
| XkLi |
0:c546b51ecf0b
|
23
|
jpeg_filepos = 0;
|
| XkLi |
0:c546b51ecf0b
|
24
|
fseek(jpegfile, 0, SEEK_SET);
|
| XkLi |
0:c546b51ecf0b
|
25
|
int status = pjpeg_decode_init(&imageInfo, pjpeg_need_bytes_callback, NULL);
|
| XkLi |
0:c546b51ecf0b
|
26
|
//const unsigned int row_pitch = imageInfo.m_width * imageInfo.m_comps;
|
| XkLi |
0:c546b51ecf0b
|
27
|
int mcu_x = 0;
|
| XkLi |
0:c546b51ecf0b
|
28
|
int mcu_y = 0;
|
| XkLi |
0:c546b51ecf0b
|
29
|
|
| XkLi |
0:c546b51ecf0b
|
30
|
for ( ; ; )
|
| XkLi |
0:c546b51ecf0b
|
31
|
{
|
| XkLi |
0:c546b51ecf0b
|
32
|
status = pjpeg_decode_mcu();
|
| XkLi |
0:c546b51ecf0b
|
33
|
|
| XkLi |
0:c546b51ecf0b
|
34
|
if (status)
|
| XkLi |
0:c546b51ecf0b
|
35
|
{
|
| XkLi |
0:c546b51ecf0b
|
36
|
if (status != PJPG_NO_MORE_BLOCKS)
|
| XkLi |
0:c546b51ecf0b
|
37
|
{
|
| XkLi |
0:c546b51ecf0b
|
38
|
//pc.printf("pjpeg_decode_mcu() failed with status %u\n", status);
|
| XkLi |
0:c546b51ecf0b
|
39
|
fclose(jpegfile);
|
| XkLi |
0:c546b51ecf0b
|
40
|
return;
|
| XkLi |
0:c546b51ecf0b
|
41
|
}
|
| XkLi |
0:c546b51ecf0b
|
42
|
|
| XkLi |
0:c546b51ecf0b
|
43
|
break;
|
| XkLi |
0:c546b51ecf0b
|
44
|
}
|
| XkLi |
0:c546b51ecf0b
|
45
|
|
| XkLi |
0:c546b51ecf0b
|
46
|
if (mcu_y >= imageInfo.m_MCUSPerCol)
|
| XkLi |
0:c546b51ecf0b
|
47
|
{
|
| XkLi |
0:c546b51ecf0b
|
48
|
fclose(jpegfile);
|
| XkLi |
0:c546b51ecf0b
|
49
|
return;
|
| XkLi |
0:c546b51ecf0b
|
50
|
}
|
| XkLi |
0:c546b51ecf0b
|
51
|
|
| XkLi |
0:c546b51ecf0b
|
52
|
// Copy MCU's pixel blocks into the destination bitmap.
|
| XkLi |
0:c546b51ecf0b
|
53
|
|
| XkLi |
0:c546b51ecf0b
|
54
|
for (int y = 0; y < imageInfo.m_MCUHeight; y += 8)
|
| XkLi |
0:c546b51ecf0b
|
55
|
{
|
| XkLi |
0:c546b51ecf0b
|
56
|
const int by_limit = min(8, imageInfo.m_height - (mcu_y * imageInfo.m_MCUHeight + y));
|
| XkLi |
0:c546b51ecf0b
|
57
|
for (int x = 0; x < imageInfo.m_MCUWidth; x += 8)
|
| XkLi |
0:c546b51ecf0b
|
58
|
{
|
| XkLi |
0:c546b51ecf0b
|
59
|
|
| XkLi |
0:c546b51ecf0b
|
60
|
unsigned int src_ofs = (x * 8U) + (y * 16U);
|
| XkLi |
0:c546b51ecf0b
|
61
|
const unsigned char *pSrcR = imageInfo.m_pMCUBufR + src_ofs;
|
| XkLi |
0:c546b51ecf0b
|
62
|
const unsigned char *pSrcG = imageInfo.m_pMCUBufG + src_ofs;
|
| XkLi |
0:c546b51ecf0b
|
63
|
const unsigned char *pSrcB = imageInfo.m_pMCUBufB + src_ofs;
|
| XkLi |
0:c546b51ecf0b
|
64
|
|
| XkLi |
0:c546b51ecf0b
|
65
|
const int bx_limit = min(8, imageInfo.m_width - (mcu_x * imageInfo.m_MCUWidth + x));
|
| XkLi |
0:c546b51ecf0b
|
66
|
|
| XkLi |
0:c546b51ecf0b
|
67
|
if (imageInfo.m_scanType == PJPG_GRAYSCALE)
|
| XkLi |
0:c546b51ecf0b
|
68
|
{
|
| XkLi |
0:c546b51ecf0b
|
69
|
for (int by = 0; by < by_limit; by++)
|
| XkLi |
0:c546b51ecf0b
|
70
|
{
|
| XkLi |
0:c546b51ecf0b
|
71
|
for (int bx = 0; bx < bx_limit; bx++)
|
| XkLi |
0:c546b51ecf0b
|
72
|
{
|
| XkLi |
0:c546b51ecf0b
|
73
|
unsigned int color = ((*pSrcR++) << 16);
|
| XkLi |
0:c546b51ecf0b
|
74
|
(*lcd).pixel(mcu_x*imageInfo.m_MCUWidth+x+bx,mcu_y*imageInfo.m_MCUHeight+y+by,color);
|
| XkLi |
0:c546b51ecf0b
|
75
|
}
|
| XkLi |
0:c546b51ecf0b
|
76
|
pSrcR += (8 - bx_limit);
|
| XkLi |
0:c546b51ecf0b
|
77
|
}
|
| XkLi |
0:c546b51ecf0b
|
78
|
}
|
| XkLi |
0:c546b51ecf0b
|
79
|
else
|
| XkLi |
0:c546b51ecf0b
|
80
|
{
|
| XkLi |
0:c546b51ecf0b
|
81
|
for (int by = 0; by < by_limit; by++)
|
| XkLi |
0:c546b51ecf0b
|
82
|
{
|
| XkLi |
0:c546b51ecf0b
|
83
|
for (int bx = 0; bx < bx_limit; bx++)
|
| XkLi |
0:c546b51ecf0b
|
84
|
{
|
| XkLi |
0:c546b51ecf0b
|
85
|
unsigned int color = ((*pSrcR++) << 16) | ((*pSrcG++) << 8) | (*pSrcB++);
|
| XkLi |
0:c546b51ecf0b
|
86
|
(*lcd).pixel((130-imageInfo.m_width)/2+mcu_x*imageInfo.m_MCUWidth+x+bx,(130-imageInfo.m_height)/2+mcu_y*imageInfo.m_MCUHeight+y+by,color);
|
| XkLi |
0:c546b51ecf0b
|
87
|
}
|
| XkLi |
0:c546b51ecf0b
|
88
|
|
| XkLi |
0:c546b51ecf0b
|
89
|
pSrcR += (8 - bx_limit);
|
| XkLi |
0:c546b51ecf0b
|
90
|
pSrcG += (8 - bx_limit);
|
| XkLi |
0:c546b51ecf0b
|
91
|
pSrcB += (8 - bx_limit);
|
| XkLi |
0:c546b51ecf0b
|
92
|
|
| XkLi |
0:c546b51ecf0b
|
93
|
}
|
| XkLi |
0:c546b51ecf0b
|
94
|
}
|
| XkLi |
0:c546b51ecf0b
|
95
|
}
|
| XkLi |
0:c546b51ecf0b
|
96
|
}
|
| XkLi |
0:c546b51ecf0b
|
97
|
|
| XkLi |
0:c546b51ecf0b
|
98
|
mcu_x++;
|
| XkLi |
0:c546b51ecf0b
|
99
|
if (mcu_x == imageInfo.m_MCUSPerRow)
|
| XkLi |
0:c546b51ecf0b
|
100
|
{
|
| XkLi |
0:c546b51ecf0b
|
101
|
mcu_x = 0;
|
| XkLi |
0:c546b51ecf0b
|
102
|
mcu_y++;
|
| XkLi |
0:c546b51ecf0b
|
103
|
}
|
| XkLi |
0:c546b51ecf0b
|
104
|
}
|
| XkLi |
0:c546b51ecf0b
|
105
|
|
| XkLi |
0:c546b51ecf0b
|
106
|
fclose(jpegfile);
|
| XkLi |
0:c546b51ecf0b
|
107
|
} |