Moved color model settings and optical flow settings to a single *_settings file
[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         fclose(fp);
31 }
32
33 /* load palette */
34 int load_palette(const char *filename)
35 {
36         char name[256];
37         char line[256],*p,*q;
38         FILE *fp;
39         int i;
40         int r, g, b;
41         float bright, contrast, alpha;
42
43         sprintf(name, "%s_palette", filename);
44 //      printf("loading palette '%s'\n", name);
45         fp = fopen(name, "r");
46         if (!fp) {
47                 printf("palette setting '%s' does not (yet) exists\n", name);
48                 return -1;
49         }
50         for (i = 0; ; i++) {
51                 if (!fgets(line, sizeof(line), fp))
52                         break;
53                 line[sizeof(line)-1] = '\0';
54                 if (line[0]) line[strlen(line)-1] = '\0';
55                 if (line[0] && line[strlen(line)-1] == '\r') line[strlen(line)-1] = '\0';
56
57                 /* read palette */
58                 if (i == 256)
59                         break;
60                 sscanf(line, "%d %d %d", &r, &g, &b);
61                 if (!(p = strchr(line, '\"')))
62                         continue;
63                 p++;
64                 strncpy(mark_palette[i].name, p, sizeof(mark_palette[i].name)-1);
65                 if ((q = strchr(mark_palette[i].name, '\"')))
66                         *q = '\0';
67                 if ((p = strchr(p, '\"'))) {
68                         p++;
69                         bright = 0;
70                         contrast = 1;
71                         alpha = 1;
72                         sscanf(p, "%f %f %f", &bright, &contrast, &alpha);
73                 }
74                 mark_palette[i].r = r;
75                 mark_palette[i].g = g;
76                 mark_palette[i].b = b;
77                 mark_palette[i].bright = bright;
78                 mark_palette[i].contrast = contrast;
79                 mark_palette[i].alpha = alpha;
80         }
81         fclose(fp);
82         return 0;
83 }
84
85 /* save marked area, if any. return 0, if no pixle is marked and erase existing file */
86 int save_marked(unsigned char *img_mark_buffer, int width, int height, const char *filename)
87 {
88         char name[256];
89         int i, rc;
90         FILE *fp;
91
92         for (i = 0; i < width * height; i++) {
93                 if (img_mark_buffer[i])
94                         break;
95         }
96         sprintf(name, "%s_marked", filename);
97         if (i == width * height) {
98 //              printf("delete marked frame=%s\n", name);
99                 /* empty, so delete */
100                 unlink(name);
101
102                 return 0;
103         } else {
104 //              printf("save marked frame=%s\n", name);
105                 /* not empty, so save */
106                 fp = fopen(name, "w");
107                 if (!fp) {
108                         write_failed:
109                         printf("failed to save marked frame=%s\n", name);
110                         return -1;
111                 }
112                 rc = fwrite(img_mark_buffer, width * height, 1, fp);
113                 fclose(fp);
114                 if (rc != 1)
115                         goto write_failed;
116
117                 return 1;
118         }
119 }
120
121 int load_marked(unsigned char *img_mark_buffer, int width, int height, const char *filename)
122 {
123         char name[256];
124         FILE *fp;
125         int rc;
126
127         sprintf(name, "%s_marked", filename);
128 //      printf("load marked frame=%s\n", name);
129         fp = fopen(name, "r");
130         if (!fp) {
131                 read_failed:
132 //              printf("failed to load marked frame=%s\n", name);
133                 return -1;
134         }
135         rc = fread(img_mark_buffer, width * height, 1, fp);
136         fclose(fp);
137         if (rc != 1)
138                 goto read_failed;
139
140         return 0;
141 }
142
143 /* scale down mark map in mark_buffer */
144 void scale_mark(unsigned char *mark_buffer, int width, int height, int scale)
145 {
146         int w, h, i, j, x, y;
147         unsigned char c, temp;
148
149         if (scale == 1)
150                 return;
151
152         w = width / scale;
153         h = height / scale;
154
155         for (i = 0; i < h; i++) {
156                 for (j = 0; j < w; j++) {
157                         c = 0;
158                         /* always use one index other than 0, if there is any in an areaa to be shrinked */
159                         for (y = 0; y < scale; y++) {
160                                 for (x = 0; x < scale; x++) {
161                                         temp = mark_buffer[(i*scale+y) * width + j*scale+x];
162                                         if (temp)
163                                                 c = temp;
164                                 }
165                         }
166                         mark_buffer[i * w + j] = c;
167                 }
168         }
169 }
170