Sketch of possible optimisations; disabled pending testing and fixing

svn path=/trunk/netsurf/; revision=6652
This commit is contained in:
Adrian Lees 2009-02-27 01:14:04 +00:00
parent 66885831a7
commit 464b7edf0c
2 changed files with 61 additions and 6 deletions

View File

@ -41,15 +41,13 @@ fb_32bpp_get_xy_loc(int x, int y)
#if __BYTE_ORDER == __BIG_ENDIAN
static inline colour fb_32bpp_to_colour(uint32_t pixel)
{
return ((pixel & 0xFF00) >> 8) |
((pixel & 0xFF0000) >> 8) |
((pixel & 0xFF000000) >> 8);
return (pixel >> 8) & ~0xFF000000U;
}
/* convert a colour value to a 32bpp pixel value ready for screen output */
static inline uint32_t fb_colour_to_pixel(colour c)
{
return ((c & 0xff0000) << 8) | (c & 0xff00) << 8 | ((c & 0xff) << 8);
return (c << 8);
}
#else
static inline colour fb_32bpp_to_colour(uint32_t pixel)
@ -191,7 +189,31 @@ static bool fb_32bpp_fill(int x0, int y0, int x1, int y1, colour c)
pvid = fb_32bpp_get_xy_loc(x0, y0);
while (height-- > 0) {
for (w = width; w > 0; w--) *pvid++ = ent;
#if 1
for (w = width; w > 0; w--) *pvid++ = ent;
#else
uint32_t *evid = pvid + width;
while ((pvid += 16) <= evid) {
pvid[0] = ent;
pvid[1] = ent;
pvid[2] = ent;
pvid[3] = ent;
pvid[4] = ent;
pvid[5] = ent;
pvid[6] = ent;
pvid[7] = ent;
pvid[8] = ent;
pvid[9] = ent;
pvid[10] = ent;
pvid[11] = ent;
pvid[12] = ent;
pvid[13] = ent;
pvid[14] = ent;
pvid[15] = ent;
}
pvid -= 16;
while (pvid < evid) *pvid++ = ent;
#endif
pvid += llen;
}
@ -483,7 +505,7 @@ static bool fb_32bpp_bitmap(int x, int y, int width, int height,
{
uint32_t *pvideo;
colour *pixel = (colour *)bitmap->pixdata;
colour abpixel; /* alphablended pixel */
colour abpixel = 0; /* alphablended pixel */
int xloop, yloop;
int x0,y0,x1,y1;
int xoff, yoff; /* x and y offset into image */
@ -525,6 +547,7 @@ static bool fb_32bpp_bitmap(int x, int y, int width, int height,
pvideo = fb_32bpp_get_xy_loc(x0, y0);
for (yloop = yoff; yloop < height; yloop += bitmap->width) {
#if 1
for (xloop = 0; xloop < width; xloop++) {
abpixel = pixel[yloop + xloop + xoff];
if ((abpixel & 0xFF000000) != 0) {
@ -536,6 +559,25 @@ static bool fb_32bpp_bitmap(int x, int y, int width, int height,
*(pvideo + xloop) = fb_colour_to_pixel(abpixel);
}
}
#else
uint32_t *pvid = pvideo;
colour *pix = &pixel[yloop + xoff];
colour *epix = pix + width;
do {
colour *spix = pix;
while (pix < epix && !((abpixel = *pix) & 0xFF000000U)) pix++;
if (pix < epix) {
pvid += pix++ - spix;
do {
if ((abpixel & 0xFF000000) != 0xFF000000) {
abpixel = fb_plotters_ablend(abpixel,
fb_32bpp_to_colour(*pvid));
}
*pvid++ = fb_colour_to_pixel(abpixel);
} while (pix < epix && ((abpixel = *pix++) & 0xFF000000U));
}
} while (pix < epix);
#endif
pvideo += (framebuffer->linelen >> 2);
}

View File

@ -50,6 +50,7 @@ bool fb_plotters_bitmap_tile(int x, int y,
/* alpha blend two pixels together */
static inline colour fb_plotters_ablend(colour pixel, colour scrpixel)
{
#if 1
int opacity = (pixel >> 24) & 0xFF;
int r,g,b;
@ -63,6 +64,18 @@ static inline colour fb_plotters_ablend(colour pixel, colour scrpixel)
((((scrpixel & 0xFF0000) >> 16) * (0xFF - opacity)) >> 8);
return r | (g << 8) | (b << 16);
#else
int opacity = pixel >> 24;
int transp = 0x100 - opacity;
uint32_t rb, g;
rb = ((pixel & 0xFF00FF) * opacity +
(scrpixel & 0xFF00FF) * transp) >> 8;
g = ((pixel & 0x00FF00) * opacity +
(scrpixel & 0x00FF00) * transp) >> 8;
return rb | g;
#endif
}