[Commit] twin .cvsignore, NONE, 1.1 ChangeLog, 1.1.1.1, 1.2 Makefile.am, 1.1.1.1, 1.2 architecture, 1.1.1.1, 1.2 twin.h, 1.1.1.1, 1.2 twin_draw.c, 1.1.1.1, 1.2 twin_path.c, NONE, 1.1 twin_poly.c, NONE, 1.1 twin_screen.c, 1.1.1.1, 1.2 twin_spline.c, NONE, 1.1 twinint.h, 1.1.1.1, 1.2 xtwin.c, 1.1.1.1, 1.2

Keith Packard commit at keithp.com
Mon Sep 20 20:55:37 PDT 2004


Committed by: keithp

Update of /local/src/CVS/twin
In directory evo:/home/keithp/src/twin

Modified Files:
	ChangeLog Makefile.am architecture twin.h twin_draw.c 
	twin_screen.c twinint.h xtwin.c 
Added Files:
	.cvsignore twin_path.c twin_poly.c twin_spline.c 
Log Message:
2004-09-20  Keith Packard  <keithp at keithp.com>

	* .cvsignore:
	Add .cvsignore file
	
	* architecture:
	Mention path primitives
	* Makefile.am:
	* twin.h:
	* twinint.h:
	Add paths
	
	* twin_draw.c: (twin_composite):
	Eliminate some unused variables.
	
	* twin_path.c: (twin_path_move), (twin_path_draw),
	(twin_path_close), (twin_path_fill), (twin_path_empty),
	(twin_path_create), (twin_path_destroy):
	Simple path construction
	
	* twin_poly.c: (_edge_compare_y), (_edge_step_by), (_dump_edge),
	(_twin_edge_build), (_span_fill), (_twin_edge_fill),
	(twin_polygon):
	Anti-aliased polygon fill code
	
	* twin_screen.c:
	Change twin_bool to twin_bool_t
	
	* twin_spline.c: (_lerp_half), (_de_casteljau),
	(_distance_squared_to_point), (_distance_squared_to_segment),
	(_twin_spline_error_squared), (_twin_spline_decompose),
	(twin_path_curve):
	Append cubic Bézier splines to paths

	* xtwin.c: (main):
	Test paths


--- NEW FILE: .cvsignore ---
.deps
.libs
Makefile
Makefile.in
aclocal.m4
autom4te.cache
config.guess
config.h
config.h.in
config.log
config.status
config.sub
configure
depcomp
install-sh
libtool
ltmain.sh
missing
mkinstalldirs
stamp-h1
twin.pc
xtwin

Index: ChangeLog
===================================================================
RCS file: /local/src/CVS/twin/ChangeLog,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- ChangeLog	15 Sep 2004 20:43:17 -0000	1.1.1.1
+++ ChangeLog	21 Sep 2004 03:55:30 -0000	1.2
@@ -0,0 +1,36 @@
+2004-09-20  Keith Packard  <keithp at keithp.com>
+
+	* .cvsignore:
+	Add .cvsignore file
+	
+	* architecture:
+	Mention path primitives
+	* Makefile.am:
+	* twin.h:
+	* twinint.h:
+	Add paths
+	
+	* twin_draw.c: (twin_composite):
+	Eliminate some unused variables.
+	
+	* twin_path.c: (twin_path_move), (twin_path_draw),
+	(twin_path_close), (twin_path_fill), (twin_path_empty),
+	(twin_path_create), (twin_path_destroy):
+	Simple path construction
+	
+	* twin_poly.c: (_edge_compare_y), (_edge_step_by), (_dump_edge),
+	(_twin_edge_build), (_span_fill), (_twin_edge_fill),
+	(twin_polygon):
+	Anti-aliased polygon fill code
+	
+	* twin_screen.c:
+	Change twin_bool to twin_bool_t
+	
+	* twin_spline.c: (_lerp_half), (_de_casteljau),
+	(_distance_squared_to_point), (_distance_squared_to_segment),
+	(_twin_spline_error_squared), (_twin_spline_decompose),
+	(twin_path_curve):
+	Append cubic Bézier splines to paths
+
+	* xtwin.c: (main):
+	Test paths

Index: Makefile.am
===================================================================
RCS file: /local/src/CVS/twin/Makefile.am,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- Makefile.am	15 Sep 2004 20:43:17 -0000	1.1.1.1
+++ Makefile.am	21 Sep 2004 03:55:30 -0000	1.2
@@ -17,9 +17,12 @@
 xtwin_SOURCES = \
 	twin.h \
 	twin_draw.c \
+	twin_path.c \
 	twin_pixmap.c \
+	twin_poly.c \
 	twin_primitive.c \
 	twin_screen.c \
+	twin_spline.c \
 	twin_x11.c \
 	twinint.h \
 	xtwin.c

Index: architecture
===================================================================
RCS file: /local/src/CVS/twin/architecture,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- architecture	15 Sep 2004 20:43:17 -0000	1.1.1.1
+++ architecture	21 Sep 2004 03:55:30 -0000	1.2
@@ -52,3 +52,9 @@
 Geometry can be displayed by computing an appropriate A8 pixmap and
 compositing the result to a pixmap.
 
+7. Paths
+
+To draw the A8 pixmap mentioned above, use a combination of move, draw
+and curve primitives to construct a path and then fill it.  To outline a
+path, use the convolution operator to convolve a pen with the path to
+construct a closed path surrounding the stroke.

Index: twin.h
===================================================================
RCS file: /local/src/CVS/twin/twin.h,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- twin.h	15 Sep 2004 20:43:17 -0000	1.1.1.1
+++ twin.h	21 Sep 2004 03:55:30 -0000	1.2
@@ -29,9 +29,20 @@
 #include <stdint.h>
 
 typedef uint8_t	    twin_a8_t;
+typedef uint16_t    twin_a16_t;
 typedef uint16_t    twin_rgb16_t;
 typedef uint32_t    twin_argb32_t;
-typedef int	    twin_bool;
+typedef int	    twin_bool_t;
+typedef int16_t	    twin_fixed_t;   /* 12.4 format */
+typedef int32_t	    twin_dfixed_t;
+
+#define twin_fixed_floor(f) ((((f) < 0) ? ((f) + 0xf) : (f)) >> 4)
+#define twin_fixed_trunc(f) ((f) >> 4)
+
+#define twin_double_to_fixed(d)	((twin_fixed_t) ((d) * 16.0))
+#define twin_fixed_to_double(f)	((double) (f) / 16.0)
+
+#define TWIN_FIXED_ONE	(0x10)
 
 #define TWIN_FALSE  0
 #define TWIN_TRUE   1
@@ -133,6 +144,16 @@
 typedef enum { TWIN_OVER, TWIN_SOURCE } twin_operator_t;
 
 /*
+ * A (fixed point) point
+ */
+
+typedef struct _twin_point {
+    twin_fixed_t    x, y;
+} twin_point_t;
+
+typedef struct _twin_path twin_path_t;
+
+/*
  * twin_draw.c
  */
 
@@ -160,6 +181,31 @@
 	   int		    height);
 
 /*
+ * twin_path.c
+ */
+
+void 
+twin_path_move (twin_path_t *path, twin_fixed_t x, twin_fixed_t y);
+
+void
+twin_path_draw (twin_path_t *path, twin_fixed_t x, twin_fixed_t y);
+
+void
+twin_path_close (twin_path_t *path);
+
+void
+twin_path_fill (twin_pixmap_t *pixmap, twin_path_t *path);
+
+void
+twin_path_empty (twin_path_t *path);
+
+twin_path_t *
+twin_path_create (void);
+
+void
+twin_path_destroy (twin_path_t *path);
+
+/*
  * twin_pixmap.c
  */
 
@@ -188,6 +234,12 @@
 twin_pixmap_pointer (twin_pixmap_t *pixmap, int x, int y);
 
 /*
+ * twin_poly.c
+ */
+void
+twin_polygon (twin_pixmap_t *pixmap, twin_point_t *vertices, int nvertices);
+
+/*
  * twin_screen.c
  */
 
@@ -207,13 +259,25 @@
 void
 twin_screen_resize (twin_screen_t *screen, int width, int height);
 
-twin_bool
+twin_bool_t
 twin_screen_damaged (twin_screen_t *screen);
 
 void
 twin_screen_update (twin_screen_t *screen);
 
-/* twin_x11.c */
+/*
+ * twin_spline.c
+ */
+
+void
+twin_path_curve (twin_path_t	*path,
+		 twin_fixed_t	x1, twin_fixed_t y1,
+		 twin_fixed_t	x2, twin_fixed_t y2,
+		 twin_fixed_t	x3, twin_fixed_t y3);
+
+/*
+ * twin_x11.c 
+ */
 
 #include <X11/Xlib.h>
 

Index: twin_draw.c
===================================================================
RCS file: /local/src/CVS/twin/twin_draw.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- twin_draw.c	15 Sep 2004 20:43:17 -0000	1.1.1.1
+++ twin_draw.c	21 Sep 2004 03:55:30 -0000	1.2
@@ -280,9 +280,6 @@
 	twin_src_msk_op	op;
 	twin_source_u   s, m;
 	int		sdx, sdy, mdx, mdy;
-	twin_argb32_t	*src_tmp;
-	twin_argb32_t	*msk_tmp;
-	twin_argb32_t	*dst_tmp;
 	
 	sdx = src_x - dst_x;
 	sdy = src_y - dst_y;

--- NEW FILE: twin_path.c ---
(This appears to be a binary file; contents omitted.)

--- NEW FILE: twin_poly.c ---
(This appears to be a binary file; contents omitted.)

Index: twin_screen.c
===================================================================
RCS file: /local/src/CVS/twin/twin_screen.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- twin_screen.c	15 Sep 2004 20:43:17 -0000	1.1.1.1
+++ twin_screen.c	21 Sep 2004 03:55:30 -0000	1.2
@@ -83,7 +83,7 @@
     twin_screen_damage (screen, 0, 0, screen->width, screen->height);
 }
 
-twin_bool
+twin_bool_t
 twin_screen_damaged (twin_screen_t *screen)
 {
     return (screen->damage.left < screen->damage.right &&

--- NEW FILE: twin_spline.c ---
(This appears to be a binary file; contents omitted.)

Index: twinint.h
===================================================================
RCS file: /local/src/CVS/twin/twinint.h,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- twinint.h	15 Sep 2004 20:43:17 -0000	1.1.1.1
+++ twinint.h	21 Sep 2004 03:55:30 -0000	1.2
@@ -28,6 +28,9 @@
 #include "twin.h"
 #include <string.h>
 
+/*
+ * Compositing stuff
+ */
 #define twin_int_mult(a,b,t)	((t) = (a) * (b) + 0x80, \
 				 ((((t)>>8 ) + (t))>>8 ))
 #define twin_int_div(a,b)	(((uint16_t) (a) * 255) / (b))
@@ -79,6 +82,9 @@
 			   twin_source_u	src,
 			   int			width);
 
+/*
+ * This needs to be refactored to reduce the number of functions...
+ */
 twin_in_op_func _twin_argb32_in_argb32_over_argb32;
 twin_in_op_func _twin_argb32_in_rgb16_over_argb32;
 twin_in_op_func _twin_argb32_in_a8_over_argb32;
@@ -210,4 +216,46 @@
 twin_argb32_t *
 _twin_fetch_argb32 (twin_pixmap_t *pixmap, int x, int y, int w, twin_argb32_t *span);
 
+/*
+ * Polygon stuff
+ */
+
+typedef struct _twin_edge {
+    struct _twin_edge	*next;
+    twin_fixed_t	top, bot;
+    twin_fixed_t	x;
+    twin_fixed_t	e;
+    twin_fixed_t	dx, dy;
+    twin_fixed_t	inc_x;
+    twin_fixed_t	step_x;
+    int			winding;
+} twin_edge_t;
+
+/*
+ * Pixmap must be in a8 format.
+ */
+
+int
+_twin_edge_build (twin_point_t *vertices, int nvertices, twin_edge_t *edges);
+
+void
+_twin_edge_fill (twin_pixmap_t *pixmap, twin_edge_t *edges, int nedges);
+
+/*
+ * Path stuff
+ */
+
+/*
+ * A (fixed point) path
+ */
+
+struct _twin_path {
+    twin_point_t    *points;
+    int		    size_points;
+    int		    npoints;
+    int		    *sublen;
+    int		    size_sublen;
+    int		    nsublen;
+};
+
 #endif /* _TWININT_H_ */

Index: xtwin.c
===================================================================
RCS file: /local/src/CVS/twin/xtwin.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- xtwin.c	15 Sep 2004 20:43:17 -0000	1.1.1.1
+++ xtwin.c	21 Sep 2004 03:55:30 -0000	1.2
@@ -34,13 +34,48 @@
     twin_x11_t	    *x11 = twin_x11_create (dpy, 256, 256);
     twin_pixmap_t   *red = twin_pixmap_create (TWIN_ARGB32, 100, 100);
     twin_pixmap_t   *blue = twin_pixmap_create (TWIN_ARGB32, 100, 100);
+    twin_pixmap_t   *alpha = twin_pixmap_create (TWIN_A8, 100, 100);
+    twin_operand_t  source, mask;
+    twin_path_t	    *path;
     XEvent	    ev;
     int		    x, y;
 
     twin_fill (red, 0x80800000, TWIN_SOURCE, 0, 0, 100, 100);
     twin_fill (red, 0xffffff00, TWIN_SOURCE, 25, 25, 50, 50);
+
+    twin_fill (blue, 0x00000000, TWIN_SOURCE, 0, 0, 100, 100);
+    twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, 100, 100);
+
+    path = twin_path_create ();
+
+    twin_path_move (path, twin_double_to_fixed (10), twin_double_to_fixed (10));
+    twin_path_draw (path, twin_double_to_fixed (30), twin_double_to_fixed (20));
+    twin_path_draw (path, twin_double_to_fixed (5), twin_double_to_fixed (50));
+    twin_path_close (path);
+
+    twin_path_fill (alpha, path);
+    twin_path_empty (path);
+
+    twin_path_move (path, 
+		    twin_double_to_fixed  (50), twin_double_to_fixed (50));
+    twin_path_curve (path,
+		     twin_double_to_fixed (70), twin_double_to_fixed (70),
+		     twin_double_to_fixed (80), twin_double_to_fixed (70),
+		     twin_double_to_fixed (100), twin_double_to_fixed (50));
+
+    twin_path_fill (alpha, path);
+
+    source.source_kind = TWIN_SOLID;
+    source.u.argb = 0xff0000ff;
+    mask.source_kind = TWIN_PIXMAP;
+    mask.u.pixmap = alpha;
+    twin_composite (blue, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER,
+		    100, 100);
+    
+    /*
     twin_fill (blue, 0x80000080, TWIN_SOURCE, 0, 0, 100, 100);
     twin_fill (blue, 0xff00c000, TWIN_SOURCE, 25, 25, 50, 50);
+     */
     twin_pixmap_move (red, 20, 20);
     twin_pixmap_move (blue, 80, 80);
     twin_pixmap_show (red, x11->screen, 0);




More information about the Commit mailing list