File: webp.c

package info (click to toggle)
links2 2.29-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 27,852 kB
  • sloc: ansic: 181,859; sh: 2,585; cpp: 1,450; makefile: 84; awk: 49; perl: 34
file content (83 lines) | stat: -rw-r--r-- 1,720 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include "cfg.h"

#ifdef G
#include "links.h"

#ifdef HAVE_WEBP

#include <webp/decode.h>

struct webp_decoder {
	unsigned char *buffer;
	int len;
};

static void webp_free(unsigned char *ptr)
{
#ifdef HAVE_WEBPFREE
	WebPFree(ptr);
#else
	free(ptr);
#endif
}

void webp_start(struct cached_image *cimg)
{
	struct webp_decoder *deco;
	deco = mem_alloc(sizeof(struct webp_decoder));
	deco->buffer = init_str();
	deco->len = 0;
	cimg->decoder = deco;
}

void webp_restart(struct cached_image *cimg, unsigned char *data, int length)
{
	struct webp_decoder *deco = (struct webp_decoder *)cimg->decoder;
	add_bytes_to_str(&deco->buffer, &deco->len, data, length);
}

void webp_finish(struct cached_image *cimg)
{
	int w, h;
	struct webp_decoder *deco = (struct webp_decoder *)cimg->decoder;
	unsigned char *pixels;
	pixels = WebPDecodeRGBA(deco->buffer, deco->len, &w, &h);
	if (!pixels)
		goto end;

	cimg->width = w;
	cimg->height = h;
	cimg->buffer_bytes_per_pixel = 4;
	cimg->red_gamma = cimg->green_gamma = cimg->blue_gamma = (float)sRGB_gamma;
	cimg->strip_optimized = 0;
	if (header_dimensions_known(cimg))
		goto end_free_pixels;

	memcpy(cimg->buffer, pixels, w * h * 4);
end_free_pixels:
	webp_free(pixels);
end:
	img_end(cimg);
}

void webp_destroy_decoder(struct cached_image *cimg)
{
	struct webp_decoder *deco = (struct webp_decoder *)cimg->decoder;
	mem_free(deco->buffer);
}

void add_webp_version(unsigned char **s, int *l)
{
	int v = WebPGetDecoderVersion();
	add_to_str(s, l, cast_uchar "WEBP (");
	add_num_to_str(s, l, (v >> 16));
	add_chr_to_str(s, l, '.');
	add_num_to_str(s, l, (v >> 8) & 0xff);
	add_chr_to_str(s, l, '.');
	add_num_to_str(s, l, v & 0xff);
	add_chr_to_str(s, l, ')');
}

#endif

#endif