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
|
@ -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);
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue