MIDI
[mw/milkymist.git] / tools / makeraw.c
1 /*
2  * Milkymist VJ SoC
3  * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, version 3 of the License.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #include <stdlib.h>
19 #include <stdio.h>
20 #include <string.h>
21 #include <gd.h>
22
23 #define MAKERGB565(r, g, b) ((((r) & 0xf8) << 8) | (((g) & 0xfc) << 3) | (((b) & 0xf8) >> 3))
24
25 #define HTOBE(x) (((x & 0x00ff) << 8)|((x & 0xff00) >> 8))
26
27 int main(int argc, char *argv[])
28 {
29         char *finname;
30         char *foutname;
31         char *c;
32         FILE *fin, *fout;
33         gdImagePtr im;
34         int x, y;
35         
36         if(argc != 2) {
37                 fprintf(stderr, "Usage: %s <file.png>\n", argv[0]);
38                 return 1;
39         }
40         finname = argv[1];
41         foutname = strdup(finname);
42         if(!foutname) {
43                 perror("strdup");
44                 return 1;
45         }
46         c = strchr(foutname, '.');
47         if(!c || strcasecmp(c, ".png")) {
48                 fprintf(stderr, "Incorrect filename - must end with '.png'\n");
49                 free(foutname);
50                 return 1;
51         }
52         c[1] = 'r'; c[2] = 'a'; c[3] = 'w';
53         
54         fin = fopen(finname, "rb");
55         if(!fin) {
56                 perror("Unable to open input file");
57                 free(foutname);
58                 return 1;
59         }
60         fout = fopen(foutname, "wb");
61         if(!fout) {
62                 perror("Unable to open output file");
63                 free(foutname);
64                 return 1;
65         }
66         
67         im = gdImageCreateFromPng(fin);
68         if(!im) {
69                 fprintf(stderr, "Unable to read PNG format\n");
70                 return 1;
71         }
72         for(y=0;y<gdImageSY(im);y++)
73                 for(x=0;x<gdImageSX(im);x++) {
74                         int c;
75                         unsigned short int o;
76                         
77                         c = gdImageGetPixel(im, x, y);
78                         
79                         o = MAKERGB565(gdImageRed(im, c), gdImageGreen(im, c), gdImageBlue(im, c));
80                         o = HTOBE(o);
81                         fwrite(&o, 2, 1, fout);
82                 }
83         
84         fclose(fin);
85         if(fclose(fout) != 0) {
86                 perror("fclose");
87                 gdImageDestroy(im);
88                 free(foutname);
89                 return 1;
90         }
91         gdImageDestroy(im);
92         
93         free(foutname);
94         
95         return 0;
96 }
97