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:
parent
0a3eb7d6b1
commit
558b9558d4
3 changed files with 17 additions and 33 deletions
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue