#define JPEG_SAMPLING_1x1 0x11
-#define JPEG_MARKER_SOI 0xd8
-#define JPEG_MARKER_EOI 0xd9
-#define JPEG_MARKER_DHT 0xc4
-#define JPEG_MARKER_DQT 0xdb
-#define JPEG_MARKER_SOF0 0xc0
-#define JPEG_MARKER_SOS 0xda
-#define JPEG_MARKER_DRI 0xdd
-#define JPEG_MARKER_RST0 0xd0
-#define JPEG_MARKER_RST1 0xd1
-#define JPEG_MARKER_RST2 0xd2
-#define JPEG_MARKER_RST3 0xd3
-#define JPEG_MARKER_RST4 0xd4
-#define JPEG_MARKER_RST5 0xd5
-#define JPEG_MARKER_RST6 0xd6
-#define JPEG_MARKER_RST7 0xd7
+enum
+ {
+ JPEG_MARKER_SOF0 = 0xc0,
+ JPEG_MARKER_DHT = 0xc4,
+ JPEG_MARKER_SOI = 0xd8,
+ JPEG_MARKER_EOI = 0xd9,
+ JPEG_MARKER_RST0 = 0xd0,
+ JPEG_MARKER_RST1 = 0xd1,
+ JPEG_MARKER_RST2 = 0xd2,
+ JPEG_MARKER_RST3 = 0xd3,
+ JPEG_MARKER_RST4 = 0xd4,
+ JPEG_MARKER_RST5 = 0xd5,
+ JPEG_MARKER_RST6 = 0xd6,
+ JPEG_MARKER_RST7 = 0xd7,
+ JPEG_MARKER_SOS = 0xda,
+ JPEG_MARKER_DQT = 0xdb,
+ JPEG_MARKER_DRI = 0xdd,
+ };
#define SHIFT_BITS 8
#define CONST(x) ((int) ((x) * (1L << SHIFT_BITS) + 0.5))
int dc_value[3];
+ int color_components;
+
int bit_mask, bit_save;
};
return grub_error (GRUB_ERR_BAD_FILE_TYPE, "jpeg: invalid image size");
cc = grub_jpeg_get_byte (data);
- if (cc != 3)
+ if (cc != 1 && cc != 3)
return grub_error (GRUB_ERR_BAD_FILE_TYPE,
- "jpeg: component count must be 3");
+ "jpeg: component count must be 1 or 3");
+ data->color_components = cc;
for (i = 0; i < cc; i++)
{
cc = grub_jpeg_get_byte (data);
- if (cc != 3)
+ if (cc != 3 && cc != 1)
return grub_error (GRUB_ERR_BAD_FILE_TYPE,
- "jpeg: component count must be 3");
+ "jpeg: component count must be 1 or 3");
+ data->color_components = cc;
for (i = 0; i < cc; i++)
{
for (c2 = 0; c2 < data->hs; c2++)
grub_jpeg_decode_du (data, 0, data->ydu[r2 * 2 + c2]);
- grub_jpeg_decode_du (data, 1, data->cbdu);
- grub_jpeg_decode_du (data, 2, data->crdu);
+ if (data->color_components >= 3)
+ {
+ grub_jpeg_decode_du (data, 1, data->cbdu);
+ grub_jpeg_decode_du (data, 2, data->crdu);
+ }
+ grub_memset (&data->cbdu, 0, sizeof (data->cbdu));
+ grub_memset (&data->crdu, 0, sizeof (data->crdu));
if (grub_errno)
return grub_errno;
for (r2 = 0; r2 < nr2; r2++, ptr2 += (data->image_width - nc2) * 3)
for (c2 = 0; c2 < nc2; c2++, ptr2 += 3)
{
- int i0, yy, cr, cb;
+ int i0, yy;
i0 = (r2 / data->vs) * 8 + (c2 / data->hs);
- cr = data->crdu[i0];
- cb = data->cbdu[i0];
yy = data->ydu[(r2 / 8) * 2 + (c2 / 8)][(r2 % 8) * 8 + (c2 % 8)];
- grub_jpeg_ycrcb_to_rgb (yy, cr, cb, ptr2);
+ if (data->color_components >= 3)
+ {
+ int cr, cb;
+ cr = data->crdu[i0];
+ cb = data->cbdu[i0];
+ grub_jpeg_ycrcb_to_rgb (yy, cr, cb, ptr2);
+ }
+ else
+ {
+ ptr2[0] = yy;
+ ptr2[1] = yy;
+ ptr2[2] = yy;
+ }
}
}
#if defined(JPEG_DEBUG)
static grub_err_t
-grub_cmd_jpegtest (grub_command_t cmd __attribute__ ((unused)),
+grub_cmd_jpegtest (grub_command_t cmdd __attribute__ ((unused)),
int argc, char **args)
{
struct grub_video_bitmap *bitmap = 0;