24#include <webp/decode.h>
27 #pragma comment( lib, "gvc.lib" )
28 #pragma comment( lib, "glib-2.0.lib" )
29 #pragma comment( lib, "pango-1.0.lib" )
30 #pragma comment( lib, "pangocairo-1.0.lib" )
31 #pragma comment( lib, "libcairo-2.lib" )
32 #pragma comment( lib, "gobject-2.0.lib" )
33 #pragma comment( lib, "graph.lib" )
34 #pragma comment( lib, "webp.lib" )
37static const char*
const kStatusMessages[] = {
38 "OK",
"OUT_OF_MEMORY",
"INVALID_PARAM",
"BITSTREAM_ERROR",
39 "UNSUPPORTED_FEATURE",
"SUSPENDED",
"USER_ABORT",
"NOT_ENOUGH_DATA"
48 cairo_surface_destroy(us->
data);
51static cairo_surface_t* webp_really_loadimage(
const char *in_file, FILE*
const in)
53 WebPDecoderConfig config;
54 WebPDecBuffer*
const output_buffer = &config.output;
55 WebPBitstreamFeatures*
const bitstream = &config.input;
56 VP8StatusCode status = VP8_STATUS_OK;
57 cairo_surface_t *surface =
NULL;
61 if (!WebPInitDecoderConfig(&config)) {
62 fprintf(stderr,
"Error: WebP library version mismatch!\n");
66 fseek(in, 0, SEEK_END);
67 long size = ftell(in);
69 fprintf(stderr,
"Error: WebP could not determine %s size\n", in_file);
72 size_t data_size = (size_t)size;
73 fseek(in, 0, SEEK_SET);
75 ok = fread(
data, data_size, 1, in) == 1;
77 fprintf(stderr,
"Error: WebP could not read %" PRISIZE_T
78 " bytes of data from %s\n", data_size, in_file);
83 status = WebPGetFeatures(
data, data_size, bitstream);
84 if (status != VP8_STATUS_OK) {
88 output_buffer->colorspace = MODE_RGBA;
89 status = WebPDecode(
data, data_size, &config);
92 if (! bitstream->has_alpha) {
96 for (y = 0; y < output_buffer->height; y++) {
97 p = output_buffer->u.RGBA.rgba + output_buffer->u.RGBA.stride * y;
98 for (x = 0; x < output_buffer->width; x++) {
109 ok = status == VP8_STATUS_OK;
111 fprintf(stderr,
"Error: WebP decoding of %s failed.\n", in_file);
112 fprintf(stderr,
"Status: %d (%s)\n", status, kStatusMessages[status]);
116 surface = cairo_image_surface_create_for_data (
117 output_buffer->u.RGBA.rgba,
119 output_buffer->width,
120 output_buffer->height,
121 output_buffer->u.RGBA.stride);
129 cairo_surface_t *surface =
NULL;
149 if ((surface = webp_really_loadimage(us->
name, us->
f)))
150 cairo_surface_reference(surface);
170 cairo_surface_t *surface;
172 surface = webp_loadimage(job, us);
175 cairo_translate(cr, b.
LL.
x, -b.
UR.
y);
176 cairo_scale(cr, (b.
UR.
x - b.
LL.
x) / us->
w, (b.
UR.
y - b.
LL.
y) / us->
h);
177 cairo_set_source_surface (cr, surface, 0, 0);
191#ifdef HAVE_PANGOCAIRO
192 {FORMAT_WEBP_CAIRO,
"webp:cairo", 1, &engine_webp,
NULL},
void gvusershape_file_release(usershape_t *us)
bool gvusershape_file_access(usershape_t *us)
gvplugin_installed_t gvloadimage_webp_types[]
#define PRISIZE_T
PRIu64 alike for printing size_t
void(* datafree)(usershape_t *us)