Dependencies:   mbed

Committer:
XkLi
Date:
Tue Oct 11 01:24:18 2011 +0000
Revision:
0:c546b51ecf0b
v1.0

Who changed what in which revision?

UserRevisionLine numberNew 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 }