mirror of
https://github.com/webmproject/libwebp.git
synced 2024-12-27 22:28:22 +01:00
fix rescaling bug: alpha plane wasn't filled with 0xff
(in case no alpha was present in the source .webp,
but user requested some)
Change-Id: I9011d38237907c60d6796a86bd2c72166aa80f27
(cherry picked from commit 06a38c7b1c
)
This commit is contained in:
parent
6a19793777
commit
f918cb1013
20
src/dec/io.c
20
src/dec/io.c
@ -119,6 +119,14 @@ static int EmitFancyRGB(const VP8Io* const io, WebPDecParams* const p) {
|
|||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static void FillAlphaPlane(uint8_t* dst, int w, int h, int stride) {
|
||||||
|
int j;
|
||||||
|
for (j = 0; j < h; ++j) {
|
||||||
|
memset(dst, 0xff, w * sizeof(*dst));
|
||||||
|
dst += stride;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int EmitAlphaYUV(const VP8Io* const io, WebPDecParams* const p,
|
static int EmitAlphaYUV(const VP8Io* const io, WebPDecParams* const p,
|
||||||
int expected_num_lines_out) {
|
int expected_num_lines_out) {
|
||||||
const uint8_t* alpha = io->a;
|
const uint8_t* alpha = io->a;
|
||||||
@ -137,10 +145,7 @@ static int EmitAlphaYUV(const VP8Io* const io, WebPDecParams* const p,
|
|||||||
}
|
}
|
||||||
} else if (buf->a != NULL) {
|
} else if (buf->a != NULL) {
|
||||||
// the user requested alpha, but there is none, set it to opaque.
|
// the user requested alpha, but there is none, set it to opaque.
|
||||||
for (j = 0; j < mb_h; ++j) {
|
FillAlphaPlane(dst, mb_w, mb_h, buf->a_stride);
|
||||||
memset(dst, 0xff, mb_w * sizeof(*dst));
|
|
||||||
dst += buf->a_stride;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -269,8 +274,8 @@ static int EmitRescaledYUV(const VP8Io* const io, WebPDecParams* const p) {
|
|||||||
|
|
||||||
static int EmitRescaledAlphaYUV(const VP8Io* const io, WebPDecParams* const p,
|
static int EmitRescaledAlphaYUV(const VP8Io* const io, WebPDecParams* const p,
|
||||||
int expected_num_lines_out) {
|
int expected_num_lines_out) {
|
||||||
if (io->a != NULL) {
|
|
||||||
const WebPYUVABuffer* const buf = &p->output->u.YUVA;
|
const WebPYUVABuffer* const buf = &p->output->u.YUVA;
|
||||||
|
if (io->a != NULL) {
|
||||||
uint8_t* dst_y = buf->y + p->last_y * buf->y_stride;
|
uint8_t* dst_y = buf->y + p->last_y * buf->y_stride;
|
||||||
const uint8_t* src_a = buf->a + p->last_y * buf->a_stride;
|
const uint8_t* src_a = buf->a + p->last_y * buf->a_stride;
|
||||||
const int num_lines_out = Rescale(io->a, io->width, io->mb_h, &p->scaler_a);
|
const int num_lines_out = Rescale(io->a, io->width, io->mb_h, &p->scaler_a);
|
||||||
@ -280,6 +285,11 @@ static int EmitRescaledAlphaYUV(const VP8Io* const io, WebPDecParams* const p,
|
|||||||
WebPMultRows(dst_y, buf->y_stride, src_a, buf->a_stride,
|
WebPMultRows(dst_y, buf->y_stride, src_a, buf->a_stride,
|
||||||
p->scaler_a.dst_width, num_lines_out, 1);
|
p->scaler_a.dst_width, num_lines_out, 1);
|
||||||
}
|
}
|
||||||
|
} else if (buf->a != NULL) {
|
||||||
|
// the user requested alpha, but there is none, set it to opaque.
|
||||||
|
assert(p->last_y + expected_num_lines_out <= io->scaled_height);
|
||||||
|
FillAlphaPlane(buf->a + p->last_y * buf->a_stride,
|
||||||
|
io->scaled_width, expected_num_lines_out, buf->a_stride);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user