src/lib/tile.c
author Tero Marttila <terom@qmsk.net>
Mon, 03 Jul 2017 23:15:14 +0300
changeset 177 b2768f3982f3
parent 86 d4a62899587f
permissions -rw-r--r--
src/lib: include string.h
18
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include "tile.h"
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include "error.h"
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include "shared/log.h" // only FATAL
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
#include <stdlib.h>
177
b2768f3982f3 src/lib: include string.h
Tero Marttila <terom@qmsk.net>
parents: 86
diff changeset
     6
#include <string.h>
56
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
     7
#include <assert.h>
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
     8
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
     9
int pt_tile_mem_write (struct pt_tile_mem *buf, void *data, size_t len)
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    10
{
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    11
    size_t buf_len = buf->len;
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    12
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    13
    // grow?
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    14
    while (buf->off + len > buf_len)
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    15
        buf_len *= 2;
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    16
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    17
    if (buf_len != buf->len) {
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    18
        char *tmp;
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    19
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    20
        if ((tmp = realloc(buf->base, buf_len)) == NULL)
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    21
            RETURN_ERROR(PT_ERR_MEM);
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    22
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    23
        buf->base = tmp;
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    24
        buf->len = buf_len;
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    25
    }
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    26
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    27
    // copy
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    28
    memcpy(buf->base + buf->off, data, len);
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    29
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    30
    buf->off += len;
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    31
    
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    32
    return 0;
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    33
}
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    34
18
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
19
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    36
int pt_tile_new (struct pt_tile **tile_ptr)
18
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
{
19
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    38
    struct pt_tile *tile;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    39
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    40
    if ((tile = calloc(1, sizeof(*tile))) == NULL)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    41
        return -PT_ERR_MEM;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    42
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    43
    *tile_ptr = tile;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    44
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    45
    return 0;
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    46
}
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    47
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    48
static void pt_tile_init (struct pt_tile *tile, struct pt_cache *cache, const struct pt_tile_info *info, enum pt_tile_output out_type)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    49
{
18
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    // init
19
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    51
    tile->cache = cache;
18
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    tile->info = *info;
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
    tile->out_type = out_type;
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
}
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
19
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    56
int pt_tile_init_file (struct pt_tile *tile, struct pt_cache *cache, const struct pt_tile_info *info, FILE *out)
18
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
{
19
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    58
    pt_tile_init(tile, cache, info, PT_TILE_OUT_FILE);
18
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
    tile->out.file = out;
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
    return 0;
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
}
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
19
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    65
int pt_tile_init_mem (struct pt_tile *tile, struct pt_cache *cache, const struct pt_tile_info *info)
18
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
{
19
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    67
    pt_tile_init(tile, cache, info, PT_TILE_OUT_MEM);
18
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
    
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
    // init buffer
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
    if ((tile->out.mem.base = malloc(PT_TILE_BUF_SIZE)) == NULL)
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
        RETURN_ERROR(PT_ERR_MEM);
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
    tile->out.mem.len = PT_TILE_BUF_SIZE;
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
    tile->out.mem.off = 0;
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
    return 0;
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
}
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
19
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
    80
int pt_tile_render (struct pt_tile *tile)
18
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
{
86
d4a62899587f PT_ERR_TILE_DIM and PT_ERR_TILE_ZOOM
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
    82
    // validate dimensions
d4a62899587f PT_ERR_TILE_DIM and PT_ERR_TILE_ZOOM
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
    83
    if (!tile->info.width || !tile->info.height)
d4a62899587f PT_ERR_TILE_DIM and PT_ERR_TILE_ZOOM
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
    84
        RETURN_ERROR(PT_ERR_TILE_DIM);
d4a62899587f PT_ERR_TILE_DIM and PT_ERR_TILE_ZOOM
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
    85
56
d5e3089906da major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    86
    return pt_cache_tile(tile->cache, tile);
18
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
}
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
void pt_tile_abort (struct pt_tile *tile)
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
{
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
    // cleanup
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
    switch (tile->out_type) {
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
        case PT_TILE_OUT_FILE:
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
            // no-op
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
            break;
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
        case PT_TILE_OUT_MEM:
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
            // drop buffer
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
            free(tile->out.mem.base);
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
            break;
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
    }
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
}
f92a24ab046e add missing lib/tile.*
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
19
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   105
void pt_tile_destroy (struct pt_tile *tile)
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   106
{
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   107
    pt_tile_abort(tile);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   108
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   109
    free(tile);
ebcc49de97d0 implement pt_ctx threadpool and pt_image_tile_async
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   110
}
21
Tero Marttila <terom@fixme.fi>
parents: 19
diff changeset
   111