mirror of https://github.com/GNOME/gimp.git
The bottleneck combine_inten_a_and_inten_a_pixels() function is a couple
Mon Jan 11 22:02:10 GMT 1999 Adam D. Moss <adam@gimp.org> * app/paint_funcs.c: The bottleneck combine_inten_a_and_inten_a_pixels() function is a couple of times faster when there is a layer mask, for the common case, due to working with whole word-aligned ints where feasible instead of a char at a time. The same optimization could be implemented in lots of other places, but I'm going to bed. Good night! * app/gimage_cmds.c: #include <cursorutil.h>
This commit is contained in:
parent
5e7d70556d
commit
d182f93904
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
||||||
|
Mon Jan 11 22:02:10 GMT 1999 Adam D. Moss <adam@gimp.org>
|
||||||
|
|
||||||
|
* app/paint_funcs.c:
|
||||||
|
The bottleneck combine_inten_a_and_inten_a_pixels()
|
||||||
|
function is a couple of times faster when there is a
|
||||||
|
layer mask, for the common case, due to working with whole
|
||||||
|
word-aligned ints where feasible instead of a char at a time.
|
||||||
|
The same optimization could be implemented in lots of other
|
||||||
|
places, but I'm going to bed. Good night!
|
||||||
|
|
||||||
|
* app/gimage_cmds.c: #include <cursorutil.h>
|
||||||
|
|
||||||
Mon Jan 11 21:35:44 MET 1999 Sven Neumann <sven@gimp.org>
|
Mon Jan 11 21:35:44 MET 1999 Sven Neumann <sven@gimp.org>
|
||||||
|
|
||||||
* configure.in: build the Makefile in the modules directory
|
* configure.in: build the Makefile in the modules directory
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "appenv.h"
|
#include "appenv.h"
|
||||||
|
#include "cursorutil.h"
|
||||||
#include "drawable.h"
|
#include "drawable.h"
|
||||||
#include "general.h"
|
#include "general.h"
|
||||||
#include "gdisplay.h"
|
#include "gdisplay.h"
|
||||||
|
|
|
@ -1964,10 +1964,18 @@ combine_inten_a_and_inten_a_pixels (const unsigned char *src1,
|
||||||
if (mask)
|
if (mask)
|
||||||
{
|
{
|
||||||
m = mask;
|
m = mask;
|
||||||
|
|
||||||
if (opacity == OPAQUE_OPACITY) /* HAS MASK, FULL OPACITY */
|
if (opacity == OPAQUE_OPACITY) /* HAS MASK, FULL OPACITY */
|
||||||
{
|
{
|
||||||
while (length --)
|
int* mask_ip;
|
||||||
|
int i,j;
|
||||||
|
|
||||||
|
/* HEAD */
|
||||||
|
i = ((int)m) & (sizeof(int)-1);
|
||||||
|
length -= i;
|
||||||
|
while (i--)
|
||||||
{
|
{
|
||||||
|
/* GUTS */
|
||||||
src2_alpha = INT_MULT(src2[alpha], *m, tmp);
|
src2_alpha = INT_MULT(src2[alpha], *m, tmp);
|
||||||
new_alpha = src1[alpha] +
|
new_alpha = src1[alpha] +
|
||||||
INT_MULT((255 - src1[alpha]), src2_alpha, tmp);
|
INT_MULT((255 - src1[alpha]), src2_alpha, tmp);
|
||||||
|
@ -1987,13 +1995,98 @@ combine_inten_a_and_inten_a_pixels (const unsigned char *src1,
|
||||||
m++;
|
m++;
|
||||||
src1 += bytes;
|
src1 += bytes;
|
||||||
src2 += bytes;
|
src2 += bytes;
|
||||||
dest += bytes;
|
dest += bytes;
|
||||||
|
/* GUTS END */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* BODY */
|
||||||
|
mask_ip = (int*)m;
|
||||||
|
i = length / sizeof(int);
|
||||||
|
length %= sizeof(int);
|
||||||
|
while (i--)
|
||||||
|
{
|
||||||
|
if (*mask_ip)
|
||||||
|
{
|
||||||
|
m = (const unsigned char*)mask_ip;
|
||||||
|
j = sizeof(int);
|
||||||
|
while (j--)
|
||||||
|
{
|
||||||
|
/* GUTS */
|
||||||
|
src2_alpha = INT_MULT(src2[alpha], *m, tmp);
|
||||||
|
new_alpha = src1[alpha] +
|
||||||
|
INT_MULT((255 - src1[alpha]), src2_alpha, tmp);
|
||||||
|
|
||||||
|
alphify (src2_alpha, new_alpha);
|
||||||
|
|
||||||
|
if (mode_affect)
|
||||||
|
{
|
||||||
|
dest[alpha] = (affect[alpha]) ? new_alpha : src1[alpha];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dest[alpha] = (src1[alpha]) ? src1[alpha] :
|
||||||
|
(affect[alpha] ? new_alpha : src1[alpha]);
|
||||||
|
}
|
||||||
|
|
||||||
|
m++;
|
||||||
|
src1 += bytes;
|
||||||
|
src2 += bytes;
|
||||||
|
dest += bytes;
|
||||||
|
/* GUTS END */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
src1 += bytes * sizeof(int);
|
||||||
|
src2 += bytes * sizeof(int);
|
||||||
|
j = sizeof(int);
|
||||||
|
while (j--)
|
||||||
|
{
|
||||||
|
dest[alpha] = 255;
|
||||||
|
dest += bytes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mask_ip++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TAIL */
|
||||||
|
while (length--)
|
||||||
|
{
|
||||||
|
/* GUTS */
|
||||||
|
src2_alpha = INT_MULT(src2[alpha], *m, tmp);
|
||||||
|
new_alpha = src1[alpha] +
|
||||||
|
INT_MULT((255 - src1[alpha]), src2_alpha, tmp);
|
||||||
|
|
||||||
|
alphify (src2_alpha, new_alpha);
|
||||||
|
|
||||||
|
if (mode_affect)
|
||||||
|
{
|
||||||
|
dest[alpha] = (affect[alpha]) ? new_alpha : src1[alpha];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dest[alpha] = (src1[alpha]) ? src1[alpha] :
|
||||||
|
(affect[alpha] ? new_alpha : src1[alpha]);
|
||||||
|
}
|
||||||
|
|
||||||
|
m++;
|
||||||
|
src1 += bytes;
|
||||||
|
src2 += bytes;
|
||||||
|
dest += bytes;
|
||||||
|
/* GUTS END */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else /* HAS MASK, SEMI-OPACITY */
|
else /* HAS MASK, SEMI-OPACITY */
|
||||||
{
|
{
|
||||||
while (length --)
|
int* mask_ip;
|
||||||
|
int i,j;
|
||||||
|
|
||||||
|
/* HEAD */
|
||||||
|
i = ((int)m) & (sizeof(int)-1);
|
||||||
|
length -= i;
|
||||||
|
while (i--)
|
||||||
{
|
{
|
||||||
|
/* GUTS */
|
||||||
src2_alpha = INT_MULT3(src2[alpha], *m, opacity, tmp);
|
src2_alpha = INT_MULT3(src2[alpha], *m, opacity, tmp);
|
||||||
new_alpha = src1[alpha] +
|
new_alpha = src1[alpha] +
|
||||||
INT_MULT((255 - src1[alpha]), src2_alpha, tmp);
|
INT_MULT((255 - src1[alpha]), src2_alpha, tmp);
|
||||||
|
@ -2009,11 +2102,89 @@ combine_inten_a_and_inten_a_pixels (const unsigned char *src1,
|
||||||
dest[alpha] = (src1[alpha]) ? src1[alpha] :
|
dest[alpha] = (src1[alpha]) ? src1[alpha] :
|
||||||
(affect[alpha] ? new_alpha : src1[alpha]);
|
(affect[alpha] ? new_alpha : src1[alpha]);
|
||||||
}
|
}
|
||||||
|
|
||||||
m++;
|
m++;
|
||||||
src1 += bytes;
|
src1 += bytes;
|
||||||
src2 += bytes;
|
src2 += bytes;
|
||||||
dest += bytes;
|
dest += bytes;
|
||||||
|
/* GUTS END */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* BODY */
|
||||||
|
mask_ip = (int*)m;
|
||||||
|
i = length / sizeof(int);
|
||||||
|
length %= sizeof(int);
|
||||||
|
while (i--)
|
||||||
|
{
|
||||||
|
if (*mask_ip)
|
||||||
|
{
|
||||||
|
m = (const unsigned char*)mask_ip;
|
||||||
|
j = sizeof(int);
|
||||||
|
while (j--)
|
||||||
|
{
|
||||||
|
/* GUTS */
|
||||||
|
src2_alpha = INT_MULT3(src2[alpha], *m, opacity, tmp);
|
||||||
|
new_alpha = src1[alpha] +
|
||||||
|
INT_MULT((255 - src1[alpha]), src2_alpha, tmp);
|
||||||
|
|
||||||
|
alphify (src2_alpha, new_alpha);
|
||||||
|
|
||||||
|
if (mode_affect)
|
||||||
|
{
|
||||||
|
dest[alpha] = (affect[alpha]) ? new_alpha : src1[alpha];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dest[alpha] = (src1[alpha]) ? src1[alpha] :
|
||||||
|
(affect[alpha] ? new_alpha : src1[alpha]);
|
||||||
|
}
|
||||||
|
|
||||||
|
m++;
|
||||||
|
src1 += bytes;
|
||||||
|
src2 += bytes;
|
||||||
|
dest += bytes;
|
||||||
|
/* GUTS END */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
src1 += bytes * sizeof(int);
|
||||||
|
src2 += bytes * sizeof(int);
|
||||||
|
j = sizeof(int);
|
||||||
|
while (j--)
|
||||||
|
{
|
||||||
|
dest[alpha] = 255;
|
||||||
|
dest += bytes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mask_ip++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TAIL */
|
||||||
|
while (length--)
|
||||||
|
{
|
||||||
|
/* GUTS */
|
||||||
|
src2_alpha = INT_MULT3(src2[alpha], *m, opacity, tmp);
|
||||||
|
new_alpha = src1[alpha] +
|
||||||
|
INT_MULT((255 - src1[alpha]), src2_alpha, tmp);
|
||||||
|
|
||||||
|
alphify (src2_alpha, new_alpha);
|
||||||
|
|
||||||
|
if (mode_affect)
|
||||||
|
{
|
||||||
|
dest[alpha] = (affect[alpha]) ? new_alpha : src1[alpha];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dest[alpha] = (src1[alpha]) ? src1[alpha] :
|
||||||
|
(affect[alpha] ? new_alpha : src1[alpha]);
|
||||||
|
}
|
||||||
|
|
||||||
|
m++;
|
||||||
|
src1 += bytes;
|
||||||
|
src2 += bytes;
|
||||||
|
dest += bytes;
|
||||||
|
/* GUTS END */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1964,10 +1964,18 @@ combine_inten_a_and_inten_a_pixels (const unsigned char *src1,
|
||||||
if (mask)
|
if (mask)
|
||||||
{
|
{
|
||||||
m = mask;
|
m = mask;
|
||||||
|
|
||||||
if (opacity == OPAQUE_OPACITY) /* HAS MASK, FULL OPACITY */
|
if (opacity == OPAQUE_OPACITY) /* HAS MASK, FULL OPACITY */
|
||||||
{
|
{
|
||||||
while (length --)
|
int* mask_ip;
|
||||||
|
int i,j;
|
||||||
|
|
||||||
|
/* HEAD */
|
||||||
|
i = ((int)m) & (sizeof(int)-1);
|
||||||
|
length -= i;
|
||||||
|
while (i--)
|
||||||
{
|
{
|
||||||
|
/* GUTS */
|
||||||
src2_alpha = INT_MULT(src2[alpha], *m, tmp);
|
src2_alpha = INT_MULT(src2[alpha], *m, tmp);
|
||||||
new_alpha = src1[alpha] +
|
new_alpha = src1[alpha] +
|
||||||
INT_MULT((255 - src1[alpha]), src2_alpha, tmp);
|
INT_MULT((255 - src1[alpha]), src2_alpha, tmp);
|
||||||
|
@ -1987,13 +1995,98 @@ combine_inten_a_and_inten_a_pixels (const unsigned char *src1,
|
||||||
m++;
|
m++;
|
||||||
src1 += bytes;
|
src1 += bytes;
|
||||||
src2 += bytes;
|
src2 += bytes;
|
||||||
dest += bytes;
|
dest += bytes;
|
||||||
|
/* GUTS END */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* BODY */
|
||||||
|
mask_ip = (int*)m;
|
||||||
|
i = length / sizeof(int);
|
||||||
|
length %= sizeof(int);
|
||||||
|
while (i--)
|
||||||
|
{
|
||||||
|
if (*mask_ip)
|
||||||
|
{
|
||||||
|
m = (const unsigned char*)mask_ip;
|
||||||
|
j = sizeof(int);
|
||||||
|
while (j--)
|
||||||
|
{
|
||||||
|
/* GUTS */
|
||||||
|
src2_alpha = INT_MULT(src2[alpha], *m, tmp);
|
||||||
|
new_alpha = src1[alpha] +
|
||||||
|
INT_MULT((255 - src1[alpha]), src2_alpha, tmp);
|
||||||
|
|
||||||
|
alphify (src2_alpha, new_alpha);
|
||||||
|
|
||||||
|
if (mode_affect)
|
||||||
|
{
|
||||||
|
dest[alpha] = (affect[alpha]) ? new_alpha : src1[alpha];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dest[alpha] = (src1[alpha]) ? src1[alpha] :
|
||||||
|
(affect[alpha] ? new_alpha : src1[alpha]);
|
||||||
|
}
|
||||||
|
|
||||||
|
m++;
|
||||||
|
src1 += bytes;
|
||||||
|
src2 += bytes;
|
||||||
|
dest += bytes;
|
||||||
|
/* GUTS END */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
src1 += bytes * sizeof(int);
|
||||||
|
src2 += bytes * sizeof(int);
|
||||||
|
j = sizeof(int);
|
||||||
|
while (j--)
|
||||||
|
{
|
||||||
|
dest[alpha] = 255;
|
||||||
|
dest += bytes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mask_ip++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TAIL */
|
||||||
|
while (length--)
|
||||||
|
{
|
||||||
|
/* GUTS */
|
||||||
|
src2_alpha = INT_MULT(src2[alpha], *m, tmp);
|
||||||
|
new_alpha = src1[alpha] +
|
||||||
|
INT_MULT((255 - src1[alpha]), src2_alpha, tmp);
|
||||||
|
|
||||||
|
alphify (src2_alpha, new_alpha);
|
||||||
|
|
||||||
|
if (mode_affect)
|
||||||
|
{
|
||||||
|
dest[alpha] = (affect[alpha]) ? new_alpha : src1[alpha];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dest[alpha] = (src1[alpha]) ? src1[alpha] :
|
||||||
|
(affect[alpha] ? new_alpha : src1[alpha]);
|
||||||
|
}
|
||||||
|
|
||||||
|
m++;
|
||||||
|
src1 += bytes;
|
||||||
|
src2 += bytes;
|
||||||
|
dest += bytes;
|
||||||
|
/* GUTS END */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else /* HAS MASK, SEMI-OPACITY */
|
else /* HAS MASK, SEMI-OPACITY */
|
||||||
{
|
{
|
||||||
while (length --)
|
int* mask_ip;
|
||||||
|
int i,j;
|
||||||
|
|
||||||
|
/* HEAD */
|
||||||
|
i = ((int)m) & (sizeof(int)-1);
|
||||||
|
length -= i;
|
||||||
|
while (i--)
|
||||||
{
|
{
|
||||||
|
/* GUTS */
|
||||||
src2_alpha = INT_MULT3(src2[alpha], *m, opacity, tmp);
|
src2_alpha = INT_MULT3(src2[alpha], *m, opacity, tmp);
|
||||||
new_alpha = src1[alpha] +
|
new_alpha = src1[alpha] +
|
||||||
INT_MULT((255 - src1[alpha]), src2_alpha, tmp);
|
INT_MULT((255 - src1[alpha]), src2_alpha, tmp);
|
||||||
|
@ -2009,11 +2102,89 @@ combine_inten_a_and_inten_a_pixels (const unsigned char *src1,
|
||||||
dest[alpha] = (src1[alpha]) ? src1[alpha] :
|
dest[alpha] = (src1[alpha]) ? src1[alpha] :
|
||||||
(affect[alpha] ? new_alpha : src1[alpha]);
|
(affect[alpha] ? new_alpha : src1[alpha]);
|
||||||
}
|
}
|
||||||
|
|
||||||
m++;
|
m++;
|
||||||
src1 += bytes;
|
src1 += bytes;
|
||||||
src2 += bytes;
|
src2 += bytes;
|
||||||
dest += bytes;
|
dest += bytes;
|
||||||
|
/* GUTS END */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* BODY */
|
||||||
|
mask_ip = (int*)m;
|
||||||
|
i = length / sizeof(int);
|
||||||
|
length %= sizeof(int);
|
||||||
|
while (i--)
|
||||||
|
{
|
||||||
|
if (*mask_ip)
|
||||||
|
{
|
||||||
|
m = (const unsigned char*)mask_ip;
|
||||||
|
j = sizeof(int);
|
||||||
|
while (j--)
|
||||||
|
{
|
||||||
|
/* GUTS */
|
||||||
|
src2_alpha = INT_MULT3(src2[alpha], *m, opacity, tmp);
|
||||||
|
new_alpha = src1[alpha] +
|
||||||
|
INT_MULT((255 - src1[alpha]), src2_alpha, tmp);
|
||||||
|
|
||||||
|
alphify (src2_alpha, new_alpha);
|
||||||
|
|
||||||
|
if (mode_affect)
|
||||||
|
{
|
||||||
|
dest[alpha] = (affect[alpha]) ? new_alpha : src1[alpha];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dest[alpha] = (src1[alpha]) ? src1[alpha] :
|
||||||
|
(affect[alpha] ? new_alpha : src1[alpha]);
|
||||||
|
}
|
||||||
|
|
||||||
|
m++;
|
||||||
|
src1 += bytes;
|
||||||
|
src2 += bytes;
|
||||||
|
dest += bytes;
|
||||||
|
/* GUTS END */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
src1 += bytes * sizeof(int);
|
||||||
|
src2 += bytes * sizeof(int);
|
||||||
|
j = sizeof(int);
|
||||||
|
while (j--)
|
||||||
|
{
|
||||||
|
dest[alpha] = 255;
|
||||||
|
dest += bytes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mask_ip++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TAIL */
|
||||||
|
while (length--)
|
||||||
|
{
|
||||||
|
/* GUTS */
|
||||||
|
src2_alpha = INT_MULT3(src2[alpha], *m, opacity, tmp);
|
||||||
|
new_alpha = src1[alpha] +
|
||||||
|
INT_MULT((255 - src1[alpha]), src2_alpha, tmp);
|
||||||
|
|
||||||
|
alphify (src2_alpha, new_alpha);
|
||||||
|
|
||||||
|
if (mode_affect)
|
||||||
|
{
|
||||||
|
dest[alpha] = (affect[alpha]) ? new_alpha : src1[alpha];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dest[alpha] = (src1[alpha]) ? src1[alpha] :
|
||||||
|
(affect[alpha] ? new_alpha : src1[alpha]);
|
||||||
|
}
|
||||||
|
|
||||||
|
m++;
|
||||||
|
src1 += bytes;
|
||||||
|
src2 += bytes;
|
||||||
|
dest += bytes;
|
||||||
|
/* GUTS END */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue