xref: /inferno-os/libdraw/allocimagemix.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1 #include "lib9.h"
2 #include "draw.h"
3 
4 Image*
allocimagemix(Display * d,ulong color1,ulong color3)5 allocimagemix(Display *d, ulong color1, ulong color3)
6 {
7 	Image *t, *b;
8 	static Image *qmask;
9 
10 	if(qmask == nil)
11 		qmask = allocimage(d, Rect(0,0,1,1), GREY8, 1, 0x3F3F3FFF);
12 
13 	if(d->depth <= 8){	/* create a 2×2 texture */
14 		t = allocimage(d, Rect(0,0,1,1), d->chan, 0, color1);
15 		if(t == nil)
16 			return nil;
17 
18 		b = allocimage(d, Rect(0,0,2,2), d->chan, 1, color3);
19 		if(b == nil){
20 			freeimage(t);
21 			return nil;
22 		}
23 
24 		draw(b, Rect(0,0,1,1), t, nil, ZP);
25 		freeimage(t);
26 		return b;
27 	}else{	/* use a solid color, blended using alpha */
28 		t = allocimage(d, Rect(0,0,1,1), d->chan, 1, color1);
29 		if(t == nil)
30 			return nil;
31 
32 		b = allocimage(d, Rect(0,0,1,1), d->chan, 1, color3);
33 		if(b == nil){
34 			freeimage(t);
35 			return nil;
36 		}
37 
38 		draw(b, b->r, t, qmask, ZP);
39 		freeimage(t);
40 		return b;
41 	}
42 }
43