xref: /plan9/sys/src/cmd/jpg/multichan.c (revision 6a9fc400c33447ef5e1cda7185cb4de2c8e8010e)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier #include <memdraw.h>
57dd7cddfSDavid du Colombier #include <bio.h>
67dd7cddfSDavid du Colombier #include "imagefile.h"
77dd7cddfSDavid du Colombier 
87dd7cddfSDavid du Colombier /* Separate colors, if not a grey scale or bitmap, into one byte per color per pixel, no alpha or X */
97dd7cddfSDavid du Colombier /* Result is GREY[1248] or RGB24 */
107dd7cddfSDavid du Colombier 
117dd7cddfSDavid du Colombier static
127dd7cddfSDavid du Colombier int
notrans(ulong chan)137dd7cddfSDavid du Colombier notrans(ulong chan)
147dd7cddfSDavid du Colombier {
157dd7cddfSDavid du Colombier 	switch(chan){
167dd7cddfSDavid du Colombier 	case GREY1:
177dd7cddfSDavid du Colombier 	case GREY2:
187dd7cddfSDavid du Colombier 	case GREY4:
197dd7cddfSDavid du Colombier 	case GREY8:
207dd7cddfSDavid du Colombier 	case RGB24:
217dd7cddfSDavid du Colombier 		return 1;
227dd7cddfSDavid du Colombier 	}
237dd7cddfSDavid du Colombier 	return 0;
247dd7cddfSDavid du Colombier }
257dd7cddfSDavid du Colombier 
267dd7cddfSDavid du Colombier Image*
multichan(Image * i)277dd7cddfSDavid du Colombier multichan(Image *i)
287dd7cddfSDavid du Colombier {
297dd7cddfSDavid du Colombier 	Image *ni;
307dd7cddfSDavid du Colombier 
317dd7cddfSDavid du Colombier 	if(notrans(i->chan))
327dd7cddfSDavid du Colombier 		return i;
337dd7cddfSDavid du Colombier 
347dd7cddfSDavid du Colombier 	ni = allocimage(display, i->r, RGB24, 0, DNofill);
357dd7cddfSDavid du Colombier 	if(ni == nil)
367dd7cddfSDavid du Colombier 		return ni;
377dd7cddfSDavid du Colombier 	draw(ni, ni->r, i, nil, i->r.min);
387dd7cddfSDavid du Colombier 	return ni;
397dd7cddfSDavid du Colombier }
407dd7cddfSDavid du Colombier 
417dd7cddfSDavid du Colombier Memimage*
memmultichan(Memimage * i)427dd7cddfSDavid du Colombier memmultichan(Memimage *i)
437dd7cddfSDavid du Colombier {
447dd7cddfSDavid du Colombier 	Memimage *ni;
457dd7cddfSDavid du Colombier 
467dd7cddfSDavid du Colombier 	if(notrans(i->chan))
477dd7cddfSDavid du Colombier 		return i;
487dd7cddfSDavid du Colombier 
497dd7cddfSDavid du Colombier 	ni = allocmemimage(i->r, RGB24);
507dd7cddfSDavid du Colombier 	if(ni == nil)
517dd7cddfSDavid du Colombier 		return ni;
52*6a9fc400SDavid du Colombier 	memimagedraw(ni, ni->r, i, i->r.min, nil, i->r.min, S);
537dd7cddfSDavid du Colombier 	return ni;
547dd7cddfSDavid du Colombier }
55