diff --git a/common b/common index 2f0e1ecbfe..cd050468e0 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 2f0e1ecbfe7d27cf1b2215204958c95516db173d +Subproject commit cd050468e0d9e0d1b9134eb3081e2ab3228f0c01 diff --git a/gst/smpte/gstsmpte.c b/gst/smpte/gstsmpte.c index 47de304f53..a123010f4c 100644 --- a/gst/smpte/gstsmpte.c +++ b/gst/smpte/gstsmpte.c @@ -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; + } } } } diff --git a/gst/smpte/paint.c b/gst/smpte/paint.c index 51eecebd40..07cffc4f5d 100644 --- a/gst/smpte/paint.c +++ b/gst/smpte/paint.c @@ -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); - } }