30#include <webp/decode.h>
32static const char*
const kStatusMessages[] = {
33 "OK",
"OUT_OF_MEMORY",
"INVALID_PARAM",
"BITSTREAM_ERROR",
34 "UNSUPPORTED_FEATURE",
"SUSPENDED",
"USER_ABORT",
"NOT_ENOUGH_DATA"
43 cairo_surface_destroy(us->
data);
46static cairo_surface_t* webp_really_loadimage(
const char *in_file, FILE*
const in)
48 WebPDecoderConfig config;
49 WebPDecBuffer*
const output_buffer = &config.output;
50 WebPBitstreamFeatures*
const bitstream = &config.input;
51 VP8StatusCode status = VP8_STATUS_OK;
52 cairo_surface_t *surface =
NULL;
56 if (!WebPInitDecoderConfig(&config)) {
57 fprintf(stderr,
"Error: WebP library version mismatch!\n");
61 const int64_t data_size = fseek(
in, 0, SEEK_END) < 0 ? -1 :
gv_ftell(
in);
62 if (data_size < 0 || fseek(
in, 0, SEEK_SET) < 0) {
63 fprintf(stderr,
"Error: WebP could not read %s\n", in_file);
66 data =
malloc((
size_t)data_size);
67 ok = data_size == 0 || (data !=
NULL && fread(data, (
size_t)data_size, 1,
in) == 1);
69 fprintf(stderr,
"Error: WebP could not read %" PRId64
70 " bytes of data from %s\n", data_size, in_file);
75 status = WebPGetFeatures(data, (
size_t)data_size, bitstream);
76 if (status != VP8_STATUS_OK) {
80 output_buffer->colorspace = MODE_RGBA;
81 status = WebPDecode(data, (
size_t)data_size, &config);
84 if (! bitstream->has_alpha) {
85 assert(output_buffer->width >= 0);
86 assert(output_buffer->height >= 0);
87 argb2rgba((
size_t)output_buffer->width, (
size_t)output_buffer->height,
88 output_buffer->u.RGBA.rgba);
93 ok = status == VP8_STATUS_OK;
95 fprintf(stderr,
"Error: WebP decoding of %s failed.\n", in_file);
96 fprintf(stderr,
"Status: %d (%s)\n", status, kStatusMessages[status]);
100 surface = cairo_image_surface_create_for_data (
101 output_buffer->u.RGBA.rgba,
103 output_buffer->width,
104 output_buffer->height,
105 output_buffer->u.RGBA.stride);
111static cairo_surface_t *webp_loadimage(
usershape_t *us) {
112 cairo_surface_t *surface =
NULL;
131 if ((surface = webp_really_loadimage(us->
name, us->
f)))
132 cairo_surface_reference(surface);
152 cairo_surface_t *surface;
154 surface = webp_loadimage(us);
157 cairo_translate(cr, b.
LL.
x, -b.
UR.
y);
158 cairo_scale(cr, (b.
UR.
x - b.
LL.
x) / us->
w, (b.
UR.
y - b.
LL.
y) / us->
h);
159 cairo_set_source_surface (cr, surface, 0, 0);
173#ifdef HAVE_PANGOCAIRO
174 {FORMAT_WEBP_CAIRO,
"webp:cairo", 1, &engine_webp,
NULL},
static int in(Extype_t lhs, Exid_t *rhs, Exdisc_t *disc)
void gvusershape_file_release(usershape_t *us)
bool gvusershape_file_access(usershape_t *us)
static int64_t gv_ftell(FILE *stream)
ftell, accounting for platform limitations
Arithmetic helper functions.
static void argb2rgba(size_t width, size_t height, unsigned char *data)
gvplugin_installed_t gvloadimage_webp_types[]
void(* datafree)(usershape_t *us)