summaryrefslogtreecommitdiffstats
path: root/third_party/libwebp/dec/alpha.c
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libwebp/dec/alpha.c')
-rw-r--r--third_party/libwebp/dec/alpha.c69
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