src/pngtile/main.c
author Tero Marttila <terom@fixme.fi>
Mon, 25 Jan 2010 04:00:37 +0200
changeset 77 29c57814204a
parent 74 7c8226668e87
child 85 bbc12563752a
permissions -rw-r--r--
update pngtile output
74
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include "shared/log.h"
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include "pngtile.h"
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
#include <getopt.h>
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
#include <stdio.h>
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
#include <stdbool.h>
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
/**
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
 * Command-line options
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
 */
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
static const struct option options[] = {
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    { "help",           false,  NULL,   'h' },
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    { "quiet",          false,  NULL,   'q' },
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    { "verbose",        false,  NULL,   'v' },
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
    { "debug",          false,  NULL,   'D' },
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    { "force-update",   false,  NULL,   'U' },
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    { "no-update",      false,  NULL,   'N' },
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
    { "background",     true,   NULL,   'B' },
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    { "width",          true,   NULL,   'W' },
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
    { "height",         true,   NULL,   'H' },
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
    { "x",              true,   NULL,   'x' },
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
    { "y",              true,   NULL,   'y' },
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    { "zoom",           true,   NULL,   'z' },
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
    { "threads",        true,   NULL,   'j' },
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
    { 0,                0,      0,      0   }
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
};
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
/**
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
 * Print usage/help info on stderr
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
 */
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
void help (const char *argv0)
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
{
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
    fprintf(stderr, "Usage: %s [options] <image> [...]\n", argv0);
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
    fprintf(stderr,
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
        "Open each of the given image files, check cache status, optionally update their cache, display image info, and\n"
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
        "optionally render a tile of each.\n"
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
        "\n"
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
        "\t-h, --help           show this help and exit\n"
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
        "\t-q, --quiet          supress informational output\n"
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
        "\t-v, --verbose        display more informational output\n"
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
        "\t-D, --debug          equivalent to -v\n"
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
        "\t-U, --force-update   unconditionally update image caches\n"
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
        "\t-N, --no-update      do not update the image cache\n"
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
        "\t-B, --background     set background pattern for sparse cache file: 0xHH..\n"
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
        "\t-W, --width          set tile width\n"
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
        "\t-H, --height         set tile height\n"
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
        "\t-x, --x              set tile x offset\n"
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
        "\t-y, --y              set tile z offset\n"
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
        "\t-z, --zoom           set zoom factor (<0)\n"
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
        "\t-j, --threads        number of threads\n"
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    );
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
}
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
int main (int argc, char **argv)
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
{
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
    int opt;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
    bool force_update = false, no_update = false;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    struct pt_tile_info ti = {0, 0, 0, 0, 0};
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
    struct pt_image_params update_params = { };
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
    int threads = 2;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
    int tmp, err;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
    
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
    // parse arguments
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    while ((opt = getopt_long(argc, argv, "hqvDUNB:W:H:x:y:z:j:", options, NULL)) != -1) {
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
        switch (opt) {
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
            case 'h':
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
                // display help
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
                help(argv[0]);
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
                
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
                return EXIT_SUCCESS;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
            case 'q':
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
                // supress excess log output
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
                set_log_level(LOG_WARN);
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
                break;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
            case 'v':
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
            case 'D':
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
                // display additional output
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
                set_log_level(LOG_DEBUG);
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
                break;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
            
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
            case 'U':
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
                // force update of image caches
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
                force_update = true;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
                
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
                break;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
            
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
            case 'N':
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
                // supress update of image caches
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
                no_update = true;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
                break;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
            case 'B':
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
                // background pattern
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
                {
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
                    unsigned int b1 = 0, b2 = 0, b3 = 0, b4 = 0;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
                    
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
                    // parse 0xXXXXXXXX
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
                    if (sscanf(optarg, "0x%02x%02x%02x%02x", &b1, &b2, &b3, &b4) < 1)
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
                        FATAL("Invalid hex value for -B/--background: %s", optarg);
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
                    
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
                    // store
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
                    update_params.background_color[0] = b1;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
                    update_params.background_color[1] = b2;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
                    update_params.background_color[2] = b3;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
                    update_params.background_color[3] = b4;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
                } break;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
            case 'W':
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
                ti.width = strtol(optarg, NULL, 0); break;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
            case 'H':
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
                ti.height = strtol(optarg, NULL, 0); break;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
            case 'x':
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
                ti.x = strtol(optarg, NULL, 0); break;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
            case 'y':
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
                ti.y = strtol(optarg, NULL, 0); break;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
            case 'z':
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
                ti.zoom = strtol(optarg, NULL, 0); break;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
            case 'j':
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
                if ((tmp = strtol(optarg, NULL, 0)) < 1)
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
                    FATAL("Invalid value for -j/--threads: %s", optarg);
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
                threads = tmp; break;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
            case '?':
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
                // useage error
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
                help(argv[0]);
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
                return EXIT_FAILURE;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
            default:
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
                // getopt???
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
                FATAL("getopt_long returned unknown code %d", opt);
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
        }
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
    }
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
    
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
    // end-of-arguments?
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
    if (!argv[optind])
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
        EXIT_WARN(EXIT_FAILURE, "No images given");
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
    
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
    struct pt_ctx *ctx = NULL;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
    struct pt_image *image = NULL;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
    enum pt_cache_status status;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
    // build ctx
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
    log_debug("Construct pt_ctx with %d threads", threads);
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
    if ((err = pt_ctx_new(&ctx, threads)))
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
        EXIT_ERROR(EXIT_FAILURE, "pt_ctx_new: threads=%d", threads);
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
    
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
    // process each image in turn
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
    log_debug("Processing %d images...", argc - optind);
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
    for (int i = optind; i < argc; i++) {
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
        const char *img_path = argv[i];
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
        log_debug("Loading image from: %s...", img_path);
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
        // open
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
        if ((err = pt_image_open(&image, ctx, img_path, PT_OPEN_UPDATE))) {
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
            log_errno("pt_image_open: %s: %s", img_path, pt_strerror(err));
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
            continue;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
        }
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
        log_info("Opened image at: %s", img_path);
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
        
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
        // check if stale
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
        if ((status = pt_image_status(image)) < 0) {
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
            log_errno("pt_image_status: %s: %s", img_path, pt_strerror(status));
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
            goto error;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
        }
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
        
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
        // update if stale
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
        if (status != PT_CACHE_FRESH || force_update) {
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
            if (status == PT_CACHE_NONE)
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
                log_debug("\tImage cache is missing");
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
            else if (status == PT_CACHE_STALE)
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
                log_debug("\tImage cache is stale");
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
            
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
            else if (status == PT_CACHE_INCOMPAT)
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
                log_debug("\tImage cache is incompatible");
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
            else if (status == PT_CACHE_FRESH)
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
                log_debug("\tImage cache is fresh");
77
29c57814204a update pngtile output
Tero Marttila <terom@fixme.fi>
parents: 74
diff changeset
   200
29c57814204a update pngtile output
Tero Marttila <terom@fixme.fi>
parents: 74
diff changeset
   201
            else
29c57814204a update pngtile output
Tero Marttila <terom@fixme.fi>
parents: 74
diff changeset
   202
                log_warn("\tImage cache status is unknown");
74
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
            
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
            if (!no_update) {
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
                log_debug("\tUpdating image cache...");
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
                if ((err = pt_image_update(image, &update_params))) {
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
                    log_warn_errno("pt_image_update: %s: %s", img_path, pt_strerror(err));
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
                }
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
                log_info("\tUpdated image cache");
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
            } else {
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
                log_warn("\tSupressing cache update");
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
            }
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
        } else {    
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
            log_debug("\tImage cache is fresh");
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
        }
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   220
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
        // show info
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
        const struct pt_image_info *info;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
        
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
        if ((err = pt_image_info(image, &info))) {
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
            log_warn_errno("pt_image_info: %s: %s", img_path, pt_strerror(err));
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   226
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
        } else {
77
29c57814204a update pngtile output
Tero Marttila <terom@fixme.fi>
parents: 74
diff changeset
   228
            log_info("\tImage dimensions: %zux%zu (%zu bpp)", info->img_width, info->img_height, info->img_bpp);
74
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
            log_info("\tImage mtime=%ld, bytes=%zu", (long) info->image_mtime, info->image_bytes);
77
29c57814204a update pngtile output
Tero Marttila <terom@fixme.fi>
parents: 74
diff changeset
   230
            log_info("\tCache mtime=%ld, bytes=%zu, blocks=%zu (%zu bytes), version=%d", 
29c57814204a update pngtile output
Tero Marttila <terom@fixme.fi>
parents: 74
diff changeset
   231
                    (long) info->cache_mtime, info->cache_bytes, info->cache_blocks, info->cache_blocks * 512, info->cache_version
74
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
            );
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   233
        }
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
        // render tile?
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   236
        if (ti.width && ti.height) {
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
            char tmp_name[] = "pt-tile-XXXXXX";
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   238
            int fd;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   239
            FILE *out;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
            
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
            // temporary file for output
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
            if ((fd = mkstemp(tmp_name)) < 0) {
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   243
                log_errno("mkstemp");
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   244
                
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   245
                continue;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   246
            }
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   247
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   248
            // open out
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   249
            if ((out = fdopen(fd, "w")) == NULL) {
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   250
                log_errno("fdopen");
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   252
                continue;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   253
            }
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   254
            
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   255
            // ensure it's loaded
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   256
            log_debug("\tLoad image cache...");
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   257
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   258
            if ((err = pt_image_load(image)))
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   259
                log_errno("pt_image_load: %s", pt_strerror(err));
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   260
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   261
            // render
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
            log_info("\tAsync render tile %zux%zu@(%zu,%zu) -> %s", ti.width, ti.height, ti.x, ti.y, tmp_name);
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   263
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   264
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   265
            if ((err = pt_image_tile_async(image, &ti, out)))
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   266
                log_errno("pt_image_tile: %s: %s", img_path, pt_strerror(err));
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   267
        }
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   268
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   269
error:
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   270
        // cleanup
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
        // XXX: leak because of async: pt_image_destroy(image);
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   272
        ;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   273
    }
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
    log_info("Waiting for images to finish...");
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   276
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   277
    // wait for tile operations to finish...
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   278
    pt_ctx_shutdown(ctx);
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   279
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   280
    log_info("Done");
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   281
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   282
    return 0;
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   283
}
7c8226668e87 rename util -> pngtile
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   284