| #include <u.h> |
| #include <libc.h> |
| #include <draw.h> |
| #include <memdraw.h> |
| #include <bio.h> |
| #include "imagefile.h" |
| |
| /* Separate colors, if not a grey scale or bitmap, into one byte per color per pixel, no alpha or X */ |
| /* Result is GREY[1248] or RGB24 */ |
| |
| int drawlog2[] = { |
| 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, |
| 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 5 |
| }; |
| |
| static |
| int |
| notrans(ulong chan) |
| { |
| switch(chan){ |
| case GREY1: |
| case GREY2: |
| case GREY4: |
| case GREY8: |
| case RGB24: |
| return 1; |
| } |
| return 0; |
| } |
| |
| Image* |
| multichan(Image *i) |
| { |
| Image *ni; |
| |
| if(notrans(i->chan)) |
| return i; |
| |
| ni = allocimage(display, i->r, RGB24, 0, DNofill); |
| if(ni == nil) |
| return ni; |
| draw(ni, ni->r, i, nil, i->r.min); |
| return ni; |
| } |
| |
| Memimage* |
| memmultichan(Memimage *i) |
| { |
| Memimage *ni; |
| |
| if(notrans(i->chan)) |
| return i; |
| |
| ni = allocmemimage(i->r, RGB24); |
| if(ni == nil) |
| return ni; |
| memimagedraw(ni, ni->r, i, i->r.min, nil, i->r.min, S); |
| return ni; |
| } |