a5a91fa70ddb4b38291470ddd5523ba377c429e0
[colorize.git] / src / mark.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include "mark.h"
6 #include "yuv.h"
7 #include "dir_seperator.h"
8
9 //extern "C" void save_palette(const char *filename);
10 //extern "C" void load_palette(const char *filename);
11
12 struct mark_palette mark_palette[255];
13
14 /* save palette */
15 void save_palette(const char *filename)
16 {
17         char name[256];
18         FILE *fp;
19         int i;
20
21         sprintf(name, "%s_palette", filename);
22 //      printf("saving palette '%s'\n", name);
23         fp = fopen(name, "w");
24         if (!fp) {
25                 printf("failed to save palette '%s'\n", name);
26                 return;
27         }
28         for (i = 0; i < 255; i++)
29                 fprintf(fp, "%03d %03d %03d \"%s\" %f %f %f\n", mark_palette[i].r, mark_palette[i].g, mark_palette[i].b, mark_palette[i].name, mark_palette[i].bright, mark_palette[i].contrast, mark_palette[i].alpha);
30         fprintf(fp, "blacklevel %f\n", black_level);
31         fprintf(fp, "whitelevel %f\n", white_level);
32         fprintf(fp, "fadelevel %f\n", fade_level);
33         fprintf(fp, "yuv_mod %d\n", yuv_mod);
34         fclose(fp);
35 }
36
37 /* load palette */
38 int load_palette(const char *filename)
39 {
40         char name[256];
41         char line[256],*p,*q;
42         FILE *fp;
43         int i;
44         int r, g, b;
45         float bright, contrast, alpha;
46
47         sprintf(name, "%s_palette", filename);
48 //      printf("loading palette '%s'\n", name);
49         fp = fopen(name, "r");
50         if (!fp) {
51                 printf("palette setting '%s' does not (yet) exists\n", name);
52                 return -1;
53         }
54         for (i = 0; ; i++) {
55                 if (!fgets(line, sizeof(line), fp))
56                         break;
57                 line[sizeof(line)-1] = '\0';
58                 if (line[0]) line[strlen(line)-1] = '\0';
59                 if (line[0] && line[strlen(line)-1] == '\r') line[strlen(line)-1] = '\0';
60
61                 /* check for special attrs */
62                 if (!strncmp(line, "blacklevel ", 11)) {
63                         p = line + 11;
64                         sscanf(p, "%lf", &black_level);
65                         continue;
66                 }
67                 if (!strncmp(line, "whitelevel ", 11)) {
68                         p = line + 11;
69                         sscanf(p, "%lf", &white_level);
70                         continue;
71                 }
72                 if (!strncmp(line, "fadelevel ", 10)) {
73                         p = line + 10;
74                         sscanf(p, "%lf", &fade_level);
75                         continue;
76                 }
77                 if (!strncmp(line, "yuv_mod ", 8)) {
78                         p = line + 8;
79                         sscanf(p, "%d", &yuv_mod);
80                         continue;
81                 }
82
83                 /* read palette */
84                 if (i == 256)
85                         break;
86                 sscanf(line, "%d %d %d", &r, &g, &b);
87                 if (!(p = strchr(line, '\"')))
88                         continue;
89                 p++;
90                 strncpy(mark_palette[i].name, p, sizeof(mark_palette[i].name)-1);
91                 if ((q = strchr(mark_palette[i].name, '\"')))
92                         *q = '\0';
93                 if ((p = strchr(p, '\"'))) {
94                         p++;
95                         bright = 0;
96                         contrast = 1;
97                         alpha = 1;
98                         sscanf(p, "%f %f %f", &bright, &contrast, &alpha);
99                 }
100                 mark_palette[i].r = r;
101                 mark_palette[i].g = g;
102                 mark_palette[i].b = b;
103                 mark_palette[i].bright = bright;
104                 mark_palette[i].contrast = contrast;
105                 mark_palette[i].alpha = alpha;
106         }
107         fclose(fp);
108         return 0;
109 }
110
111 /* save marked area, if any. return 0, if no pixle is marked and erase existing file */
112 int save_marked(unsigned char *img_mark_buffer, int width, int height, const char *filename)
113 {
114         char name[256];
115         int i, rc;
116         FILE *fp;
117
118         for (i = 0; i < width * height; i++) {
119                 if (img_mark_buffer[i])
120                         break;
121         }
122         sprintf(name, "%s_marked", filename);
123         if (i == width * height) {
124 //              printf("delete marked frame=%s\n", name);
125                 /* empty, so delete */
126                 unlink(name);
127
128                 return 0;
129         } else {
130 //              printf("save marked frame=%s\n", name);
131                 /* not empty, so save */
132                 fp = fopen(name, "w");
133                 if (!fp) {
134                         write_failed:
135                         printf("failed to save marked frame=%s\n", name);
136                         return -1;
137                 }
138                 rc = fwrite(img_mark_buffer, width * height, 1, fp);
139                 fclose(fp);
140                 if (rc != 1)
141                         goto write_failed;
142
143                 return 1;
144         }
145 }
146
147 int load_marked(unsigned char *img_mark_buffer, int width, int height, const char *filename)
148 {
149         char name[256];
150         FILE *fp;
151         int rc;
152
153         sprintf(name, "%s_marked", filename);
154 //      printf("load marked frame=%s\n", name);
155         fp = fopen(name, "r");
156         if (!fp) {
157                 read_failed:
158 //              printf("failed to load marked frame=%s\n", name);
159                 return -1;
160         }
161         rc = fread(img_mark_buffer, width * height, 1, fp);
162         fclose(fp);
163         if (rc != 1)
164                 goto read_failed;
165
166         return 0;
167 }
168
169 /* scale down mark map in mark_buffer */
170 void scale_mark(unsigned char *mark_buffer, int width, int height, int scale)
171 {
172         int w, h, i, j, x, y;
173         unsigned char c, temp;
174
175         if (scale == 1)
176                 return;
177
178         w = width / scale;
179         h = height / scale;
180
181         for (i = 0; i < h; i++) {
182                 for (j = 0; j < w; j++) {
183                         c = 0;
184                         /* always use one index other than 0, if there is any in an areaa to be shrinked */
185                         for (y = 0; y < scale; y++) {
186                                 for (x = 0; x < scale; x++) {
187                                         temp = mark_buffer[(i*scale+y) * width + j*scale+x];
188                                         if (temp)
189                                                 c = temp;
190                                 }
191                         }
192                         mark_buffer[i * w + j] = c;
193                 }
194         }
195 }
196