shithub: fork

Download patch

ref: 775ac48ec6a03a849d41f41da14673102be22d8c
parent: 6f4b1dc79f7ec7b1c5f3cea63d35d7fd42540d07
author: qwx <qwx@sciops.net>
date: Sat Sep 13 18:32:38 EDT 2025

libdraw: sync with upstream

--- a/sys/include/ape/draw.h
+++ b/sys/include/ape/draw.h
@@ -24,6 +24,7 @@
 typedef struct	RGB RGB;
 typedef struct	Screen Screen;
 typedef struct	Subfont Subfont;
+typedef long	Warp[3][3];
 typedef struct	Theme Theme;
 
 #pragma varargck	type	"R"	Rectangle
@@ -183,8 +184,9 @@
 
 struct Display
 {
-	QLock	qlock;
-	int		locking;	/*program is using lockdisplay */
+	QLock		qlock;
+	RWLock		usrlock;	/* for getwindow(2) and the globals */
+	int		locking;	/* ignored (kept for backwards compatibility) */
 	int		dirno;
 	int		fd;
 	int		reffd;
@@ -202,13 +204,13 @@
 	Image		*transparent;
 	Image		*image;
 	uchar		*buf;
-	int			bufsize;
+	int		bufsize;
 	uchar		*bufp;
 	Font		*defaultfont;
 	Subfont		*defaultsubfont;
 	Image		*windows;
 	Image		*screenimage;
-	int			_isnewdisplay;
+	int		_isnewdisplay;
 };
 
 struct Image
@@ -472,6 +474,8 @@
 extern void	fillarcop(Image*, Point, int, int, Image*, Point, int, int, Drawop);
 extern void	border(Image*, Rectangle, int, Image*, Point);
 extern void	borderop(Image*, Rectangle, int, Image*, Point, Drawop);
+extern void	mkwarp(Warp, double[3][3]);
+extern void	affinewarp(Image*, Rectangle, Image*, Point, Warp, int);
 
 /*
  * Font management
@@ -502,8 +506,16 @@
 extern char*	subfontname(char*, char*, int);
 extern Subfont*	_getsubfont(Display*, char*);
 extern Subfont*	getdefont(Display*);
-extern void		lockdisplay(Display*);
+
+/*
+ * Concurrency
+ */
+extern void	lockdisplay(Display*);
 extern void	unlockdisplay(Display*);
+extern void	rlockdisplay(Display*);
+extern void	runlockdisplay(Display*);
+extern void	_lockdisplay(Display*);
+extern void	_unlockdisplay(Display*);
 
 /*
  * Predefined 
@@ -521,7 +533,7 @@
 extern	Image	*screen;
 extern	Screen	*_screen;
 extern	int	_cursorfd;
-extern	void	_setdrawop(Display*, Drawop);
+extern	uchar*	_bufimageop(Display*, int, Drawop);
 
 #define	BGSHORT(p)	((p)[0]|((p)[1]<<8))
 #define	BGLONG(p)	((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24))
--- a/sys/include/draw.h
+++ b/sys/include/draw.h
@@ -14,6 +14,7 @@
 typedef struct	RGB RGB;
 typedef struct	Screen Screen;
 typedef struct	Subfont Subfont;
+typedef long	Warp[3][3];
 typedef struct	Theme Theme;
 
 #pragma incomplete Mouse
@@ -176,7 +177,8 @@
 struct Display
 {
 	QLock		qlock;
-	int		locking;	/*program is using lockdisplay */
+	RWLock		usrlock;	/* for getwindow(2) and the globals */
+	int		locking;	/* ignored (kept for backwards compatibility) */
 	int		dirno;
 	int		fd;
 	int		reffd;
@@ -466,6 +468,8 @@
 extern void	fillarcop(Image*, Point, int, int, Image*, Point, int, int, Drawop);
 extern void	border(Image*, Rectangle, int, Image*, Point);
 extern void	borderop(Image*, Rectangle, int, Image*, Point, Drawop);
+extern void	mkwarp(Warp, double[3][3]);
+extern void	affinewarp(Image*, Rectangle, Image*, Point, Warp, int);
 
 /*
  * Font management
@@ -496,8 +500,16 @@
 extern char*	subfontname(char*, char*, int);
 extern Subfont*	_getsubfont(Display*, char*);
 extern Subfont*	getdefont(Display*);
-extern void		lockdisplay(Display*);
+
+/*
+ * Concurrency
+ */
+extern void	lockdisplay(Display*);
 extern void	unlockdisplay(Display*);
+extern void	rlockdisplay(Display*);
+extern void	runlockdisplay(Display*);
+extern void	_lockdisplay(Display*);
+extern void	_unlockdisplay(Display*);
 
 /*
  * Predefined 
@@ -515,7 +527,7 @@
 extern	Image	*screen;
 extern	Screen	*_screen;
 extern	int	_cursorfd;
-extern	void	_setdrawop(Display*, Drawop);
+extern	uchar*	_bufimageop(Display*, int, Drawop);
 
 #define	BGSHORT(p)	((p)[0]|((p)[1]<<8))
 #define	BGLONG(p)	((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24))
--- a/sys/src/libdraw/emenuhit.c
+++ b/sys/src/libdraw/emenuhit.c
@@ -61,6 +61,8 @@
 	freeimage(high);
 	freeimage(bord);
 	freeimage(menutxt);
+	freeimage(htext);
+	freeimage(text);
 	back = display->white;
 	high = display->black;
 	bord = display->black;
@@ -131,10 +133,10 @@
 	int i;
 
 	paintitem(menu, textr, off, lasti, 1, save, nil);
-	flushimage(display, 1);	/* in case display->locking is set */
+	flushimage(display, 1);
 	*m = emouse();
 	while(m->buttons & (1<<(but-1))){
-		flushimage(display, 1);	/* in case display->locking is set */
+		flushimage(display, 1);
 		*m = emouse();
 		i = menusel(textr, m->xy);
 		if(i != -1 && i == lasti)
@@ -171,8 +173,7 @@
 	if(r.max.y < r.min.y+2)
 		r.max.y = r.min.y+2;
 	border(screen, r, 1, bord, ZP);
-	if(menutxt)
-		draw(screen, insetrect(r, 1), menutxt, nil, ZP);
+	draw(screen, insetrect(r, 1), menutxt, nil, ZP);
 }
 
 int
@@ -273,7 +274,7 @@
 					menuscrollpaint(scrollr, off, nitem, nitemdrawn);
 				}
 			}
-			flushimage(display, 1);	/* in case display->locking is set */
+			flushimage(display, 1);
 			*m = emouse();
 		}
 	}
--- a/sys/src/libdraw/menuhit.c
+++ b/sys/src/libdraw/menuhit.c
@@ -62,6 +62,8 @@
 	freeimage(high);
 	freeimage(bord);
 	freeimage(menutxt);
+	freeimage(text);
+	freeimage(htext);
 	back = display->white;
 	high = display->black;
 	bord = display->black;
@@ -168,8 +170,7 @@
 	if(r.max.y < r.min.y+2)
 		r.max.y = r.min.y+2;
 	border(m, r, 1, bord, ZP);
-	if(menutxt)
-		draw(m, insetrect(r, 1), menutxt, nil, ZP);
+	draw(m, insetrect(r, 1), menutxt, nil, ZP);
 }
 
 int
--- a/sys/src/libdraw/mkfile
+++ b/sys/src/libdraw/mkfile
@@ -63,6 +63,8 @@
 	writecolmap.$O\
 	writeimage.$O\
 	writesubfont.$O\
+	warp.$O\
+	mkwarp.$O\
 
 HFILES=\
 	/sys/include/draw.h\
--