xref: /plan9-contrib/sys/src/cmd/jpg/topng.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
180ee5cbfSDavid du Colombier #include <u.h>
280ee5cbfSDavid du Colombier #include <libc.h>
380ee5cbfSDavid du Colombier #include <draw.h>
480ee5cbfSDavid du Colombier #include <memdraw.h>
580ee5cbfSDavid du Colombier #include <ctype.h>
680ee5cbfSDavid du Colombier #include <bio.h>
780ee5cbfSDavid du Colombier #include <flate.h>
880ee5cbfSDavid du Colombier #include "imagefile.h"
980ee5cbfSDavid du Colombier 
1080ee5cbfSDavid du Colombier void
usage(void)1180ee5cbfSDavid du Colombier usage(void)
1280ee5cbfSDavid du Colombier {
1380ee5cbfSDavid du Colombier 	fprint(2, "usage: topng [-c 'comment'] [-g 'gamma'] [file]\n");
1480ee5cbfSDavid du Colombier 	exits("usage");
1580ee5cbfSDavid du Colombier }
1680ee5cbfSDavid du Colombier 
1780ee5cbfSDavid du Colombier void
main(int argc,char * argv[])1880ee5cbfSDavid du Colombier main(int argc, char *argv[])
1980ee5cbfSDavid du Colombier {
2080ee5cbfSDavid du Colombier 	Biobuf bout;
2180ee5cbfSDavid du Colombier 	Memimage *i;
2280ee5cbfSDavid du Colombier 	int fd;
2380ee5cbfSDavid du Colombier 	char *err, *filename;
2480ee5cbfSDavid du Colombier 	ImageInfo II;
2580ee5cbfSDavid du Colombier 
2680ee5cbfSDavid du Colombier 	ARGBEGIN{
2780ee5cbfSDavid du Colombier 	case 'c':
2880ee5cbfSDavid du Colombier 		II.comment = ARGF();
2980ee5cbfSDavid du Colombier 		if(II.comment == nil)
3080ee5cbfSDavid du Colombier 			usage();
3180ee5cbfSDavid du Colombier 		II.fields_set |= II_COMMENT;
3280ee5cbfSDavid du Colombier 		break;
3380ee5cbfSDavid du Colombier 	case 'g':
3480ee5cbfSDavid du Colombier 		II.gamma = atof(ARGF());
3580ee5cbfSDavid du Colombier 		if(II.gamma == 0.)
3680ee5cbfSDavid du Colombier 			usage();
3780ee5cbfSDavid du Colombier 		II.fields_set |= II_GAMMA;
3880ee5cbfSDavid du Colombier 		break;
39*9a747e4fSDavid du Colombier 	case 't':
40*9a747e4fSDavid du Colombier 		break;
4180ee5cbfSDavid du Colombier 	default:
4280ee5cbfSDavid du Colombier 		usage();
4380ee5cbfSDavid du Colombier 	}ARGEND
4480ee5cbfSDavid du Colombier 
4580ee5cbfSDavid du Colombier 	if(Binit(&bout, 1, OWRITE) < 0)
4680ee5cbfSDavid du Colombier 		sysfatal("Binit failed: %r");
4780ee5cbfSDavid du Colombier 	memimageinit();
4880ee5cbfSDavid du Colombier 
4980ee5cbfSDavid du Colombier 	if(argc == 0){
5080ee5cbfSDavid du Colombier 		fd = 0;
5180ee5cbfSDavid du Colombier 		filename = "<stdin>";
5280ee5cbfSDavid du Colombier 	}else{
5380ee5cbfSDavid du Colombier 		fd = open(argv[0], OREAD);
5480ee5cbfSDavid du Colombier 		if(fd < 0)
5580ee5cbfSDavid du Colombier 			sysfatal("can't open %s: %r", argv[0]);
5680ee5cbfSDavid du Colombier 		filename = argv[0];
5780ee5cbfSDavid du Colombier 	}
5880ee5cbfSDavid du Colombier 
5980ee5cbfSDavid du Colombier 	i = readmemimage(fd);
6080ee5cbfSDavid du Colombier 	if(i == nil)
6180ee5cbfSDavid du Colombier 		sysfatal("can't readimage %s: %r", filename);
6280ee5cbfSDavid du Colombier 	close(fd);
6380ee5cbfSDavid du Colombier 
6480ee5cbfSDavid du Colombier 	err = memwritepng(&bout, i, &II);
6580ee5cbfSDavid du Colombier 	freememimage(i);
6680ee5cbfSDavid du Colombier 
6780ee5cbfSDavid du Colombier 	if(err != nil)
6880ee5cbfSDavid du Colombier 		fprint(2, "topng: %s\n", err);
6980ee5cbfSDavid du Colombier 	exits(err);
7080ee5cbfSDavid du Colombier }
71