author | Tero Marttila <terom@fixme.fi> |
Mon, 25 Jan 2010 04:34:02 +0200 | |
changeset 88 | 5cc2d044d368 |
parent 72 | c3f8502cfd97 |
permissions | -rw-r--r-- |
0 | 1 |
#ifndef PNGTILE_CACHE_H |
2 |
#define PNGTILE_CACHE_H |
|
3 |
||
4 |
/** |
|
5 |
* @file |
|
6 |
* |
|
7 |
* Internal image cache implementation |
|
8 |
*/ |
|
9 |
#include "image.h" |
|
56
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
10 |
#include "png.h" |
0 | 11 |
|
1
f3cde3db1fef
basic image/cache code compiles
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
12 |
#include <stdint.h> |
f3cde3db1fef
basic image/cache code compiles
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
13 |
#include <stdbool.h> |
f3cde3db1fef
basic image/cache code compiles
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
14 |
|
56
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
15 |
/** |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
16 |
* Cache format version |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
17 |
*/ |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
18 |
#define PT_CACHE_VERSION 2 |
1
f3cde3db1fef
basic image/cache code compiles
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
19 |
|
0 | 20 |
/** |
56
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
21 |
* Size used to store the cache header |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
22 |
*/ |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
23 |
#define PT_CACHE_HEADER_SIZE 4096 |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
24 |
|
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
25 |
/** |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
26 |
* On-disk header |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
27 |
*/ |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
28 |
struct pt_cache_header { |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
29 |
/** Set to PT_CACHE_VERSION */ |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
30 |
uint16_t version; |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
31 |
|
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
32 |
/** Image format */ |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
33 |
enum pt_img_format { |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
34 |
PT_IMG_PNG, ///< @see pt_png |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
35 |
} format; |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
36 |
|
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
37 |
/** Data header by format */ |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
38 |
union { |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
39 |
struct pt_png_header png; |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
40 |
}; |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
41 |
|
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
42 |
/** Parameters used */ |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
43 |
struct pt_image_params params; |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
44 |
|
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
45 |
/** Size of the data segment */ |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
46 |
size_t data_size; |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
47 |
}; |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
48 |
|
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
49 |
/** |
72 | 50 |
* On-disk data format. This struct is always exactly PT_CACHE_HEADER_SIZE long |
56
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
51 |
*/ |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
52 |
struct pt_cache_file { |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
53 |
/** Header */ |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
54 |
struct pt_cache_header header; |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
55 |
|
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
56 |
/** Padding for data */ |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
57 |
uint8_t padding[PT_CACHE_HEADER_SIZE - sizeof(struct pt_cache_header)]; |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
58 |
|
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
59 |
/** Data follows, header.data_size bytes */ |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
60 |
uint8_t data[]; |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
61 |
}; |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
62 |
|
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
63 |
/** |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
64 |
* Cache state |
0 | 65 |
*/ |
66 |
struct pt_cache { |
|
1
f3cde3db1fef
basic image/cache code compiles
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
67 |
/** Filesystem path to cache file */ |
f3cde3db1fef
basic image/cache code compiles
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
68 |
char *path; |
0 | 69 |
|
1
f3cde3db1fef
basic image/cache code compiles
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
70 |
/** The mode we are operating in, bitmask of PT_IMG_* */ |
f3cde3db1fef
basic image/cache code compiles
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
71 |
int mode; |
f3cde3db1fef
basic image/cache code compiles
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
72 |
|
f3cde3db1fef
basic image/cache code compiles
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
73 |
/** Opened file */ |
f3cde3db1fef
basic image/cache code compiles
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
74 |
int fd; |
f3cde3db1fef
basic image/cache code compiles
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
75 |
|
7
997906f5fd2d
mmap header, implement pt_image_info (post-update)
Tero Marttila <terom@fixme.fi>
parents:
6
diff
changeset
|
76 |
/** Size of the data segment in bytes, starting at PT_CACHE_HEADER_SIZE */ |
56
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
77 |
size_t data_size; |
1
f3cde3db1fef
basic image/cache code compiles
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
78 |
|
56
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
79 |
/** The mmap'd file */ |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
80 |
struct pt_cache_file *file; |
0 | 81 |
}; |
82 |
||
83 |
/** |
|
84 |
* Construct the image cache info object associated with the given image. |
|
85 |
*/ |
|
9 | 86 |
int pt_cache_new (struct pt_cache **cache_ptr, const char *path, int mode); |
0 | 87 |
|
88 |
/** |
|
8 | 89 |
* Verify if the cached data eixsts, or has become stale compared to the given original file. |
90 |
* |
|
91 |
* @return one of pt_cache_status; <0 on error, 0 if fresh, >0 otherwise |
|
0 | 92 |
*/ |
8 | 93 |
int pt_cache_status (struct pt_cache *cache, const char *img_path); |
0 | 94 |
|
95 |
/** |
|
56
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
96 |
* Get info for the cached image. |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
97 |
* |
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
98 |
* Does not open it if not yet opened. |
10
6806a90d934f
make pt_cache_open no-op if already open, pt_image_info -> pt_cache_info
Tero Marttila <terom@fixme.fi>
parents:
9
diff
changeset
|
99 |
*/ |
56
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
100 |
void pt_cache_info (struct pt_cache *cache, struct pt_image_info *info); |
10
6806a90d934f
make pt_cache_open no-op if already open, pt_image_info -> pt_cache_info
Tero Marttila <terom@fixme.fi>
parents:
9
diff
changeset
|
101 |
|
6806a90d934f
make pt_cache_open no-op if already open, pt_image_info -> pt_cache_info
Tero Marttila <terom@fixme.fi>
parents:
9
diff
changeset
|
102 |
/** |
56
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
103 |
* Update the cache data from the given image data |
0 | 104 |
*/ |
56
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
105 |
int pt_cache_update (struct pt_cache *cache, struct pt_png_img *img, const struct pt_image_params *params); |
0 | 106 |
|
1
f3cde3db1fef
basic image/cache code compiles
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
107 |
/** |
10
6806a90d934f
make pt_cache_open no-op if already open, pt_image_info -> pt_cache_info
Tero Marttila <terom@fixme.fi>
parents:
9
diff
changeset
|
108 |
* Open the existing .cache for use. If already opened, does nothing. |
9 | 109 |
*/ |
110 |
int pt_cache_open (struct pt_cache *cache); |
|
111 |
||
112 |
/** |
|
56
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
113 |
* Render out the given tile |
9 | 114 |
* |
115 |
* If the cache is not yet open, this will open it |
|
116 |
*/ |
|
56
d5e3089906da
major refactoring of pt_cache, split off all PNG processing into pt_png
Tero Marttila <terom@fixme.fi>
parents:
52
diff
changeset
|
117 |
int pt_cache_tile (struct pt_cache *cache, struct pt_tile *tile); |
9 | 118 |
|
119 |
/** |
|
59 | 120 |
* Close the cache, if opened |
121 |
*/ |
|
122 |
int pt_cache_close (struct pt_cache *cache); |
|
123 |
||
124 |
/** |
|
1
f3cde3db1fef
basic image/cache code compiles
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
125 |
* Release all resources associated with the given cache object without any cleanup. |
f3cde3db1fef
basic image/cache code compiles
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
126 |
*/ |
f3cde3db1fef
basic image/cache code compiles
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
127 |
void pt_cache_destroy (struct pt_cache *cache); |
f3cde3db1fef
basic image/cache code compiles
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
128 |
|
0 | 129 |
#endif |