Some cleanups, fix for the blending code

Original commit message from CVS:
Some cleanups, fix for the blending code
This commit is contained in:
Wim Taymans 2002-10-17 21:36:20 +00:00
parent ce94093ed4
commit 9b7b00ac24
2 changed files with 83 additions and 83 deletions

View file

@ -275,7 +275,7 @@ gst_smpte_blend_i420 (guint8 *in1, guint8 *in2, guint8 *out, GstMask *mask,
{
guint32 *maskp;
gint value;
gint i;
gint i, j;
gint min, max;
guint8 *in1u, *in1v, *in2u, *in2v, *outu, *outv;
gint lumsize = width * height;
@ -286,20 +286,22 @@ gst_smpte_blend_i420 (guint8 *in1, guint8 *in2, guint8 *out, GstMask *mask,
min = pos - border;
max = pos;
in1u = in1 + lumsize; in1v = in1 + chromsize;
in2u = in2 + lumsize; in2v = in2 + chromsize;
outu = out + lumsize; outv = out + chromsize;
in1u = in1 + lumsize; in1v = in1u + chromsize;
in2u = in2 + lumsize; in2v = in2u + chromsize;
outu = out + lumsize; outv = outu + chromsize;
maskp = mask->data;
for (i = lumsize; i; i--) {
value = *maskp++;
value = ((CLAMP (value, min, max) - min) << 8) / border;
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
value = *maskp++;
value = ((CLAMP (value, min, max) - min) << 8) / border;
*out++ = ((*in1++ * value) + (*in2++ * (255 - value))) >> 8;
if (i % 4) {
*outu++ = ((*in1u++ * value) + (*in2u++ * (255 - value))) >> 8;
*outv++ = ((*in1v++ * value) + (*in2v++ * (255 - value))) >> 8;
*out++ = ((*in1++ * value) + (*in2++ * (256 - value))) >> 8;
if (!(i & 1) && !(j & 1)) {
*outu++ = ((*in1u++ * value) + (*in2u++ * (256 - value))) >> 8;
*outv++ = ((*in1v++ * value) + (*in2v++ * (256 - value))) >> 8;
}
}
}
}

View file

@ -204,44 +204,46 @@ gst_smpte_paint_triangle_linear (guint32 *dest, gint stride,
}
}
void
draw_line (guint32* dest, gint stride, int x, int y, int x2, int y2, int col)
static void
draw_bresenham_line (guint32 *dest, gint stride,
gint x0, gint y0,
gint x1, gint y1,
guint32 col)
{
gboolean yLonger=FALSE;
int incrementVal, endVal;
gdouble decInc;
int shortLen=y2-y;
int longLen=x2-x;
gdouble j=0.0;
int i;
gint dx = abs (x1 - x0);
gint dy = abs (y1 - y0);
gint x_incr, y_incr;
gint i, dpr, dpru, P, indep;
if (abs(shortLen)>abs(longLen)) {
int swap=shortLen;
shortLen=longLen;
longLen=swap;
yLonger=TRUE;
dest = dest + y0 * stride + x0;
x_incr = SIGN (x1 - x0);
y_incr = SIGN (y1 - y0) * stride;
if (dx >= dy) {
dpr = dy << 1;
i = dx;
indep = x_incr;
}
else {
dpr = dx << 1;
i = dy;
indep = y_incr;
}
endVal=longLen;
if (longLen<0) {
incrementVal=-1;
longLen=-longLen;
}
else incrementVal=1;
if (longLen==0) decInc=(gdouble)shortLen;
else decInc = ((gdouble)shortLen/(gdouble)longLen);
if (yLonger) {
for (i=0;i!=endVal;i+=incrementVal) {
*(dest+(x+(int)j) + (y+i)*stride) = col;
j+=decInc;
}
} else {
for (i=0;i!=endVal;i+=incrementVal) {
*(dest+(x+i) + (y+(int)j)*stride) = col;
j+=decInc;
dpru = dpr - (i << 1);
P = dpr - i;
for (; i >= 0; i--) {
*dest = col;
if (P > 0) {
dest += x_incr;
dest += y_incr;
P += dpru;
} else {
dest += indep;
P += dpr;
}
}
}
@ -255,44 +257,41 @@ gst_smpte_paint_triangle_clock (guint32 *dest, gint stride,
gint i;
gint sign;
gfloat angle, angle_s, angle_e;
gfloat len1;
angle_s = 0.0;
angle_e = acos (((x1-x0) * (x2-x0) + (y1-y0) * (y2-y0))/
(sqrt ((x1-x0) * (x1-x0) + (y1-y0) * (y1-y0)) *
sqrt ((x2-x0) * (x2-x0) + (y2-y0) * (y2-y0))));
if (x1 == x2) {
gfloat len1 = sqrt ((x1-x0) * (x1-x0) + (y1-y0) * (y1-y0));
len1 = sqrt ((x1-x0) * (x1-x0) + (y1-y0) * (y1-y0));
if (x1 == x2) {
sign = SIGN (y2 - y1);
for (i=y1; i != y2+sign; i+=sign) {
gfloat len2 = sqrt ((x1-x0) * (x1-x0) + (i-y0) * (i-y0));
if (y1==i)
for (i = y1; i != (y2 + sign); i += sign) {
if (y1 == i)
angle = 0;
else
angle = acos (((x1-x0) * (x2-x0) + (y1-y0) * (i-y0))/ (len1 * len2)) / angle_e;
angle = acos (((x1-x0) * (x2-x0) + (y1-y0) * (i-y0)) /
(len1 * sqrt ((x1-x0) * (x1-x0) + (i-y0) * (i-y0)))) / angle_e;
draw_line (dest, stride,
draw_bresenham_line (dest, stride,
x0, y0, x1, i,
(c2 * angle + c1 * (1.0-angle)));
}
}
else if (y1 == y2) {
gfloat len1 = sqrt ((x1-x0) * (x1-x0) + (y1-y0) * (y1-y0));
sign = SIGN (x2 - x1);
for (i=x1; i != x2+sign; i+=sign) {
gfloat len2 = sqrt ((i-x0) * (i-x0) + (y2-y0) * (y2-y0));
if (x1==i)
for (i = x1; i != (x2 + sign); i += sign) {
if (x1 == i)
angle = 0;
else
angle = acos (((x1-x0) * (i-x0) + (y1-y0) * (y2-y0)) / (len1 * len2)) / angle_e;
angle = acos (((x1-x0) * (i-x0) + (y1-y0) * (y2-y0)) /
(len1 * sqrt ((i-x0) * (i-x0) + (y2-y0) * (y2-y0)))) / angle_e;
draw_line (dest, stride,
draw_bresenham_line (dest, stride,
x0, y0, i, y1,
(c2 * angle + c1 * (1.0-angle)));
}
@ -305,35 +304,34 @@ gst_smpte_paint_box_clock (guint32 *dest, gint stride,
gint x1, gint y1, gint c1,
gint x2, gint y2, gint c2)
{
gfloat angle_m;
gfloat angle_m, col_m;
gint xv, yv;
if (x1 == x0) {
angle_m = 2* acos (((x1-x0) * (x2-x0) + (y1-y0) * (y1-y0))/
if (x1 == x0) {
xv = x2;
yv = y1;
} else if (y1 == y0) {
xv = x1;
yv = y2;
}
else {
g_warning ("paint box clock: not supported");
return;
}
angle_m = 2 * acos (((x1-x0) * (xv-x0) + (y1-y0) * (yv-y0))/
(sqrt ((x1-x0) * (x1-x0) + (y1-y0) * (y1-y0)) *
sqrt ((x2-x0) * (x2-x0) + (y1-y0) * (y1-y0)))) / M_PI;
sqrt ((xv-x0) * (xv-x0) + (yv-y0) * (yv-y0)))) / M_PI;
gst_smpte_paint_triangle_clock (dest, stride,
x0, y0, c0,
x1, y1, c1,
x2, y1, (c2 * angle_m + c1 * (1.0-angle_m)));
gst_smpte_paint_triangle_clock (dest, stride,
x0, y0, c0,
x2, y1, (c2 * angle_m + c1 * (1.0-angle_m)),
x2, y2, c2);
}
else if (y1 == y0) {
angle_m = 2* acos (((x1-x0) * (x1-x0) + (y1-y0) * (y2-y0))/
(sqrt ((x1-x0) * (x1-x0) + (y1-y0) * (y1-y0)) *
sqrt ((x1-x0) * (x1-x0) + (y2-y0) * (y2-y0)))) / M_PI;
col_m = c2 * angle_m + c1 * (1.0-angle_m);
gst_smpte_paint_triangle_clock (dest, stride,
gst_smpte_paint_triangle_clock (dest, stride,
x0, y0, c0,
x1, y1, c1,
x1, y2, (c2 * angle_m + c1 * (1.0-angle_m)));
gst_smpte_paint_triangle_clock (dest, stride,
xv, yv, col_m);
gst_smpte_paint_triangle_clock (dest, stride,
x0, y0, c0,
x1, y2, (c2 * angle_m + c1 * (1.0-angle_m)),
xv, yv, col_m,
x2, y2, c2);
}
}