more generic way to deal with image chan conversion for resize/resample/rotate

this is to catch crazy color channels like k8a8 and the 15/16 bit
ones and CMAP. basically, just convert to RGBA32 or RGB24 depending
on if it has an alpha channel.
This commit is contained in:
cinap_lenrek 2012-10-18 20:17:12 +02:00
parent 0a3eb7d6b1
commit 558b9558d4
3 changed files with 17 additions and 33 deletions

View file

@ -203,7 +203,6 @@ main(int argc, char *argv[])
Memimage *m, *new, *t1, *t2;
char *file;
ulong tchan;
char tmp[100];
double v;
for(i=-K2; i<=K2; i++){
@ -278,8 +277,15 @@ main(int argc, char *argv[])
if(xsize == 0)
xsize = (ysize * Dx(m->r)) / Dy(m->r);
new = nil;
switch(m->chan){
default:
for(tchan = m->chan; tchan; tchan >>= 8)
if(TYPE(tchan) == CAlpha){
tchan = RGBA32;
goto Convert;
}
tchan = RGB24;
goto Convert;
case GREY8:
case RGB24:
@ -289,12 +295,6 @@ main(int argc, char *argv[])
new = resample(xsize, ysize, m);
break;
case CMAP8:
case RGB15:
case RGB16:
tchan = RGB24;
goto Convert;
case GREY1:
case GREY2:
case GREY4:
@ -314,9 +314,6 @@ main(int argc, char *argv[])
memimagedraw(new, new->r, t2, t2->r.min, nil, ZP, S);
freememimage(t2);
break;
default:
sysfatal("can't handle channel type %s", chantostr(tmp, m->chan));
}
assert(new);

View file

@ -97,7 +97,6 @@ main(int argc, char **argv)
int fd, xsize, ysize;
Memimage *im, *nim;
ulong ochan, tchan;
char buf[12];
xsize = ysize = 0;
ARGBEGIN{
@ -134,7 +133,14 @@ main(int argc, char **argv)
ochan = im->chan;
switch(ochan){
default:
sysfatal("can't handle channel type %s", chantostr(buf, ochan));
for(tchan = ochan; tchan; tchan >>= 8)
if(TYPE(tchan) == CAlpha){
tchan = RGBA32;
break;
}
if(tchan == 0)
tchan = RGB24;
break;
case GREY8:
case RGB24:
case RGBA32:
@ -142,11 +148,6 @@ main(int argc, char **argv)
case XRGB32:
tchan = ochan;
break;
case CMAP8:
case RGB16:
case RGB15:
tchan = RGB24;
break;
case GREY1:
case GREY2:
case GREY4:

View file

@ -10,27 +10,13 @@ rot90(Memimage *m)
ulong chan;
uchar *s, *d;
Memimage *w;
char buf[12];
bpp = m->depth/8;
bpp = (m->depth+7)/8;
chan = m->chan;
switch(chan){
default:
sysfatal("can't handle channel type %s", chantostr(buf, chan));
case RGB15:
bpp = 2;
case CMAP8:
case GREY8:
case RGB16:
case RGB24:
case RGBA32:
case ARGB32:
case XRGB32:
break;
case GREY1:
case GREY2:
case GREY4:
bpp = 1;
if((w = allocmemimage(m->r, GREY8)) == nil)
sysfatal("allocmemimage: %r");
memimagedraw(w, w->r, m, m->r.min, nil, ZP, S);