From e5c5f6be80792dbfc5db2906cc1564fb08d6aa41 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Sun, 13 Oct 2002 18:46:10 +0000 Subject: - reimplemented using organic masks, rendered with gouraud shaded triangles Original commit message from CVS: - reimplemented using organic masks, rendered with gouraud shaded triangles - implemented more masks - implemented adjustable border --- gst/smpte/paint.c | 200 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 182 insertions(+), 18 deletions(-) (limited to 'gst/smpte/paint.c') diff --git a/gst/smpte/paint.c b/gst/smpte/paint.c index 0fb96d77..3ccfc23f 100644 --- a/gst/smpte/paint.c +++ b/gst/smpte/paint.c @@ -20,32 +20,196 @@ #include "paint.h" void -gst_smpte_paint_rect (guint8 *dest, gint stride, gint x, gint y, gint w, gint h, guint8 color) -{ - guint8 *d = dest + stride * y + x; - gint i; - - for (i = 0; i < h; i++) { - memset (d, color, w); - d += stride; +gst_smpte_paint_vbox (guint32 *dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1) +{ + gint i, j; + gint width, height; + + width = x1 - x0; + height = y1 - y0; + + g_assert (width > 0); + g_assert (height > 0); + + dest = dest + y0 * stride + x0; + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + dest[j] = (c1 * j + c0 * (width - j)) / width; + } + dest += stride; + } +} + +void +gst_smpte_paint_hbox (guint32 *dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1) +{ + gint i, j; + gint width, height; + + width = x1 - x0; + height = y1 - y0; + + g_assert (width > 0); + g_assert (height > 0); + + g_print ("vbox: %d %d %d %d %d %d\n", x0, y0, c0, x1, y1, c1); + + dest = dest + y0 * stride + x0; + + for (i = 0; i < height; i++) { + guint32 value = (c1 * i + c0 * (height - i)) / height; + for (j = 0; j < width; j++) { + *dest++ = value; + } } } void -gst_smpte_paint_rect_s (guint8 *dest, gint stride, gint x, gint y, gint w, gint h, guint8 color) -{ - guint8 *d = dest + stride * y + x; +gst_smpte_paint_rect16 (guint16 * dest, gint depth, gint w, gint h) +{ gint i, j; - gint border = 100; for (i = 0; i < h; i++) { - if (w - border > 0) { - memset (d, color, w - border); + for (j = 0; j < w; j++) { + *dest++ = (guint16) ((double) (1 << depth) * j / w); } + } +} + +#define STEP_3D_LINE(dxabs,dyabs,dzabs,sdx,sdy,sdz,xr,yr,zr,px,py,pz) \ +G_STMT_START { \ + if (dxabs >= dyabs && dxabs >= dzabs) { \ + yr += dyabs; \ + zr += dzabs; \ + if (yr >= dxabs) { \ + py += sdy; \ + yr -= dxabs; \ + } \ + if (zr >= dzabs) { \ + pz += sdz; \ + zr -= dxabs; \ + } \ + px += sdx; \ + } else if (dyabs >= dxabs && dyabs >= dzabs) { \ + xr += dxabs; \ + zr += dzabs; \ + if (xr >= dyabs) { \ + px += sdx; \ + xr -= dyabs; \ + } \ + if (zr >= dzabs) { \ + pz += sdz; \ + zr -= dyabs; \ + } \ + py += sdy; \ + } else { \ + yr += dyabs; \ + xr += dxabs; \ + if (yr >= dyabs) { \ + py += sdy; \ + yr -= dzabs; \ + } \ + if (xr >= dyabs) { \ + px += sdx; \ + xr -= dzabs; \ + } \ + pz += sdz; \ + } \ +} G_STMT_END + +#define SWAP(a,b) \ +G_STMT_START { \ + typeof (a) tmp; \ + tmp = (a); \ + (a) = (b); \ + (b) = (tmp); \ +} G_STMT_END + +#define SIGN(a) ((a) < 0 ? -1 : 1) + +#define PREPARE_3D_LINE(x0,y0,z0,x1,y1,z1,dxabs,dyabs,dzabs,sdx,sdy,sdz,xr,yr,zr,px,py,pz)\ +G_STMT_START { \ + typeof (x0) dx, dy, dz; \ + dx = x1 - x0; \ + dy = y1 - y0; \ + dz = z1 - z0; \ + dxabs = abs (dx); \ + dyabs = abs (dy); \ + dzabs = abs (dz); \ + sdx = SIGN (dx); \ + sdy = SIGN (dy); \ + sdz = SIGN (dz); \ + xr = dxabs >> 1; \ + yr = dyabs >> 1; \ + zr = dzabs >> 1; \ + px = x0; \ + py = y0; \ + pz = z0; \ +} G_STMT_END + +void +gst_smpte_paint_triangle_linear (guint32 *dest, gint stride, + gint x0, gint y0, gint c0, + gint x1, gint y1, gint c1, gint x2, gint y2, gint c2) +{ + gint sdxl, sdyl, sdcl, dxlabs, dylabs, dclabs, xrl, yrl, crl, pxl, pyl, pcl; + gint sdxr, sdyr, sdcr, dxrabs, dyrabs, dcrabs, xrr, yrr, crr, pxr, pyr, pcr; + gint i, j, k, seg_start, seg_end; + + if (y0 > y1) { SWAP (x0, x1); SWAP (y0, y1); SWAP (c0, c1); } + if (y0 > y2) { SWAP (x0, x2); SWAP (y0, y2); SWAP (c0, c2); } + if (y1 > y2) { SWAP (x1, x2); SWAP (y1, y2); SWAP (c1, c2); } + + PREPARE_3D_LINE (x0,y0,c0,x2,y2,c2, + dxlabs,dylabs,dclabs, + sdxl, sdyl,sdcl, + xrl,yrl,crl, + pxl,pyl,pcl); + + PREPARE_3D_LINE (x0,y0,c0,x1,y1,c1, + dxrabs,dyrabs,dcrabs, + sdxr, sdyr,sdcr, + xrr,yrr,crr, + pxr,pyr,pcr); + + dest = dest + stride * y0; + seg_start = y0; + seg_end = y1; + + /* do two passes */ + for (k = 0; k < 2; k++) { + for (i = seg_start; i < seg_end; i++) { + gint s = pxl, e = pxr, sc = pcl, ec = pcr; + gint sign = SIGN (e - s); + + e += sign; + + for (j = s; j != e; j+=sign) { + dest[j] = (ec * (j - s) + sc * (e - j)) / (e - s); + } + while (pyr == i) { + STEP_3D_LINE (dxrabs, dyrabs, dcrabs, sdxr, sdyr, sdcr, + xrr, yrr, crr, pxr, pyr, pcr); + } + while (pyl == i) { + STEP_3D_LINE (dxlabs, dylabs, dclabs, sdxl, sdyl, sdcl, + xrl, yrl, crl, pxl, pyl, pcl); + } + dest += stride; + } + + PREPARE_3D_LINE (x1,y1,c1,x2,y2,c2, + dxrabs,dyrabs,dcrabs, + sdxr, sdyr,sdcr, + xrr,yrr,crr, + pxr,pyr,pcr); - for (j = 0; j < border - w; j++) { - *(d+w+j) = (color*(border-j)/border); - } - d += stride; + seg_start = y1; + seg_end = y2; } } -- cgit v1.2.1