|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <draw.h> | 
|  |  | 
|  | Image* | 
|  | allocimagemix(Display *d, u32int color1, u32int color3) | 
|  | { | 
|  | Image *t, *b; | 
|  | static Image *qmask; | 
|  |  | 
|  | if(qmask == nil) | 
|  | qmask = allocimage(d, Rect(0,0,1,1), GREY8, 1, 0x3F3F3FFF); | 
|  |  | 
|  | if(d->screenimage->depth <= 8){	/* create a 2×2 texture */ | 
|  | t = allocimage(d, Rect(0,0,1,1), d->screenimage->chan, 0, color1); | 
|  | if(t == nil) | 
|  | return nil; | 
|  |  | 
|  | b = allocimage(d, Rect(0,0,2,2), d->screenimage->chan, 1, color3); | 
|  | if(b == nil){ | 
|  | freeimage(t); | 
|  | return nil; | 
|  | } | 
|  |  | 
|  | draw(b, Rect(0,0,1,1), t, nil, ZP); | 
|  | freeimage(t); | 
|  | return b; | 
|  | }else{	/* use a solid color, blended using alpha */ | 
|  | t = allocimage(d, Rect(0,0,1,1), d->screenimage->chan, 1, color1); | 
|  | if(t == nil) | 
|  | return nil; | 
|  |  | 
|  | b = allocimage(d, Rect(0,0,1,1), d->screenimage->chan, 1, color3); | 
|  | if(b == nil){ | 
|  | freeimage(t); | 
|  | return nil; | 
|  | } | 
|  |  | 
|  | draw(b, b->r, t, qmask, ZP); | 
|  | freeimage(t); | 
|  | return b; | 
|  | } | 
|  | } |