mirror of
https://github.com/webmproject/libwebp.git
synced 2025-07-14 21:09:55 +02:00
Add Alpha Decode support from WebPDecode.
Extend WebP decode functionality to extract Alpha data (support ALPH chunk) and decode the Alpha plane using Alpha (utils/alpha) core-lib. Change-Id: I6f0ee1b189c13caba3c1dd9b681383bfd00aa212
This commit is contained in:
@ -10,11 +10,8 @@
|
||||
// Author: Skal (pascal.massimino@gmail.com)
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "vp8i.h"
|
||||
|
||||
#ifdef WEBP_EXPERIMENTAL_FEATURES
|
||||
|
||||
#include "zlib.h"
|
||||
#include "./vp8i.h"
|
||||
#include "../utils/alpha.h"
|
||||
|
||||
#if defined(__cplusplus) || defined(c_plusplus)
|
||||
extern "C" {
|
||||
@ -24,46 +21,25 @@ extern "C" {
|
||||
|
||||
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 || num_rows < 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
|
||||
// Decode everything during the first call.
|
||||
if (!DecodeAlpha(dec->alpha_data_, (size_t)dec->alpha_data_size_,
|
||||
dec->pic_hdr_.width_, dec->pic_hdr_.height_, stride,
|
||||
dec->alpha_plane_)) {
|
||||
return NULL; // Error.
|
||||
}
|
||||
}
|
||||
return output + row * stride;
|
||||
|
||||
// Return a pointer to the current decoded row.
|
||||
return dec->alpha_plane_ + row * stride;
|
||||
}
|
||||
|
||||
#if defined(__cplusplus) || defined(c_plusplus)
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
#endif // WEBP_EXPERIMENTAL_FEATURES
|
||||
|
Reference in New Issue
Block a user