output: fix wlr_output_set_gamma() with zero size

This is documented to reset the gamma LUT, but we don't handle this
properly.

While at it, make sure we leave wlr_output.pending in a good state
on allocation failure.
Simon Ser 2 years ago
parent ebd4c83cd6
commit 2ad25b1460

@ -925,18 +925,22 @@ void wlr_output_send_present(struct wlr_output *output,
void wlr_output_set_gamma(struct wlr_output *output, size_t size, void wlr_output_set_gamma(struct wlr_output *output, size_t size,
const uint16_t *r, const uint16_t *g, const uint16_t *b) { const uint16_t *r, const uint16_t *g, const uint16_t *b) {
output_state_clear_gamma_lut(&output->pending); uint16_t *gamma_lut = NULL;
if (size > 0) {
output->pending.gamma_lut_size = size; gamma_lut = malloc(3 * size * sizeof(uint16_t));
output->pending.gamma_lut = malloc(3 * size * sizeof(uint16_t)); if (gamma_lut == NULL) {
if (output->pending.gamma_lut == NULL) {
wlr_log_errno(WLR_ERROR, "Allocation failed"); wlr_log_errno(WLR_ERROR, "Allocation failed");
return; return;
} }
memcpy(output->pending.gamma_lut, r, size * sizeof(uint16_t)); memcpy(gamma_lut, r, size * sizeof(uint16_t));
memcpy(output->pending.gamma_lut + size, g, size * sizeof(uint16_t)); memcpy(gamma_lut + size, g, size * sizeof(uint16_t));
memcpy(output->pending.gamma_lut + 2 * size, b, size * sizeof(uint16_t)); memcpy(gamma_lut + 2 * size, b, size * sizeof(uint16_t));
}
output_state_clear_gamma_lut(&output->pending);
output->pending.gamma_lut_size = size;
output->pending.gamma_lut = gamma_lut;
output->pending.committed |= WLR_OUTPUT_STATE_GAMMA_LUT; output->pending.committed |= WLR_OUTPUT_STATE_GAMMA_LUT;
} }

Loading…
Cancel
Save