16struct Target { uint32_t pixelFormat;
size_t stride; };
20 ? Target{WUFFS_BASE__PIXEL_FORMAT__RGB, 3}
21 : Target{WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL, 4};
32 wuffs_gif__decoder dec;
34 wuffs_base__status st =
35 wuffs_gif__decoder__initialize(
39 WUFFS_INITIALIZE__DEFAULT_OPTIONS
42 if (!wuffs_base__status__is_ok(&st)) {
43 HAIO_FAIL(InvalidInput,
"wuffs is not ok");
46 wuffs_base__io_buffer src =
47 wuffs_base__ptr_u8__reader(
48 (uint8_t*)blob.data.data(),
53 wuffs_base__image_config cfg;
54 memset(&cfg, 0,
sizeof cfg);
56 st = wuffs_base__image_decoder__decode_image_config(
57 wuffs_gif__decoder__upcast_as__wuffs_base__image_decoder(&dec),
62 if (!wuffs_base__status__is_ok(&st)) {
63 HAIO_FAIL(InvalidInput,
"invalid gif config");
66 uint32_t w = wuffs_base__pixel_config__width(&cfg.pixcfg);
67 uint32_t h = wuffs_base__pixel_config__height(&cfg.pixcfg);
70 HAIO_FAIL(InvalidInput,
"invalid gif dimensions");
73 constexpr auto target = targetFor(P);
75 wuffs_base__pixel_config__set(
78 WUFFS_BASE__PIXEL_SUBSAMPLING__NONE,
83 std::vector<uint8_t> buffer(
84 static_cast<size_t>(w) *
85 static_cast<size_t>(h) *
89 wuffs_base__pixel_buffer pb;
91 st = wuffs_base__pixel_buffer__set_from_slice(
94 wuffs_base__make_slice_u8(
100 if (!wuffs_base__status__is_ok(&st)) {
101 HAIO_FAIL(InvalidInput,
"failed to create gif pixel buffer");
104 wuffs_base__range_ii_u64 wb =
105 wuffs_base__image_decoder__workbuf_len(
106 wuffs_gif__decoder__upcast_as__wuffs_base__image_decoder(&dec)
109 std::vector<uint8_t> work(
110 wb.max_incl ?
static_cast<size_t>(wb.max_incl) : 0
114 st = wuffs_base__image_decoder__decode_frame(
115 wuffs_gif__decoder__upcast_as__wuffs_base__image_decoder(&dec),
118 WUFFS_BASE__PIXEL_BLEND__SRC,
119 wuffs_base__make_slice_u8(
126 if (!wuffs_base__status__is_ok(&st)) {
127 HAIO_FAIL(InvalidInput,
"failed to decode gif frame");
145 return decodeGif<Color::RGBA8888>(blob);
155 return decodeGif<Color::RGB888>(blob);