private static jpeg_fdct_float ( float data, byte sample_data, int start_row, int start_col ) : void | ||
data | float | |
sample_data | byte | |
start_row | int | |
start_col | int | |
return | void |
private static void jpeg_fdct_float(float[] data, byte[][] sample_data, int start_row, int start_col)
{
/* Pass 1: process rows. */
int dataIndex = 0;
for (int ctr = 0; ctr < JpegConstants.DCTSIZE; ctr++)
{
byte[] elem = sample_data[start_row + ctr];
int elemIndex = start_col;
/* Load data into workspace */
float tmp0 = elem[elemIndex + 0] + elem[elemIndex + 7];
float tmp7 = elem[elemIndex + 0] - elem[elemIndex + 7];
float tmp1 = elem[elemIndex + 1] + elem[elemIndex + 6];
float tmp6 = elem[elemIndex + 1] - elem[elemIndex + 6];
float tmp2 = elem[elemIndex + 2] + elem[elemIndex + 5];
float tmp5 = elem[elemIndex + 2] - elem[elemIndex + 5];
float tmp3 = elem[elemIndex + 3] + elem[elemIndex + 4];
float tmp4 = elem[elemIndex + 3] - elem[elemIndex + 4];
/* Even part */
float tmp10 = tmp0 + tmp3; /* phase 2 */
float tmp13 = tmp0 - tmp3;
float tmp11 = tmp1 + tmp2;
float tmp12 = tmp1 - tmp2;
/* Apply unsigned->signed conversion. */
data[dataIndex + 0] = tmp10 + tmp11 - 8 * JpegConstants.CENTERJSAMPLE; /* phase 3 */
data[dataIndex + 4] = tmp10 - tmp11;
float z1 = (tmp12 + tmp13) * ((float)0.707106781); /* c4 */
data[dataIndex + 2] = tmp13 + z1; /* phase 5 */
data[dataIndex + 6] = tmp13 - z1;
/* Odd part */
tmp10 = tmp4 + tmp5; /* phase 2 */
tmp11 = tmp5 + tmp6;
tmp12 = tmp6 + tmp7;
/* The rotator is modified from fig 4-8 to avoid extra negations. */
float z5 = (tmp10 - tmp12) * ((float)0.382683433); /* c6 */
float z2 = ((float)0.541196100) * tmp10 + z5; /* c2-c6 */
float z4 = ((float)1.306562965) * tmp12 + z5; /* c2+c6 */
float z3 = tmp11 * ((float)0.707106781); /* c4 */
float z11 = tmp7 + z3; /* phase 5 */
float z13 = tmp7 - z3;
data[dataIndex + 5] = z13 + z2; /* phase 6 */
data[dataIndex + 3] = z13 - z2;
data[dataIndex + 1] = z11 + z4;
data[dataIndex + 7] = z11 - z4;
dataIndex += JpegConstants.DCTSIZE; /* advance pointer to next row */
}
/* Pass 2: process columns. */
dataIndex = 0;
for (int ctr = JpegConstants.DCTSIZE - 1; ctr >= 0; ctr--)
{
float tmp0 = data[dataIndex + JpegConstants.DCTSIZE * 0] + data[dataIndex + JpegConstants.DCTSIZE * 7];
float tmp7 = data[dataIndex + JpegConstants.DCTSIZE * 0] - data[dataIndex + JpegConstants.DCTSIZE * 7];
float tmp1 = data[dataIndex + JpegConstants.DCTSIZE * 1] + data[dataIndex + JpegConstants.DCTSIZE * 6];
float tmp6 = data[dataIndex + JpegConstants.DCTSIZE * 1] - data[dataIndex + JpegConstants.DCTSIZE * 6];
float tmp2 = data[dataIndex + JpegConstants.DCTSIZE * 2] + data[dataIndex + JpegConstants.DCTSIZE * 5];
float tmp5 = data[dataIndex + JpegConstants.DCTSIZE * 2] - data[dataIndex + JpegConstants.DCTSIZE * 5];
float tmp3 = data[dataIndex + JpegConstants.DCTSIZE * 3] + data[dataIndex + JpegConstants.DCTSIZE * 4];
float tmp4 = data[dataIndex + JpegConstants.DCTSIZE * 3] - data[dataIndex + JpegConstants.DCTSIZE * 4];
/* Even part */
float tmp10 = tmp0 + tmp3; /* phase 2 */
float tmp13 = tmp0 - tmp3;
float tmp11 = tmp1 + tmp2;
float tmp12 = tmp1 - tmp2;
data[dataIndex + JpegConstants.DCTSIZE * 0] = tmp10 + tmp11; /* phase 3 */
data[dataIndex + JpegConstants.DCTSIZE * 4] = tmp10 - tmp11;
float z1 = (tmp12 + tmp13) * ((float)0.707106781); /* c4 */
data[dataIndex + JpegConstants.DCTSIZE * 2] = tmp13 + z1; /* phase 5 */
data[dataIndex + JpegConstants.DCTSIZE * 6] = tmp13 - z1;
/* Odd part */
tmp10 = tmp4 + tmp5; /* phase 2 */
tmp11 = tmp5 + tmp6;
tmp12 = tmp6 + tmp7;
/* The rotator is modified from fig 4-8 to avoid extra negations. */
float z5 = (tmp10 - tmp12) * ((float)0.382683433); /* c6 */
float z2 = ((float)0.541196100) * tmp10 + z5; /* c2-c6 */
float z4 = ((float)1.306562965) * tmp12 + z5; /* c2+c6 */
float z3 = tmp11 * ((float)0.707106781); /* c4 */
float z11 = tmp7 + z3; /* phase 5 */
float z13 = tmp7 - z3;
data[dataIndex + JpegConstants.DCTSIZE * 5] = z13 + z2; /* phase 6 */
data[dataIndex + JpegConstants.DCTSIZE * 3] = z13 - z2;
data[dataIndex + JpegConstants.DCTSIZE * 1] = z11 + z4;
data[dataIndex + JpegConstants.DCTSIZE * 7] = z11 - z4;
dataIndex++; /* advance pointer to next column */
}
}