BGR56r & BGR555 support.......... please test if u have a display like this :)

SVN revision: 2345
This commit is contained in:
Carsten Haitzler 2000-03-27 19:17:37 +00:00
parent 904b9f7c61
commit e65ff79503
5 changed files with 511 additions and 50 deletions

View File

@ -18,7 +18,8 @@ __imlib_XActualDepth(Display *d, Visual *v)
if (xvir)
{
depth = xvir[0].depth;
if ((depth == 16) && (xvir->red_mask != 0xf800))
if ((depth == 16) &&
((xvir->red_mask | xvir->green_mask | xvir->blue_mask) != 0xffff))
depth = 15;
XFree(xvir);
}

View File

@ -264,16 +264,32 @@ __imlib_RenderImage(Display *d, ImlibImage *im,
/* common depths first */
if (actual_depth == 16)
{
if (hiq)
__imlib_RGBA_to_RGB565_dither(pointer, jump,
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
(xim->bytes_per_line / sizeof(DATA16)) - dw,
dw, hh, dx, dy + y);
if (bgr)
{
if (hiq)
__imlib_RGBA_to_BGR565_dither(pointer, jump,
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
(xim->bytes_per_line / sizeof(DATA16)) - dw,
dw, hh, dx, dy + y);
else
__imlib_RGBA_to_BGR565_fast(pointer, jump,
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
(xim->bytes_per_line / sizeof(DATA16)) - dw,
dw, hh, dx, dy + y);
}
else
__imlib_RGBA_to_RGB565_fast(pointer, jump,
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
(xim->bytes_per_line / sizeof(DATA16)) - dw,
dw, hh, dx, dy + y);
{
if (hiq)
__imlib_RGBA_to_RGB565_dither(pointer, jump,
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
(xim->bytes_per_line / sizeof(DATA16)) - dw,
dw, hh, dx, dy + y);
else
__imlib_RGBA_to_RGB565_fast(pointer, jump,
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
(xim->bytes_per_line / sizeof(DATA16)) - dw,
dw, hh, dx, dy + y);
}
}
/* FIXME: need to handle different RGB ordering */
else if (actual_depth == 24)
@ -396,16 +412,32 @@ __imlib_RenderImage(Display *d, ImlibImage *im,
}
else if (actual_depth == 15)
{
if (hiq)
__imlib_RGBA_to_RGB555_dither(pointer, jump,
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
(xim->bytes_per_line / sizeof(DATA16)) - dw,
dw, hh, dx, dy + y);
if (bgr)
{
if (hiq)
__imlib_RGBA_to_BGR555_dither(pointer, jump,
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
(xim->bytes_per_line / sizeof(DATA16)) - dw,
dw, hh, dx, dy + y);
else
__imlib_RGBA_to_BGR555_fast(pointer, jump,
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
(xim->bytes_per_line / sizeof(DATA16)) - dw,
dw, hh, dx, dy + y);
}
else
__imlib_RGBA_to_RGB555_fast(pointer, jump,
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
(xim->bytes_per_line / sizeof(DATA16)) - dw,
dw, hh, dx, dy + y);
{
if (hiq)
__imlib_RGBA_to_RGB555_dither(pointer, jump,
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
(xim->bytes_per_line / sizeof(DATA16)) - dw,
dw, hh, dx, dy + y);
else
__imlib_RGBA_to_RGB555_fast(pointer, jump,
((DATA16 *)xim->data) + (y * (xim->bytes_per_line / sizeof(DATA16))),
(xim->bytes_per_line / sizeof(DATA16)) - dw,
dw, hh, dx, dy + y);
}
}
if (m)
{

View File

@ -105,6 +105,71 @@ static DATA8 *_dither_b8;
dest += 2; src += 2; \
}
#endif
/*****************************************************************************/
/* MACROS for plain RGBA -> BGR565 conversion */
#define WRITE1_RGBA_BGR565(src, dest) \
*dest = ((*src << 8) & 0xf800) | \
((*src >> 5) & 0x7e0) | \
((*src >> 19)& 0x1f); dest++; src++
#ifdef WORDS_BIGENDIAN
#define WRITE2_RGBA_BGR565(src, dest) \
{ \
*((DATA32 *)dest) = ((src[1] << 8) & 0xf800) | \
((src[1] >> 5) & 0x7e0) | \
((src[1] >> 19)& 0x1f) | \
((src[0] << 24) & 0xf8000000) | \
((src[0] << 11) & 0x7e00000) | \
((src[0] >> 3) & 0x1f0000); \
dest += 2; src += 2; \
}
#else
#define WRITE2_RGBA_BGR565(src, dest) \
{ \
*((DATA32 *)dest) = ((src[0] << 8) & 0xf800) | \
((src[0] >> 5) & 0x7e0) | \
((src[0] >> 19)& 0x1f) | \
((src[1] << 24) & 0xf8000000) | \
((src[1] << 11) & 0x7e00000) | \
((src[1] >> 3) & 0x1f0000); \
dest += 2; src += 2; \
}
#endif
/*****************************************************************************/
/* MACROS for dithered RGBA -> BGR565 conversion */
#define DITHER_RGBA_BGR565_LUT_R(num) \
(_dither_r16[(((x + num) & 0x3) << 10) | ((y & 0x3) << 8) | ((src[num] >> 0 ) & 0xff)])
#define DITHER_RGBA_BGR565_LUT_G(num) \
(_dither_g16[(((x + num) & 0x3) << 10) | ((y & 0x3) << 8) | ((src[num] >> 8 ) & 0xff)])
#define DITHER_RGBA_BGR565_LUT_B(num) \
(_dither_b16[(((x + num) & 0x3) << 10) | ((y & 0x3) << 8) | ((src[num] >> 16) & 0xff)])
#define WRITE1_RGBA_BGR565_DITHER(src, dest) \
*dest = (DITHER_RGBA_BGR565_LUT_R(0)) | \
(DITHER_RGBA_BGR565_LUT_G(0)) | \
(DITHER_RGBA_BGR565_LUT_B(0)); dest++; src++
#ifdef WORDS_BIGENDIAN
#define WRITE2_RGBA_BGR565_DITHER(src, dest) \
{ \
*((DATA32 *)dest) = ((DITHER_RGBA_BGR565_LUT_R(1))) | \
((DITHER_RGBA_BGR565_LUT_G(1))) | \
((DITHER_RGBA_BGR565_LUT_B(1))) | \
((DITHER_RGBA_BGR565_LUT_R(0) << 16)) | \
((DITHER_RGBA_BGR565_LUT_G(0) << 16)) | \
((DITHER_RGBA_BGR565_LUT_B(0) << 16)); \
dest += 2; src += 2; \
}
#else
#define WRITE2_RGBA_BGR565_DITHER(src, dest) \
{ \
*((DATA32 *)dest) = ((DITHER_RGBA_BGR565_LUT_R(0))) | \
((DITHER_RGBA_BGR565_LUT_G(0))) | \
((DITHER_RGBA_BGr565_LUT_B(0))) | \
((DITHER_RGBA_BGR565_LUT_R(1) << 16)) | \
((DITHER_RGBA_BGR565_LUT_G(1) << 16)) | \
((DITHER_RGBA_BGR565_LUT_B(1) << 16)); \
dest += 2; src += 2; \
}
#endif
/*****************************************************************************/
/* Actual rendering routines */
@ -177,6 +242,72 @@ static DATA8 *_dither_b8;
}
#endif
/*****************************************************************************/
/* MACROS for plain RGBA -> BGR555 conversion */
#define WRITE1_RGBA_BGR555(src, dest) \
*dest = ((*src << 7) & 0x7c00) | \
((*src >> 6) & 0x3e0) | \
((*src >> 19)& 0x1f); dest++; src++
#ifdef WORDS_BIGENDIAN
#define WRITE2_RGBA_BGR555(src, dest) \
{ \
*((DATA32 *)dest) = ((src[1] << 7) & 0x7c00) | \
((src[1] >> 6) & 0x3e0) | \
((src[1] >> 19)& 0x1f) | \
((src[0] << 23) & 0x7c000000) | \
((src[0] << 10) & 0x3e00000) | \
((src[0] >> 3) & 0x1f0000); \
dest += 2; src += 2; \
}
#else
#define WRITE2_RGBA_BGR555(src, dest) \
{ \
*((DATA32 *)dest) = ((src[0] << 7) & 0x7c00) | \
((src[0] >> 6) & 0x3e0) | \
((src[0] >> 19)& 0x1f) | \
((src[1] << 23) & 0x7c000000) | \
((src[1] << 10) & 0x3e00000) | \
((src[1] >> 3) & 0x1f0000); \
dest += 2; src += 2; \
}
#endif
/*****************************************************************************/
/* MACROS for dithered RGBA -> BGR555 conversion */
#define DITHER_RGBA_BGR555_LUT_R(num) \
(_dither_r16[(((x + num) & 0x3) << 10) | ((y & 0x3) << 8) | ((src[num] >> 0 ) & 0xff)])
#define DITHER_RGBA_BGR555_LUT_G(num) \
(_dither_g16[(((x + num) & 0x3) << 10) | ((y & 0x3) << 8) | ((src[num] >> 8 ) & 0xff)])
#define DITHER_RGBA_BGR555_LUT_B(num) \
(_dither_b16[(((x + num) & 0x3) << 10) | ((y & 0x3) << 8) | ((src[num] >> 16 ) & 0xff)])
#define WRITE1_RGBA_BGR555_DITHER(src, dest) \
*dest = (DITHER_RGBA_BGR555_LUT_R(0)) | \
(DITHER_RGBA_BGR555_LUT_G(0)) | \
(DITHER_RGBA_BGR555_LUT_B(0)); dest++; src++
#ifdef WORDS_BIGENDIAN
#define WRITE2_RGBA_BGR555_DITHER(src, dest) \
{ \
*((DATA32 *)dest) = ((DITHER_RGBA_BGR555_LUT_R(1))) | \
((DITHER_RGBA_BGR555_LUT_G(1))) | \
((DITHER_RGBA_BGR555_LUT_B(1))) | \
((DITHER_RGBA_BGR555_LUT_R(0) << 16)) | \
((DITHER_RGBA_BGR555_LUT_G(0) << 16)) | \
((DITHER_RGBA_BGR555_LUT_B(0) << 16)); \
dest += 2; src += 2; \
}
#else
#define WRITE2_RGBA_BGR555_DITHER(src, dest) \
{ \
*((DATA32 *)dest) = ((DITHER_RGBA_BGR555_LUT_R(0))) | \
((DITHER_RGBA_BGR555_LUT_G(0))) | \
((DITHER_RGBA_BGR555_LUT_B(0))) | \
((DITHER_RGBA_BGR555_LUT_R(1) << 16)) | \
((DITHER_RGBA_BGR555_LUT_G(1) << 16)) | \
((DITHER_RGBA_BGR555_LUT_B(1) << 16)); \
dest += 2; src += 2; \
}
#endif
/*****************************************************************************/
/* Actual rendering routines */
/* RGBA -> RGB332 */
@ -1585,6 +1716,144 @@ __imlib_RGBA_to_RGB565_dither(DATA32 *src , int src_jump,
dy = 0;
}
void
__imlib_RGBA_to_BGR565_fast(DATA32 *src , int src_jump,
DATA16 *dest, int dest_jump,
int width, int height, int dx, int dy)
{
int x, y, w, h;
w = width;
h = height;
if (IS_ALIGNED_32((int)dest))
{
if (IS_MULTIPLE_2(width))
{
for (y = 0; y < h; y++)
{
for (x = 0; x < w; x+=2)
WRITE2_RGBA_BGR565(src, dest);
src += src_jump;
dest += dest_jump;
}
}
else
{
w--;
for (y = 0; y < h; y++)
{
for (x = 0; x < w; x+=2)
WRITE2_RGBA_BGR565(src, dest);
WRITE1_RGBA_BGR565(src, dest);
src += src_jump;
dest += dest_jump;
}
}
}
else
{
if (IS_MULTIPLE_2(width))
{
w-=2;
for (y = 0; y < h; y++)
{
WRITE1_RGBA_BGR565(src, dest);
for (x = 0; x < w; x+=2)
WRITE2_RGBA_BGR565(src, dest);
WRITE1_RGBA_BGR565(src, dest);
src += src_jump;
dest += dest_jump;
}
}
else
{
w--;
for (y = 0; y < h; y++)
{
WRITE1_RGBA_BGR565(src, dest);
for (x = 0; x < w; x+=2)
WRITE2_RGBA_BGR565(src, dest);
src += src_jump;
dest += dest_jump;
}
}
}
return;
dx = 0;
dy = 0;
}
void
__imlib_RGBA_to_BGR565_dither(DATA32 *src , int src_jump,
DATA16 *dest, int dest_jump,
int width, int height, int dx, int dy)
{
int x, y, w, h;
w = width + dx;
h = height + dy;
if (IS_ALIGNED_32((int)dest))
{
if (IS_MULTIPLE_2(width))
{
for (y = dy; y < h; y++)
{
for (x = dx; x < w; x+=2)
WRITE2_RGBA_BGR565_DITHER(src, dest);
src += src_jump;
dest += dest_jump;
}
}
else
{
w--;
for (y = dy; y < h; y++)
{
for (x = dx; x < w; x+=2)
WRITE2_RGBA_BGR565_DITHER(src, dest);
WRITE1_RGBA_BGR565_DITHER(src, dest);
src += src_jump;
dest += dest_jump;
}
}
}
else
{
if (IS_MULTIPLE_2(width))
{
w-=2;
for (y = dy; y < h; y++)
{
x = dx - 1;
WRITE1_RGBA_BGR565_DITHER(src, dest);
for (x = dx; x < w; x+=2)
WRITE2_RGBA_BGR565_DITHER(src, dest);
WRITE1_RGBA_BGR565_DITHER(src, dest);
src += src_jump;
dest += dest_jump;
}
}
else
{
w--;
for (y = 0; y < h; y++)
{
x = dx - 1;
WRITE1_RGBA_BGR565_DITHER(src, dest);
for (x = dx; x < w; x+=2)
WRITE2_RGBA_BGR565_DITHER(src, dest);
src += src_jump;
dest += dest_jump;
}
}
}
return;
dx = 0;
dy = 0;
}
void
__imlib_RGBA_to_RGB555_fast(DATA32 *src , int src_jump,
DATA16 *dest, int dest_jump,
@ -1723,6 +1992,144 @@ __imlib_RGBA_to_RGB555_dither(DATA32 *src , int src_jump,
dy = 0;
}
void
__imlib_RGBA_to_BGR555_fast(DATA32 *src , int src_jump,
DATA16 *dest, int dest_jump,
int width, int height, int dx, int dy)
{
int x, y, w, h;
w = width;
h = height;
if (IS_ALIGNED_32((int)dest))
{
if (IS_MULTIPLE_2(width))
{
for (y = 0; y < h; y++)
{
for (x = 0; x < w; x+=2)
WRITE2_RGBA_BGR555(src, dest);
src += src_jump;
dest += dest_jump;
}
}
else
{
w--;
for (y = 0; y < h; y++)
{
for (x = 0; x < w; x+=2)
WRITE2_RGBA_BGR555(src, dest);
WRITE1_RGBA_BGR555(src, dest);
src += src_jump;
dest += dest_jump;
}
}
}
else
{
if (IS_MULTIPLE_2(width))
{
w-=2;
for (y = 0; y < h; y++)
{
WRITE1_RGBA_BGR555(src, dest);
for (x = 0; x < w; x+=2)
WRITE2_RGBA_BGR555(src, dest);
WRITE1_RGBA_BGR555(src, dest);
src += src_jump;
dest += dest_jump;
}
}
else
{
w--;
for (y = 0; y < h; y++)
{
WRITE1_RGBA_BGR555(src, dest);
for (x = 0; x < w; x+=2)
WRITE2_RGBA_BGR555(src, dest);
src += src_jump;
dest += dest_jump;
}
}
}
return;
dx = 0;
dy = 0;
}
void
__imlib_RGBA_to_BGR555_dither(DATA32 *src , int src_jump,
DATA16 *dest, int dest_jump,
int width, int height, int dx, int dy)
{
int x, y, w, h;
w = width + dx;
h = height + dy;
if (IS_ALIGNED_32((int)dest))
{
if (IS_MULTIPLE_2(width))
{
for (y = dy; y < h; y++)
{
for (x = dx; x < w; x+=2)
WRITE2_RGBA_BGR555_DITHER(src, dest);
src += src_jump;
dest += dest_jump;
}
}
else
{
w--;
for (y = dy; y < h; y++)
{
for (x = dx; x < w; x+=2)
WRITE2_RGBA_BGR555_DITHER(src, dest);
WRITE1_RGBA_BGR555_DITHER(src, dest);
src += src_jump;
dest += dest_jump;
}
}
}
else
{
if (IS_MULTIPLE_2(width))
{
w-=2;
for (y = dy; y < h; y++)
{
x = dx - 1;
WRITE1_RGBA_BGR555_DITHER(src, dest);
for (x = dx; x < w; x+=2)
WRITE2_RGBA_BGR555_DITHER(src, dest);
WRITE1_RGBA_BGR555_DITHER(src, dest);
src += src_jump;
dest += dest_jump;
}
}
else
{
w--;
for (y = dy; y < h; y++)
{
x = dx - 1;
WRITE1_RGBA_BGR555_DITHER(src, dest);
for (x = dx; x < w; x+=2)
WRITE2_RGBA_BGR555_DITHER(src, dest);
src += src_jump;
dest += dest_jump;
}
}
}
return;
dx = 0;
dy = 0;
}
void
__imlib_RGBA_to_RGB332_fast(DATA32 *src , int src_jump,
DATA8 *dest, int dest_jump,

View File

@ -16,6 +16,18 @@ void __imlib_RGBA_to_RGB555_fast(DATA32 *src , int src_jump,
void __imlib_RGBA_to_RGB555_dither(DATA32 *src , int src_jump,
DATA16 *dest, int dest_jump,
int width, int height, int dx, int dy);
void __imlib_RGBA_to_BGR565_fast(DATA32 *src , int src_jump,
DATA16 *dest, int dest_jump,
int width, int height, int dx, int dy);
void __imlib_RGBA_to_BGR565_dither(DATA32 *src , int src_jump,
DATA16 *dest, int dest_jump,
int width, int height, int dx, int dy);
void __imlib_RGBA_to_BGR555_fast(DATA32 *src , int src_jump,
DATA16 *dest, int dest_jump,
int width, int height, int dx, int dy);
void __imlib_RGBA_to_BGR555_dither(DATA32 *src , int src_jump,
DATA16 *dest, int dest_jump,
int width, int height, int dx, int dy);
void __imlib_RGBA_to_RGB332_fast(DATA32 *src , int src_jump,
DATA8 *dest, int dest_jump,
int width, int height, int dx, int dy);

View File

@ -131,20 +131,23 @@ int main (int argc, char **argv)
file = argv[i];
}
printf("init\n");
disp = XOpenDisplay(NULL);
vis = DefaultVisual(disp, DefaultScreen(disp));
depth = DefaultDepth(disp, DefaultScreen(disp));
cm = DefaultColormap(disp, DefaultScreen(disp));
/* nasty - using imlib internal function.. but it makes benchmarks fair */
if (!interactive)
__imlib_SetMaxXImageCount(disp, 3);
if (root)
win = DefaultRootWindow(disp);
else
if (!blendtest)
{
win = XCreateSimpleWindow(disp, DefaultRootWindow(disp), 0, 0, 10, 10, 0, 0, 0);
XSelectInput(disp, win, ButtonPressMask | ButtonReleaseMask |
ButtonMotionMask | PointerMotionMask | ExposureMask);
disp = XOpenDisplay(NULL);
vis = DefaultVisual(disp, DefaultScreen(disp));
depth = DefaultDepth(disp, DefaultScreen(disp));
cm = DefaultColormap(disp, DefaultScreen(disp));
/* nasty - using imlib internal function.. but it makes benchmarks fair */
if (!interactive)
__imlib_SetMaxXImageCount(disp, 3);
if (root)
win = DefaultRootWindow(disp);
else
{
win = XCreateSimpleWindow(disp, DefaultRootWindow(disp), 0, 0, 10, 10, 0, 0, 0);
XSelectInput(disp, win, ButtonPressMask | ButtonReleaseMask |
ButtonMotionMask | PointerMotionMask | ExposureMask);
}
}
if (!interactive)
{
@ -158,28 +161,34 @@ int main (int argc, char **argv)
w = imlib_image_get_width();
h = imlib_image_get_height();
}
if (!root)
if (!blendtest)
{
XResizeWindow(disp, win, w, h);
XMapWindow(disp, win);
if (!root)
{
XResizeWindow(disp, win, w, h);
XMapWindow(disp, win);
}
if (scale)
{
Window d;
int dd;
XGetGeometry(disp, win, &d, &dd, &dd, &w, &h, &dd, &dd);
}
XSync(disp, False);
}
if (scale)
{
Window d;
int dd;
XGetGeometry(disp, win, &d, &dd, &dd, &w, &h, &dd, &dd);
}
XSync(disp, False);
printf("rend\n");
gettimeofday(&timev,NULL);
sec1=(int)timev.tv_sec; /* and stores it so we can time outselves */
usec1=(int)timev.tv_usec; /* we will use this to vary speed of rot */
imlib_context_set_display(disp);
imlib_context_set_visual(vis);
imlib_context_set_colormap(cm);
imlib_context_set_drawable(win);
if (!blendtest)
{
imlib_context_set_display(disp);
imlib_context_set_visual(vis);
imlib_context_set_colormap(cm);
imlib_context_set_drawable(win);
}
imlib_context_set_anti_alias(aa);
imlib_context_set_dither(dith);
imlib_context_set_blend(blend);
@ -204,10 +213,10 @@ int main (int argc, char **argv)
imlib_context_set_image(im2);
w = imlib_image_get_width();
h = imlib_image_get_height();
imlib_context_set_image(im);
for (i = 0; i < 1024; i++)
imlib_context_set_image(im2);
for (i = 0; i < 256; i++)
{
imlib_blend_image_onto_image(im2, 0, 0, 0, w, h, 0, 0, w, h);
imlib_blend_image_onto_image(im, 0, 0, 0, w, h, 0, 0, w, h);
pixels += (w * h);
}
}