summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gst/smpte/gstsmpte.c24
-rw-r--r--gst/smpte/paint.c144
2 files changed, 84 insertions, 84 deletions
diff --git a/gst/smpte/gstsmpte.c b/gst/smpte/gstsmpte.c
index 47de304f..a123010f 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 51eecebd..07cffc4f 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;
-
- if (abs(shortLen)>abs(longLen)) {
- int swap=shortLen;
- shortLen=longLen;
- longLen=swap;
- yLonger=TRUE;
+ gint dx = abs (x1 - x0);
+ gint dy = abs (y1 - y0);
+ gint x_incr, y_incr;
+ gint i, dpr, dpru, P, indep;
+
+ 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) {
+ xv = x2;
+ yv = y1;
+ } else if (y1 == y0) {
+ xv = x1;
+ yv = y2;
+ }
+ else {
+ g_warning ("paint box clock: not supported");
+ return;
+ }
- if (x1 == x0) {
- angle_m = 2* acos (((x1-x0) * (x2-x0) + (y1-y0) * (y1-y0))/
+ 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);
- }
}