]> bicyclesonthemoon.info Git - ott/enhance/blob - pal-cgi.c
palette tools online
[ott/enhance] / pal-cgi.c
1 /*\r
2 pal-cgi.c\r
3 The online interface for the tools to insert and extract indexed images\r
4 05.12.2022\r
5 \r
6 Copyright (C) 2015, 2022  Balthasar SzczepaƄski\r
7 \r
8 This program is free software: you can redistribute it and/or modify\r
9 it under the terms of the GNU Affero General Public License as\r
10 published by the Free Software Foundation, either version 3 of the\r
11 License, or (at your option) any later version.\r
12 \r
13 This program is distributed in the hope that it will be useful,\r
14 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
16 GNU Affero General Public License for more details.\r
17 \r
18 You should have received a copy of the GNU Affero General Public License\r
19 along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
20 \r
21 Requires cgilib (http://www.infodrom.org/projects/cgilib/)\r
22 */\r
23 \r
24 #include <stdio.h>\r
25 #include <stdint.h>\r
26 #include <unistd.h>\r
27 #include <stdlib.h>\r
28 #include <sys/wait.h>\r
29 #include <stdint.h>\r
30 #include <inttypes.h>\r
31 \r
32 #include <cgi.h>\r
33 \r
34 #include "online-core.h"\r
35 #include "nclr.h"\r
36 \r
37 #define INSERT     0\r
38 #define EXTRACT_H  1\r
39 #define EXTRACT_V  2\r
40 #define DETECT     3\r
41 #define MAX_ACTION DETECT\r
42 \r
43 int insert(\r
44         char *inpix0, char *inpix1, char *outpix,\r
45         uint_fast8_t r0, uint_fast8_t r1\r
46 );\r
47 int extract(\r
48         char *inpix, char *outpix0, char *outpix1,\r
49         uint_fast8_t size_defined,\r
50         uint_fast8_t p0, uint_fast8_t p1\r
51 );\r
52 int detect(\r
53         char *inpix, char *outpix,\r
54         uint_fast8_t size_defined,\r
55         uint_fast8_t p0, uint_fast8_t p1\r
56 );\r
57 \r
58 int main (int argc, char *argv[])\r
59 {\r
60         s_cgi *cgi;\r
61         char tmp0[256];\r
62         char tmp1[256];\r
63         char tmp2[256];\r
64         char *in0_path;\r
65         char *in1_path;\r
66         \r
67         char *t;\r
68         uint_fast8_t p0, p1;\r
69         uint_fast8_t size_defined = 0;\r
70         uint_fast8_t action;\r
71         \r
72         int r=0;\r
73         int r1=0;\r
74         int r2=0;\r
75         int r3=0;\r
76         int r4=0;\r
77         \r
78         do {\r
79                 make_tmp_path(tmp0, 256, 0, ".png");\r
80                 make_tmp_path(tmp1, 256, 1, ".png");\r
81                 make_tmp_path(tmp2, 256, 2, ".png");\r
82                 \r
83                 cgi=cgiInit();\r
84                 \r
85                 t = cgiGetValue(cgi, "a");\r
86                 if (t != NULL)\r
87                         sscanf(t,"%"SCNuFAST8, &action);\r
88                 else\r
89                         action = DETECT;\r
90                 if (action > MAX_ACTION)\r
91                         action = DETECT;\r
92                 \r
93                 r = get_file(cgi,"inpixf0", tmp0, &in0_path);\r
94                 if (r)\r
95                         r = get_file(cgi,"inpix0", tmp0, &in0_path);\r
96                 if (r)\r
97                         break;\r
98                 \r
99                 if (action == INSERT)\r
100                 {\r
101                         r = get_file(cgi,"inpixf1", tmp1, &in1_path);\r
102                         if (r)\r
103                                 r = get_file(cgi,"inpix1", tmp1, &in1_path);\r
104                         if (r)\r
105                                 break;\r
106                         \r
107                         t = cgiGetValue(cgi, "r0");\r
108                         if (t != NULL)\r
109                                 sscanf(t,"%"SCNuFAST8, &p0);\r
110                         else\r
111                                 p0 = 1;\r
112                         \r
113                         t = cgiGetValue(cgi, "r1");\r
114                         if (t != NULL)\r
115                                 sscanf(t,"%"SCNuFAST8, &p1);\r
116                         else\r
117                                 p1 = 0;\r
118                 }\r
119                 else\r
120                 {\r
121                         t = cgiGetValue(cgi, "p0");\r
122                         if (t != NULL)\r
123                         {\r
124                                 sscanf(t,"%"SCNuFAST8, &p0);\r
125                                 size_defined=1;\r
126                         }\r
127                         else\r
128                                 p0 = 0;\r
129                         \r
130                         t = cgiGetValue(cgi, "p1");\r
131                         if (t != NULL)\r
132                         {\r
133                                 sscanf(t,"%"SCNuFAST8, &p1);\r
134                                 size_defined=1;\r
135                         }\r
136                         else\r
137                                 p1 = 0;\r
138                 }\r
139                 \r
140                 switch (action)\r
141                 {\r
142                 case INSERT:\r
143                         r = insert(\r
144                                 in0_path, in1_path, tmp2,\r
145                                 p0, p1\r
146                         );\r
147                         break;\r
148                 case EXTRACT_H:\r
149                 case EXTRACT_V:\r
150                         r = extract(\r
151                                 in0_path, tmp1, tmp2,\r
152                                 size_defined,\r
153                                 p0, p1\r
154                         );\r
155                         break;\r
156                 case DETECT:\r
157                         r = detect(\r
158                                 in0_path, tmp2,\r
159                                 size_defined,\r
160                                 p0, p1\r
161                         );\r
162                         break;\r
163                 }\r
164                 if (r)\r
165                         break;\r
166                 \r
167                 r1 = send_file(\r
168                         (action == EXTRACT_H) ? tmp1 : tmp2,\r
169                         "image/png",\r
170                         0\r
171                 );\r
172         } while (0);\r
173         if (r)\r
174         {\r
175                 r1 = send_data(nclr, nclr_size, "image/png", 500);\r
176         }\r
177         r2 = rm(tmp0);\r
178         r3 = rm(tmp1);\r
179         r4 = rm(tmp2);\r
180         if (r1)\r
181                 return r1;\r
182         if (r2)\r
183                 return r2;\r
184         if (r3)\r
185                 return r3;\r
186         if (r4)\r
187                 return r4;\r
188         return 0;\r
189 }\r
190 \r
191 int insert(\r
192         char *inpix0, char *inpix1, char *outpix,\r
193         uint_fast8_t r0, uint_fast8_t r1\r
194 )\r
195 {\r
196         char s_r0[4];\r
197         char s_r1[4];\r
198         \r
199         pid_t sub;\r
200         int r;\r
201         \r
202         snprintf(s_r0, 4, "%"PRIuFAST8, r0);\r
203         snprintf(s_r1, 4, "%"PRIuFAST8, r1);\r
204         \r
205         sub = fork();\r
206         if (sub == 0)\r
207         {\r
208                 r = execl(\r
209                         PAL_MIX_PATH, PAL_MIX_PATH,\r
210                         inpix0, inpix1, outpix,\r
211                         s_r0, s_r1,\r
212                         (char *)0\r
213                 );\r
214                 exit(r);\r
215         }\r
216         waitpid(sub, &r, 0);\r
217         return r;\r
218 }\r
219 \r
220 int extract(\r
221         char *inpix, char *outpix0, char *outpix1,\r
222         uint_fast8_t size_defined,\r
223         uint_fast8_t p0, uint_fast8_t p1\r
224 )\r
225 {\r
226         char s_p0[4];\r
227         char s_p1[4];\r
228         \r
229         pid_t sub;\r
230         int r;\r
231         \r
232         if (size_defined)\r
233         {\r
234                 snprintf(s_p0, 4, "%"PRIuFAST8, p0);\r
235                 snprintf(s_p1, 4, "%"PRIuFAST8, p1);\r
236         }\r
237         \r
238         sub = fork();\r
239         if (sub == 0)\r
240         {\r
241                 r = execl(\r
242                         PAL_UNMIX_PATH, PAL_UNMIX_PATH,\r
243                         inpix, outpix0, outpix1,\r
244                         size_defined ? s_p0 : ((char *) 0),\r
245                         size_defined ? s_p1 : ((char *) 0),\r
246                         (char *) 0\r
247                 );\r
248                 exit(r);\r
249         }\r
250         waitpid(sub, &r, 0);\r
251         return r;\r
252 }\r
253 \r
254 int detect(\r
255         char *inpix, char *outpix,\r
256         uint_fast8_t size_defined,\r
257         uint_fast8_t p0, uint_fast8_t p1\r
258 )\r
259 {\r
260         char s_p0[4];\r
261         char s_p1[4];\r
262         \r
263         pid_t sub;\r
264         int r;\r
265         \r
266         if (size_defined)\r
267         {\r
268                 snprintf(s_p0, 4, "%"PRIuFAST8, p0);\r
269                 snprintf(s_p1, 4, "%"PRIuFAST8, p1);\r
270         }\r
271         \r
272         sub = fork();\r
273         if (sub == 0)\r
274         {\r
275                 r = execl(\r
276                         PAL_MIXDIFF_PATH, PAL_MIXDIFF_PATH,\r
277                         inpix, outpix,\r
278                         size_defined ? s_p0 : ((char *) 0),\r
279                         size_defined ? s_p1 : ((char *) 0),\r
280                         (char *) 0\r
281                 );\r
282                 exit(r);\r
283         }\r
284         waitpid(sub, &r, 0);\r
285         return r;\r
286 }\r