mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 02:27:39 -04:00
jpeg: Add support for FORMAT_RETURN_SIZE flag
Change-Id: I01f883400d775ffee5cdaa107fc3d6fb89b02573
This commit is contained in:
parent
888ce7cae8
commit
be47d646f0
1 changed files with 29 additions and 10 deletions
|
@ -2210,21 +2210,22 @@ int clip_jpeg_fd(int fd, int flags,
|
||||||
bm_size = cformat->get_size(bm);
|
bm_size = cformat->get_size(bm);
|
||||||
else
|
else
|
||||||
bm_size = BM_SIZE(bm->width,bm->height,FORMAT_NATIVE,false);
|
bm_size = BM_SIZE(bm->width,bm->height,FORMAT_NATIVE,false);
|
||||||
if (bm_size > maxsize)
|
|
||||||
return -1;
|
|
||||||
char *buf_start = (char *)bm->data + bm_size;
|
char *buf_start = (char *)bm->data + bm_size;
|
||||||
char *buf_end = (char *)bm->data + maxsize;
|
char *buf_end = (char *)bm->data + maxsize;
|
||||||
maxsize = buf_end - buf_start;
|
bool return_size = format & FORMAT_RETURN_SIZE;
|
||||||
#ifndef JPEG_FROM_MEM
|
#ifndef JPEG_FROM_MEM
|
||||||
ALIGN_BUFFER(buf_start, maxsize, sizeof(long));
|
ALIGN_BUFFER(buf_start, maxsize, sizeof(long));
|
||||||
|
if (!return_size)
|
||||||
|
{
|
||||||
if (maxsize < (int)sizeof(struct jpeg))
|
if (maxsize < (int)sizeof(struct jpeg))
|
||||||
return -1;
|
return -1;
|
||||||
memmove(buf_start, p_jpeg, sizeof(struct jpeg));
|
memmove(buf_start, p_jpeg, sizeof(struct jpeg));
|
||||||
p_jpeg = (struct jpeg *)buf_start;
|
p_jpeg = (struct jpeg *)buf_start;
|
||||||
|
}
|
||||||
buf_start += sizeof(struct jpeg);
|
buf_start += sizeof(struct jpeg);
|
||||||
maxsize = buf_end - buf_start;
|
|
||||||
#endif
|
#endif
|
||||||
fix_huff_tables(p_jpeg);
|
maxsize = buf_end - buf_start;
|
||||||
#ifdef HAVE_LCD_COLOR
|
#ifdef HAVE_LCD_COLOR
|
||||||
int decode_buf_size = (p_jpeg->x_mbl << p_jpeg->h_scale[1])
|
int decode_buf_size = (p_jpeg->x_mbl << p_jpeg->h_scale[1])
|
||||||
<< p_jpeg->v_scale[1];
|
<< p_jpeg->v_scale[1];
|
||||||
|
@ -2236,9 +2237,27 @@ int clip_jpeg_fd(int fd, int flags,
|
||||||
#endif
|
#endif
|
||||||
decode_buf_size *= JPEG_PIX_SZ;
|
decode_buf_size *= JPEG_PIX_SZ;
|
||||||
JDEBUGF("decode buffer size: %d\n", decode_buf_size);
|
JDEBUGF("decode buffer size: %d\n", decode_buf_size);
|
||||||
p_jpeg->img_buf = (jpeg_pix_t *)buf_start;
|
if (return_size)
|
||||||
|
{
|
||||||
|
return (buf_start - (char *) bm->data) + decode_buf_size
|
||||||
|
+ (resize
|
||||||
|
?
|
||||||
|
/* buffer for 1 line + 2 spare lines */
|
||||||
|
#ifdef HAVE_LCD_COLOR
|
||||||
|
sizeof(struct uint32_argb)
|
||||||
|
#else
|
||||||
|
sizeof(uint32_t)
|
||||||
|
#endif
|
||||||
|
* 3 * bm->width
|
||||||
|
: 0);
|
||||||
|
}
|
||||||
|
|
||||||
if (buf_end - buf_start < decode_buf_size)
|
if (buf_end - buf_start < decode_buf_size)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
fix_huff_tables(p_jpeg);
|
||||||
|
|
||||||
|
p_jpeg->img_buf = (jpeg_pix_t *)buf_start;
|
||||||
buf_start += decode_buf_size;
|
buf_start += decode_buf_size;
|
||||||
maxsize = buf_end - buf_start;
|
maxsize = buf_end - buf_start;
|
||||||
memset(p_jpeg->img_buf, 0, decode_buf_size);
|
memset(p_jpeg->img_buf, 0, decode_buf_size);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue