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

View file

@ -97,7 +97,6 @@ main(int argc, char **argv)
int fd, xsize, ysize; int fd, xsize, ysize;
Memimage *im, *nim; Memimage *im, *nim;
ulong ochan, tchan; ulong ochan, tchan;
char buf[12];
xsize = ysize = 0; xsize = ysize = 0;
ARGBEGIN{ ARGBEGIN{
@ -134,7 +133,14 @@ main(int argc, char **argv)
ochan = im->chan; ochan = im->chan;
switch(ochan){ switch(ochan){
default: 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 GREY8:
case RGB24: case RGB24:
case RGBA32: case RGBA32:
@ -142,11 +148,6 @@ main(int argc, char **argv)
case XRGB32: case XRGB32:
tchan = ochan; tchan = ochan;
break; break;
case CMAP8:
case RGB16:
case RGB15:
tchan = RGB24;
break;
case GREY1: case GREY1:
case GREY2: case GREY2:
case GREY4: case GREY4:

View file

@ -10,27 +10,13 @@ rot90(Memimage *m)
ulong chan; ulong chan;
uchar *s, *d; uchar *s, *d;
Memimage *w; Memimage *w;
char buf[12];
bpp = m->depth/8; bpp = (m->depth+7)/8;
chan = m->chan; chan = m->chan;
switch(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 GREY1:
case GREY2: case GREY2:
case GREY4: case GREY4:
bpp = 1;
if((w = allocmemimage(m->r, GREY8)) == nil) if((w = allocmemimage(m->r, GREY8)) == nil)
sysfatal("allocmemimage: %r"); sysfatal("allocmemimage: %r");
memimagedraw(w, w->r, m, m->r.min, nil, ZP, S); memimagedraw(w, w->r, m, m->r.min, nil, ZP, S);