libdragon
asset_internal.h
1#ifndef __LIBDRAGON_ASSET_INTERNAL_H
2#define __LIBDRAGON_ASSET_INTERNAL_H
3
4#include <stdint.h>
5#include <stdio.h>
6
7#define ASSET_MAGIC "DCA"
8#define ASSET_FLAG_WINSIZE_MASK 0x0007
9#define ASSET_FLAG_WINSIZE_16K 0x0000
10#define ASSET_FLAG_WINSIZE_8K 0x0001
11#define ASSET_FLAG_WINSIZE_4K 0x0002
12#define ASSET_FLAG_WINSIZE_2K 0x0003
13#define ASSET_FLAG_WINSIZE_32K 0x0004
14#define ASSET_FLAG_WINSIZE_64K 0x0005
15#define ASSET_FLAG_WINSIZE_128K 0x0006
16#define ASSET_FLAG_WINSIZE_256K 0x0007
17#define ASSET_FLAG_INPLACE 0x0100
18#define ASSET_ALIGNMENT 32
19
20__attribute__((used))
21static inline int asset_winsize_from_flags(uint16_t flags) {
22 flags &= ASSET_FLAG_WINSIZE_MASK;
23 if (flags & 4)
24 return (2*1024) << flags;
25 else
26 return (16*1024) >> flags;
27}
28
29__attribute__((used))
30static int asset_winsize_to_flags(int winsize) {
31 if (winsize == 16*1024) return ASSET_FLAG_WINSIZE_16K;
32 if (winsize == 8*1024) return ASSET_FLAG_WINSIZE_8K;
33 if (winsize == 4*1024) return ASSET_FLAG_WINSIZE_4K;
34 if (winsize == 2*1024) return ASSET_FLAG_WINSIZE_2K;
35 if (winsize == 32*1024) return ASSET_FLAG_WINSIZE_32K;
36 if (winsize == 64*1024) return ASSET_FLAG_WINSIZE_64K;
37 if (winsize == 128*1024) return ASSET_FLAG_WINSIZE_128K;
38 if (winsize == 256*1024) return ASSET_FLAG_WINSIZE_256K;
39 return -1;
40}
41
43typedef struct {
44 char magic[3];
45 uint8_t version;
46 uint16_t algo;
47 uint16_t flags;
48 uint32_t cmp_size;
49 uint32_t orig_size;
50 uint32_t inplace_margin;
52
53_Static_assert(sizeof(asset_header_t) == 20, "invalid sizeof(asset_header_t)");
54
56typedef struct {
58
60 void (*decompress_init)(void *state, FILE *fp, int winsize);
61
63 ssize_t (*decompress_read)(void *state, void *buf, size_t len);
64
66 void (*decompress_reset)(void *state);
67
69 void* (*decompress_full)(const char *fn, FILE *fp, size_t cmp_size, size_t len);
70
72 int (*decompress_full_inplace)(const uint8_t *in, size_t cmp_size, uint8_t *out, size_t len);
74
75
76FILE *must_fopen(const char *fn);
77
78#endif
A decompression algorithm used by the asset library.
Definition: asset_internal.h:56
int state_size
Basic size of the decompression state (without ringbuffer)
Definition: asset_internal.h:57
Header of a compressed asset.
Definition: asset_internal.h:43
uint16_t flags
Flags.
Definition: asset_internal.h:47
uint32_t orig_size
Original size in bytes.
Definition: asset_internal.h:49
uint8_t version
Version of the asset header.
Definition: asset_internal.h:45
uint32_t inplace_margin
Margin for in-place decompression.
Definition: asset_internal.h:50
uint16_t algo
Compression algorithm.
Definition: asset_internal.h:46
uint32_t cmp_size
Compressed size in bytes.
Definition: asset_internal.h:48