/*
 * Copyright (c) 2018 Jan Van Winkel <jan.van_winkel@dxplore.eu>
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr.h>
#include <lvgl.h>
#include "lvgl_color.h"

#if CONFIG_LVGL_BITS_PER_PIXEL == 0

static void zephyr_disp_flush(s32_t x1, s32_t y1, s32_t x2, s32_t y2,
		const lv_color_t *color_p)
{
	u16_t w = x2 - x1 + 1;
	u16_t h = y2 - y1 + 1;
	struct display_buffer_descriptor desc;

	desc.buf_size = 4 * w * h;
	desc.width = w;
	desc.pitch = w;
	desc.height = h;
	display_write(lvgl_display_dev, x1, y1, &desc, (void *) color_p);

	lv_flush_ready();
}

#define zephyr_vdb_write NULL

#elif CONFIG_LVGL_BITS_PER_PIXEL == 24

static void zephyr_disp_flush(s32_t x1, s32_t y1, s32_t x2, s32_t y2,
		const lv_color_t *color_p)
{
	u16_t w = x2 - x1 + 1;
	u16_t h = y2 - y1 + 1;
	struct display_buffer_descriptor desc;

	desc.buf_size = 3 * w * h;
	desc.width = w;
	desc.pitch = w;
	desc.height = h;
	display_write(lvgl_display_dev, x1, y1, &desc, (void *) color_p);

	lv_flush_ready();
}

static void zephyr_vdb_write(u8_t *buf, lv_coord_t buf_w, lv_coord_t x,
		lv_coord_t y, lv_color_t color, lv_opa_t opa)
{
	u8_t *buf_xy = buf + x + y * buf_w;

	if (opa != LV_OPA_COVER) {
		lv_color_t mix_color;

		mix_color.red = *buf_xy;
		mix_color.green = *(buf_xy+1);
		mix_color.blue = *(buf_xy+2);
		color = lv_color_mix(color, mix_color, opa);
	}

	*buf_xy = color.red;
	*(buf_xy + 1) = color.green;
	*(buf_xy + 2) = color.blue;
}

#else

#error "Unsupported pixel format conversion"

#endif /* CONFIG_LVGL_BITS_PER_PIXEL */

void *get_disp_flush(void)
{
	return zephyr_disp_flush;
}

void *get_vdb_write(void)
{
	return zephyr_vdb_write;
}

void *get_round_func(void)
{
	return NULL;
}
