private static void examine_app0(jpeg_decompress_struct cinfo, byte[] data, int datalen, int remaining)
{
int totallen = datalen + remaining;
if (datalen >= APP0_DATA_LEN &&
data[0] == 0x4A &&
data[1] == 0x46 &&
data[2] == 0x49 &&
data[3] == 0x46 &&
data[4] == 0)
{
/* Found JFIF APP0 marker: save info */
cinfo.m_saw_JFIF_marker = true;
cinfo.m_JFIF_major_version = data[5];
cinfo.m_JFIF_minor_version = data[6];
cinfo.m_density_unit = (DensityUnit)data[7];
cinfo.m_X_density = (short)((data[8] << 8) + data[9]);
cinfo.m_Y_density = (short)((data[10] << 8) + data[11]);
/* Check version.
* Major version must be 1 or 2, anything else signals an incompatible change.
* (We used to treat this as an error, but now it's a nonfatal warning,
* because some bozo at Hijaak couldn't read the spec.)
* Minor version should be 0..2, but process anyway if newer.
*/
if (cinfo.m_JFIF_major_version != 1 && cinfo.m_JFIF_major_version != 2)
cinfo.WARNMS(J_MESSAGE_CODE.JWRN_JFIF_MAJOR, cinfo.m_JFIF_major_version, cinfo.m_JFIF_minor_version);
/* Generate trace messages */
cinfo.TRACEMS(1, J_MESSAGE_CODE.JTRC_JFIF, cinfo.m_JFIF_major_version, cinfo.m_JFIF_minor_version, cinfo.m_X_density,
cinfo.m_Y_density, cinfo.m_density_unit);
/* Validate thumbnail dimensions and issue appropriate messages */
if ((data[12] | data[13]) != 0)
cinfo.TRACEMS(1, J_MESSAGE_CODE.JTRC_JFIF_THUMBNAIL, data[12], data[13]);
totallen -= APP0_DATA_LEN;
if (totallen != ((int)data[12] * (int)data[13] * 3))
cinfo.TRACEMS(1, J_MESSAGE_CODE.JTRC_JFIF_BADTHUMBNAILSIZE, totallen);
}
else if (datalen >= 6 && data[0] == 0x4A && data[1] == 0x46 && data[2] == 0x58 && data[3] == 0x58 && data[4] == 0)
{
/* Found JFIF "JFXX" extension APP0 marker */
/* The library doesn't actually do anything with these,
* but we try to produce a helpful trace message.
*/
switch (data[5])
{
case 0x10:
cinfo.TRACEMS(1, J_MESSAGE_CODE.JTRC_THUMB_JPEG, totallen);
break;
case 0x11:
cinfo.TRACEMS(1, J_MESSAGE_CODE.JTRC_THUMB_PALETTE, totallen);
break;
case 0x13:
cinfo.TRACEMS(1, J_MESSAGE_CODE.JTRC_THUMB_RGB, totallen);
break;
default:
cinfo.TRACEMS(1, J_MESSAGE_CODE.JTRC_JFIF_EXTENSION, data[5], totallen);
break;
}
}
else
{
/* Start of APP0 does not match "JFIF" or "JFXX", or too short */
cinfo.TRACEMS(1, J_MESSAGE_CODE.JTRC_APP0, totallen);
}
}