1d0b29ecc27f3a08882fca3c52b1ce6681690b9a
[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\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);
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         fclose(fp);
34 }
35
36 /* load palette */
37 int load_palette(const char *filename)
38 {
39         char name[256];
40         char line[256],*p,*q;
41         FILE *fp;
42         int i;
43         int r, g, b;
44         float bright = 0, contrast = 1;
45
46         sprintf(name, "%s_palette", filename);
47 //      printf("loading palette '%s'\n", name);
48         fp = fopen(name, "r");
49         if (!fp) {
50                 printf("palette setting '%s' does not (yet) exists\n", name);
51                 return -1;
52         }
53         for (i = 0; ; i++) {
54                 if (!fgets(line, sizeof(line), fp))
55                         break;
56                 line[sizeof(line)-1] = '\0';
57                 if (line[0]) line[strlen(line)-1] = '\0';
58                 if (line[0] && line[strlen(line)-1] == '\r') line[strlen(line)-1] = '\0';
59
60                 /* check for special attrs */
61                 if (!strncmp(line, "blacklevel ", 11)) {
62                         p = line + 11;
63                         sscanf(p, "%lf", &black_level);
64                         continue;
65                 }
66                 if (!strncmp(line, "whitelevel ", 11)) {
67                         p = line + 11;
68                         sscanf(p, "%lf", &white_level);
69                         continue;
70                 }
71                 if (!strncmp(line, "fadelevel ", 10)) {
72                         p = line + 11;
73                         sscanf(p, "%lf", &fade_level);
74                         continue;
75                 }
76
77                 /* read palette */
78                 if (i == 256)
79                         break;
80                 sscanf(line, "%d %d %d", &r, &g, &b);
81                 if (!(p = strchr(line, '\"')))
82                         continue;
83                 p++;
84                 strcpy(mark_palette[i].name, p);
85                 if ((q = strchr(mark_palette[i].name, '\"')))
86                         *q = '\0';
87                 if ((p = strchr(p, '\"'))) {
88                         p++;
89                         sscanf(p, "%f %f", &bright, &contrast);
90                 }
91                 mark_palette[i].r = r;
92                 mark_palette[i].g = g;
93                 mark_palette[i].b = b;
94                 mark_palette[i].bright = bright;
95                 mark_palette[i].contrast = contrast;
96         }
97         fclose(fp);
98         return 0;
99 }
100
101 /* save marked area, if any. return 0, if no pixle is marked and erase existing file */
102 int save_marked(unsigned char *img_mark_buffer, int width, int height, const char *filename)
103 {
104         char name[256];
105         int i, rc;
106         FILE *fp;
107
108         for (i = 0; i < width * height; i++) {
109                 if (img_mark_buffer[i])
110                         break;
111         }
112         sprintf(name, "%s_marked", filename);
113         if (i == width * height) {
114 //              printf("delete marked frame=%s\n", name);
115                 /* empty, so delete */
116                 unlink(name);
117
118                 return 0;
119         } else {
120 //              printf("save marked frame=%s\n", name);
121                 /* not empty, so save */
122                 fp = fopen(name, "w");
123                 if (!fp) {
124                         write_failed:
125                         printf("failed to save marked frame=%s\n", name);
126                         return -1;
127                 }
128                 rc = fwrite(img_mark_buffer, width * height, 1, fp);
129                 fclose(fp);
130                 if (rc != 1)
131                         goto write_failed;
132
133                 return 1;
134         }
135 }
136
137 int load_marked(unsigned char *img_mark_buffer, int width, int height, const char *filename)
138 {
139         char name[256];
140         FILE *fp;
141         int rc;
142
143         sprintf(name, "%s_marked", filename);
144 //      printf("load marked frame=%s\n", name);
145         fp = fopen(name, "r");
146         if (!fp) {
147                 read_failed:
148 //              printf("failed to load marked frame=%s\n", name);
149                 return -1;
150         }
151         rc = fread(img_mark_buffer, width * height, 1, fp);
152         fclose(fp);
153         if (rc != 1)
154                 goto read_failed;
155
156         return 0;
157 }
158