diff options
Diffstat (limited to 'third_party/libwebp/dec/alpha.c')
-rw-r--r-- | third_party/libwebp/dec/alpha.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/third_party/libwebp/dec/alpha.c b/third_party/libwebp/dec/alpha.c new file mode 100644 index 0000000..3052ced --- /dev/null +++ b/third_party/libwebp/dec/alpha.c @@ -0,0 +1,69 @@ +// Copyright 2011 Google Inc. +// +// This code is licensed under the same terms as WebM: +// Software License Agreement: http://www.webmproject.org/license/software/ +// Additional IP Rights Grant: http://www.webmproject.org/license/additional/ +// ----------------------------------------------------------------------------- +// +// Alpha-plane decompression. +// +// Author: Skal (pascal.massimino@gmail.com) + +#include <stdlib.h> +#include "vp8i.h" + +#ifdef WEBP_EXPERIMENTAL_FEATURES + +#include "zlib.h" + +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif + +//------------------------------------------------------------------------------ + +const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec, + int row, int num_rows) { + uint8_t* output = dec->alpha_plane_; + const int stride = dec->pic_hdr_.width_; + if (row < 0 || row + num_rows > dec->pic_hdr_.height_) { + return NULL; // sanity check + } + if (row == 0) { + // TODO(skal): for now, we just decompress everything during the first call. + // Later, we'll decode progressively, but we need to store the + // z_stream state. + const uint8_t* data = dec->alpha_data_; + size_t data_size = dec->alpha_data_size_; + const size_t output_size = stride * dec->pic_hdr_.height_; + int ret = Z_OK; + z_stream strm; + + memset(&strm, 0, sizeof(strm)); + if (inflateInit(&strm) != Z_OK) { + return 0; + } + strm.avail_in = data_size; + strm.next_in = (unsigned char*)data; + do { + strm.avail_out = output_size; + strm.next_out = output; + ret = inflate(&strm, Z_NO_FLUSH); + if (ret == Z_NEED_DICT || ret == Z_DATA_ERROR || ret == Z_MEM_ERROR) { + break; + } + } while (strm.avail_out == 0); + + inflateEnd(&strm); + if (ret != Z_STREAM_END) { + return NULL; // error + } + } + return output + row * stride; +} + +#if defined(__cplusplus) || defined(c_plusplus) +} // extern "C" +#endif + +#endif // WEBP_EXPERIMENTAL_FEATURES |