emile: handle AGRY88 for JPEG image.

This commit is contained in:
Cedric BAIL 2015-03-17 08:50:25 +01:00
parent ce340ce2fb
commit a88f0074d7
1 changed files with 131 additions and 5 deletions

View File

@ -201,8 +201,9 @@ static const Emile_Colorspace cspaces_etc1_alpha[2] = {
EMILE_COLORSPACE_ARGB8888
};
static const Emile_Colorspace cspaces_gry[2] = {
static const Emile_Colorspace cspaces_agry[2] = {
EMILE_COLORSPACE_GRY8,
EMILE_COLORSPACE_AGRY88,
EMILE_COLORSPACE_ARGB8888
};
@ -1159,6 +1160,88 @@ _rotate_change_wh8(uint8_t *to, uint8_t *from,
}
}
static void
_rotate16_180(uint16_t *data, int w, int h)
{
uint16_t *p1, *p2;
uint16_t pt;
int x;
p1 = data;
p2 = data + (h * w) - 1;
for (x = (w * h) / 2; --x >= 0;)
{
pt = *p1;
*p1 = *p2;
*p2 = pt;
p1++;
p2--;
}
}
static void
_flip_horizontal16(uint16_t *data, int w, int h)
{
uint16_t *p1, *p2;
uint16_t pt;
int x, y;
for (y = 0; y < h; y++)
{
p1 = data + (y * w);
p2 = data + ((y + 1) * w) - 1;
for (x = 0; x < (w >> 1); x++)
{
pt = *p1;
*p1 = *p2;
*p2 = pt;
p1++;
p2--;
}
}
}
static void
_flip_vertical16(uint16_t *data, int w, int h)
{
uint16_t *p1, *p2;
uint16_t pt;
int x, y;
for (y = 0; y < (h >> 1); y++)
{
p1 = data + (y * w);
p2 = data + ((h - 1 - y) * w);
for (x = 0; x < w; x++)
{
pt = *p1;
*p1 = *p2;
*p2 = pt;
p1++;
p2++;
}
}
}
static void
_rotate_change_wh16(uint16_t *to, uint16_t *from,
int w, int h,
int dx, int dy)
{
int x, y;
for (x = h; --x >= 0;)
{
for (y = w; --y >= 0;)
{
*to = *from;
from++;
to += dy;
}
to += dx;
}
}
static Eina_Bool
_emile_jpeg_bind(Emile_Image *image EINA_UNUSED,
Emile_Image_Load_Opts *opts EINA_UNUSED,
@ -1231,8 +1314,8 @@ _emile_jpeg_head(Emile_Image *image,
if (cinfo.jpeg_color_space == JCS_GRAYSCALE)
{
// We do handle GRY8 colorspace as an output for JPEG
prop->cspaces = cspaces_gry;
// We do handle GRY8 and AGRY88 (with FF for alpha) colorspace as an output for JPEG
prop->cspaces = cspaces_agry;
}
/* rotation decoding */
@ -1406,7 +1489,7 @@ _emile_jpeg_data(Emile_Image *image,
void *pixels,
Emile_Image_Load_Error *error)
{
// Handle RGB, ARGB and GRY
// Handle RGB, ARGB, GRY and AGRY
Emile_Image_Load_Opts *opts = NULL;
unsigned int w, h;
struct jpeg_decompress_struct cinfo;
@ -1414,6 +1497,7 @@ _emile_jpeg_data(Emile_Image *image,
const unsigned char *m = NULL;
uint8_t *ptr, *line[16], *data;
uint32_t *ptr2, *ptr_rotate = NULL;
uint16_t *ptrag, *ptrag_rotate = NULL;
uint8_t *ptrg, *ptrg_rotate = NULL;
unsigned int x, y, l, i, scans;
int region = 0;
@ -1481,7 +1565,8 @@ _emile_jpeg_data(Emile_Image *image,
case JCS_UNKNOWN:
break;
case JCS_GRAYSCALE:
if (prop->cspace == EMILE_COLORSPACE_GRY8)
if (prop->cspace == EMILE_COLORSPACE_GRY8 ||
prop->cspace == EMILE_COLORSPACE_AGRY88)
{
cinfo.out_color_space = JCS_GRAYSCALE;
break;
@ -1576,6 +1661,7 @@ _emile_jpeg_data(Emile_Image *image,
switch (prop->cspace)
{
case EMILE_COLORSPACE_GRY8:
case EMILE_COLORSPACE_AGRY88:
if (!(cinfo.out_color_space == JCS_GRAYSCALE &&
cinfo.output_components == 1))
{
@ -1611,6 +1697,11 @@ _emile_jpeg_data(Emile_Image *image,
ptrg = malloc(w * h * sizeof(uint8_t));
ptrg_rotate = ptrg;
}
else if (prop->cspace == EMILE_COLORSPACE_AGRY88)
{
ptrag = malloc(w * h * sizeof(uint16_t));
ptrag_rotate = ptrag;
}
else
{
ptr2 = malloc(w * h * sizeof(uint32_t));
@ -1861,6 +1952,11 @@ _emile_jpeg_data(Emile_Image *image,
*ptrg = ptr[0];
ptrg++;
}
else if (prop->cspace == EMILE_COLORSPACE_AGRY88)
{
*ptrag = 0xFF | ptr[0];
ptrag++;
}
else
{
*ptr2 = ARGB_JOIN(0xff, ptr[0], ptr[0], ptr[0]);
@ -1900,6 +1996,11 @@ _emile_jpeg_data(Emile_Image *image,
*ptrg = ptr[0];
ptrg++;
}
else if (prop->cspace == EMILE_COLORSPACE_AGRY88)
{
*ptrag = 0xFF00 | ptr[0];
ptrag++;
}
else
{
*ptr2 = ARGB_JOIN(0xff, ptr[0], ptr[0], ptr[0]);
@ -1923,11 +2024,13 @@ done:
{
uint32_t *to;
uint8_t *to8;
uint16_t *to16;
int hw;
hw = w * h;
to = pixels;
to8 = pixels;
to16 = pixels;
switch (degree)
{
@ -1939,6 +2042,13 @@ done:
else
_rotate_change_wh8(to8 + h - 1, ptrg_rotate, w, h, -hw - 1, h);
}
else if (prop->cspace == EMILE_COLORSPACE_AGRY88)
{
if (prop->flipped)
_rotate_change_wh16(to16 + hw - 1, ptrag_rotate, w, h, hw - 1, -h);
else
_rotate_change_wh16(to16 + h - 1, ptrag_rotate, w, h, -hw - 1, h);
}
else
{
if (prop->flipped)
@ -1955,6 +2065,13 @@ done:
else
_rotate8_180(to8, w, h);
}
else if (prop->cspace == EMILE_COLORSPACE_AGRY88)
{
if (prop->flipped)
_flip_vertical16(to16, w, h);
else
_rotate16_180(to16, w, h);
}
else
{
if (prop->flipped)
@ -1971,6 +2088,13 @@ done:
else
_rotate_change_wh8(to8 + hw - h, ptrg_rotate, w, h, hw + 1, -h);
}
else if (prop->cspace == EMILE_COLORSPACE_AGRY88)
{
if (prop->flipped)
_rotate_change_wh16(to16, ptrag_rotate, w, h, -hw + 1, h);
else
_rotate_change_wh16(to16 + hw - h, ptrag_rotate, w, h, hw + 1, -h);
}
else
{
if (prop->flipped)
@ -1984,6 +2108,8 @@ done:
{
if (prop->cspace == EMILE_COLORSPACE_GRY8)
_flip_horizontal8(to8, w, h);
else if (prop->cspace == EMILE_COLORSPACE_AGRY88)
_flip_horizontal16(to16, w, h);
else
_flip_horizontal(to, w, h);
}