source: subversion/applications/utils/mod_tile/convert_meta.c @ 13240

Last change on this file since 13240 was 13126, checked in by jonb, 11 years ago

Applied MacOSX compile fixes from Artem with a few modifications

File size: 4.6 KB
Line 
1#define _GNU_SOURCE
2
3#include <stdio.h>
4#include <stdlib.h>
5#include <unistd.h>
6#include <sys/types.h>
7#include <sys/socket.h>
8#include <sys/stat.h>
9#include <sys/time.h>
10#include <sys/un.h>
11#include <poll.h>
12#include <errno.h>
13#include <math.h>
14#include <getopt.h>
15#include <time.h>
16#include <sys/types.h>
17#include <dirent.h>
18#include <assert.h>
19#include <fcntl.h>
20#include <limits.h>
21#include <string.h>
22#include "render_config.h"
23#include "dir_utils.h"
24#include "store.h"
25
26#ifndef METATILE
27#warning("convert_meta not implemented for non-metatile mode. Feel free to submit fix")
28int main(int argc, char **argv)
29{
30    fprintf(stderr, "convert_meta not implemented for non-metatile mode. Feel free to submit fix!\n");
31    return -1;
32}
33#else
34
35static int minZoom = 0;
36static int maxZoom = 18;
37static int verbose = 0;
38static int num_render = 0, num_all = 0;
39static struct timeval start, end;
40static int unpack;
41
42void display_rate(struct timeval start, struct timeval end, int num) 
43{
44    int d_s, d_us;
45    float sec;
46
47    d_s  = end.tv_sec  - start.tv_sec;
48    d_us = end.tv_usec - start.tv_usec;
49
50    sec = d_s + d_us / 1000000.0;
51
52    printf("Converted %d tiles in %.2f seconds (%.2f tiles/s)\n", num, sec, num / sec);
53    fflush(NULL);
54}
55
56static void descend(const char *search)
57{
58    DIR *tiles = opendir(search);
59    struct dirent *entry;
60    char path[PATH_MAX];
61
62    if (!tiles) {
63        //fprintf(stderr, "Unable to open directory: %s\n", search);
64        return;
65    }
66
67    while ((entry = readdir(tiles))) {
68        struct stat b;
69        char *p;
70
71        //check_load();
72
73        if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, ".."))
74            continue;
75        snprintf(path, sizeof(path), "%s/%s", search, entry->d_name);
76        if (stat(path, &b))
77            continue;
78        if (S_ISDIR(b.st_mode)) {
79            descend(path);
80            continue;
81        }
82        p = strrchr(path, '.');
83        if (p) {
84            if (unpack) {
85                if (!strcmp(p, ".meta")) 
86                    process_unpack(path);
87            } else {
88                if (!strcmp(p, ".png")) 
89                  process_pack(path);
90            }
91        }
92    }
93    closedir(tiles);
94}
95
96
97int main(int argc, char **argv)
98{
99    int z, c;
100
101    while (1) {
102        int option_index = 0;
103        static struct option long_options[] = {
104            {"min-zoom", 1, 0, 'z'},
105            {"max-zoom", 1, 0, 'Z'},
106            {"unpack", 0, 0, 'u'},
107            {"verbose", 0, 0, 'v'},
108            {"help", 0, 0, 'h'},
109            {0, 0, 0, 0}
110        };
111
112        c = getopt_long(argc, argv, "uhvz:Z:", long_options, &option_index);
113        if (c == -1)
114            break;
115
116        switch (c) {
117            case 'z':
118                minZoom=atoi(optarg);
119                if (minZoom < 0 || minZoom > 18) {
120                    fprintf(stderr, "Invalid minimum zoom selected, must be between 0 and 18\n");
121                    return 1;
122                }
123                break;
124            case 'Z':
125                maxZoom=atoi(optarg);
126                if (maxZoom < 0 || maxZoom > 18) {
127                    fprintf(stderr, "Invalid maximum zoom selected, must be between 0 and 18\n");
128                    return 1;
129                }
130                break;
131            case 'u':
132                unpack=1;
133                break;
134            case 'v':
135                verbose=1;
136                break;
137            case 'h':
138                fprintf(stderr, "Convert the rendered PNGs into the more efficient .meta format\n");
139                fprintf(stderr, "\t-u|--unpack\tUnpack the .meta files back to PNGs\n");
140                fprintf(stderr, "\t-z|--min-zoom\tonly process tiles greater or equal this zoom level (default 0)\n");
141                fprintf(stderr, "\t-Z|--max-zoom\tonly process tiles less than or equal to this zoom level (default 18)\n");
142                return -1;
143            default:
144                fprintf(stderr, "unhandled char '%c'\n", c);
145                break;
146        }
147    }
148
149    if (maxZoom < minZoom) {
150        fprintf(stderr, "Invalid zoom range, max zoom must be greater or equal to minimum zoom\n");
151        return 1;
152    }
153
154    fprintf(stderr, "Converting tiles\n");
155
156    gettimeofday(&start, NULL);
157
158    for (z=minZoom; z<=maxZoom; z++) {
159        char path[PATH_MAX];
160        snprintf(path, PATH_MAX, HASH_PATH "/%d", z);
161        descend(path);
162    }
163
164    gettimeofday(&end, NULL);
165    printf("\nTotal for all tiles converted\n");
166    printf("Meta tiles converted: ");
167    display_rate(start, end, num_render);
168    printf("Total tiles converted: ");
169    display_rate(start, end, num_render * METATILE * METATILE);
170    printf("Total tiles handled: ");
171    display_rate(start, end, num_all);
172
173    return 0;
174}
175#endif
Note: See TracBrowser for help on using the repository browser.