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