author | Tero Marttila <terom@qmsk.net> |
Mon, 03 Jul 2017 23:15:14 +0300 | |
changeset 177 | b2768f3982f3 |
parent 86 | d4a62899587f |
permissions | -rw-r--r-- |
18 | 1 |
#include "tile.h" |
2 |
#include "error.h" |
|
3 |
#include "shared/log.h" // only FATAL |
|
4 |
||
5 |
#include <stdlib.h> |
|
177 | 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 | 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 | 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 | 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 | 52 |
tile->info = *info; |
53 |
tile->out_type = out_type; |
|
54 |
} |
|
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 | 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 | 59 |
|
60 |
tile->out.file = out; |
|
61 |
||
62 |
return 0; |
|
63 |
} |
|
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 | 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 | 68 |
|
69 |
// init buffer |
|
70 |
if ((tile->out.mem.base = malloc(PT_TILE_BUF_SIZE)) == NULL) |
|
71 |
RETURN_ERROR(PT_ERR_MEM); |
|
72 |
||
73 |
tile->out.mem.len = PT_TILE_BUF_SIZE; |
|
74 |
tile->out.mem.off = 0; |
|
75 |
||
76 |
return 0; |
|
77 |
} |
|
78 |
||
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 | 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 | 87 |
} |
88 |
||
89 |
void pt_tile_abort (struct pt_tile *tile) |
|
90 |
{ |
|
91 |
// cleanup |
|
92 |
switch (tile->out_type) { |
|
93 |
case PT_TILE_OUT_FILE: |
|
94 |
// no-op |
|
95 |
break; |
|
96 |
||
97 |
case PT_TILE_OUT_MEM: |
|
98 |
// drop buffer |
|
99 |
free(tile->out.mem.base); |
|
100 |
||
101 |
break; |
|
102 |
} |
|
103 |
} |
|
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 | 111 |