Browse Source

New functions to libdraw (#795)

* New functions to libdraw:

 + Now we can draw 3D borders
 + We can change default menu colors.


Signed-off-by: fuchicar <rafita.fernandez@gmail.com>
Rafa 6 years ago
parent
commit
41f53512f6
4 changed files with 62 additions and 22 deletions
  1. 5 4
      sys/include/draw.h
  2. 1 0
      sys/include/mouse.h
  3. 12 0
      sys/src/libdraw/border.c
  4. 44 18
      sys/src/libdraw/menuhit.c

+ 5 - 4
sys/include/draw.h

@@ -57,7 +57,7 @@ enum
 
 	DNotacolor	= 0xFFFFFF00,
 	DNofill		= DNotacolor,
-	
+
 };
 
 enum
@@ -111,7 +111,7 @@ typedef enum
 } Drawop;
 
 /*
- * image channel descriptors 
+ * image channel descriptors
  */
 enum {
 	CRed = 0,
@@ -306,7 +306,7 @@ struct Font
 	Display		*display;
 	int16_t		height;	/* max height of image, interline spacing */
 	int16_t		ascent;	/* top of image to baseline */
-	int16_t		width;	/* widest so far; used in caching only */	
+	int16_t		width;	/* widest so far; used in caching only */
 	int16_t		nsub;	/* number of subfonts */
 	uint32_t		age;	/* increasing counter; used for LRU */
 	int		maxdepth;	/* maximum depth of all loaded subfonts */
@@ -467,6 +467,7 @@ extern void	arcop(Image*, Point, int, int, int, Image*, Point, int, int, Drawop)
 extern void	fillarc(Image*, Point, int, int, Image*, Point, int, int);
 extern void	fillarcop(Image*, Point, int, int, Image*, Point, int, int, Drawop);
 extern void	border(Image*, Rectangle, int, Image*, Point);
+extern void border3d(Image *im, Rectangle r, int i, Image *colorup, Image *colordown, Point sp);
 extern void	borderop(Image*, Rectangle, int, Image*, Point, Drawop);
 
 /*
@@ -507,7 +508,7 @@ extern void	unlockdisplay(Display*);
 extern int		drawlsetrefresh(uint32_t, int, void*, void*);
 
 /*
- * Predefined 
+ * Predefined
  */
 extern	uint8_t	defontdata[];
 extern	int		sizeofdefont;

+ 1 - 0
sys/include/mouse.h

@@ -58,3 +58,4 @@ extern void		setcursor(Mousectl*, Cursor*);
 extern void		drawgetrect(Rectangle, int);
 extern Rectangle	getrect(int, Mousectl*);
 extern int	 		menuhit(int, Mousectl*, Menu*, Screen*);
+extern void setmenucolor(uint32_t backcolor, uint32_t highcolor, uint32_t bordercolor, uint32_t textcolor, uint32_t seltextcolor);

+ 12 - 0
sys/src/libdraw/border.c

@@ -28,3 +28,15 @@ border(Image *im, Rectangle r, int i, Image *color, Point sp)
 	draw(im, Rect(r.max.x-i, r.min.y+i, r.max.x, r.max.y-i),
 		color, nil, Pt(sp.x+Dx(r)-i, sp.y+i));
 }
+
+void
+border3d(Image *im, Rectangle r, int i, Image *colorup, Image *colordown, Point sp) {
+	draw(im, Rect(r.min.x, r.min.y, r.max.x, r.min.y+i),
+		colorup, nil, sp);
+	draw(im, Rect(r.min.x, r.max.y-i, r.max.x, r.max.y),
+		colordown, nil, Pt(sp.x, sp.y+Dy(r)-i));
+	draw(im, Rect(r.min.x, r.min.y+i, r.min.x+i, r.max.y-i),
+		colorup, nil, Pt(sp.x, sp.y+i));
+	draw(im, Rect(r.max.x-i, r.min.y+i, r.max.x, r.max.y-i),
+		colordown, nil, Pt(sp.x+Dx(r)-i, sp.y+i));
+}

+ 44 - 18
sys/src/libdraw/menuhit.c

@@ -32,29 +32,55 @@ static	Image	*bord;
 static	Image	*text;
 static	Image	*htext;
 
+static void
+setimagemenucolors(Image *backcolor, Image *highcolor, Image *bordercolor, Image *textcolor, Image *seltextcolor){
+	if (htext == back){
+		htext = nil;
+	} else {
+		freeimage(htext);
+	}
+	if (back != nil && back != display->white){
+		freeimage(back);
+		freeimage(high);
+		freeimage(bord);
+	}
+	if (text != nil && text != display->black){
+		freeimage(text);
+	}
+	if (backcolor == nil || highcolor == nil || bordercolor == nil || textcolor == nil || seltextcolor == nil){
+		back = display->white;
+		high = display->black;
+		bord = display->black;
+		text = display->black;
+		htext = display->white;
+	} else {
+		back = backcolor;
+		high = highcolor;
+		bord = bordercolor;
+		text = textcolor;
+		htext = seltextcolor;
+	}
+}
+
+void
+setmenucolor(uint32_t backcolor, uint32_t highcolor, uint32_t bordercolor, uint32_t textcolor, uint32_t seltextcolor){
+	setimagemenucolors(allocimage(display, Rect(0,0,1,1), screen->chan, 1, backcolor),
+	                   allocimage(display, Rect(0,0,1,1), screen->chan, 1, highcolor),
+	                   allocimage(display, Rect(0,0,1,1), screen->chan, 1, bordercolor),
+	                   allocimage(display, Rect(0,0,1,1), screen->chan, 1, textcolor),
+	                   allocimage(display, Rect(0,0,1,1), screen->chan, 1, seltextcolor)
+	                  );
+}
+
 static
 void
 menucolors(void)
 {
 	/* Main tone is greenish, with negative selection */
-	back = allocimagemix(display, DPalegreen, DWhite);
-	high = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DDarkgreen);	/* dark green */
-	bord = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DMedgreen);	/* not as dark green */
-	if(back==nil || high==nil || bord==nil)
-		goto Error;
-	text = display->black;
-	htext = back;
-	return;
-
-    Error:
-	freeimage(back);
-	freeimage(high);
-	freeimage(bord);
-	back = display->white;
-	high = display->black;
-	bord = display->black;
-	text = display->black;
-	htext = display->white;
+	Image *bck = allocimagemix(display, DPalegreen, DWhite);
+	Image *h = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DDarkgreen);	/* dark green */
+	Image *b = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DMedgreen);	/* not as dark green */
+	setimagemenucolors(bck, h, b, display->black, bck);
 }
 
 /*