/** * @file lv_draw_vglite_line.c * */ /** * MIT License * * Copyright 2022, 2023 NXP * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice (including the next paragraph) * shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ /********************* * INCLUDES *********************/ #include "lv_draw_vglite_line.h" #if LV_USE_GPU_NXP_VG_LITE #include "lv_vglite_buf.h" #include /********************* * DEFINES *********************/ /********************** * TYPEDEFS **********************/ /********************** * STATIC PROTOTYPES **********************/ /********************** * STATIC VARIABLES **********************/ /********************** * MACROS **********************/ /********************** * GLOBAL FUNCTIONS **********************/ lv_res_t lv_gpu_nxp_vglite_draw_line(const lv_point_t * point1, const lv_point_t * point2, const lv_area_t * clip_area, const lv_draw_line_dsc_t * dsc) { vg_lite_error_t err = VG_LITE_SUCCESS; vg_lite_path_t path; vg_lite_color_t vgcol; /* vglite takes ABGR */ vg_lite_buffer_t * vgbuf = lv_vglite_get_dest_buf(); vg_lite_cap_style_t cap_style = (dsc->round_start || dsc->round_end) ? VG_LITE_CAP_ROUND : VG_LITE_CAP_BUTT; vg_lite_join_style_t join_style = (dsc->round_start || dsc->round_end) ? VG_LITE_JOIN_ROUND : VG_LITE_JOIN_MITER; bool is_dashed = (dsc->dash_width && dsc->dash_gap); vg_lite_float_t stroke_dash_pattern[2] = {0, 0}; uint32_t stroke_dash_count = 0; vg_lite_float_t stroke_dash_phase = 0; if(is_dashed) { stroke_dash_pattern[0] = (vg_lite_float_t)dsc->dash_width; stroke_dash_pattern[1] = (vg_lite_float_t)dsc->dash_gap; stroke_dash_count = sizeof(stroke_dash_pattern) / sizeof(vg_lite_float_t); stroke_dash_phase = (vg_lite_float_t)dsc->dash_width / 2; } /* Choose vglite blend mode based on given lvgl blend mode */ vg_lite_blend_t vglite_blend_mode = lv_vglite_get_blend_mode(dsc->blend_mode); /*** Init path ***/ lv_coord_t width = dsc->width; int32_t line_path[] = { /*VG line path*/ VLC_OP_MOVE, point1->x, point1->y, VLC_OP_LINE, point2->x, point2->y, VLC_OP_END }; err = vg_lite_init_path(&path, VG_LITE_S32, VG_LITE_HIGH, sizeof(line_path), line_path, (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1, ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f); VG_LITE_ERR_RETURN_INV(err, "Init path failed."); vg_lite_matrix_t matrix; vg_lite_identity(&matrix); lv_color32_t col32 = { .full = lv_color_to32(dsc->color) }; /*Convert color to RGBA8888*/ vg_lite_buffer_format_t color_format = LV_COLOR_DEPTH == 16 ? VG_LITE_BGRA8888 : VG_LITE_ABGR8888; if(lv_vglite_premult_and_swizzle(&vgcol, col32, dsc->opa, color_format) != LV_RES_OK) VG_LITE_RETURN_INV("Premultiplication and swizzle failed."); /*** Draw line ***/ err = vg_lite_set_draw_path_type(&path, VG_LITE_DRAW_STROKE_PATH); VG_LITE_ERR_RETURN_INV(err, "Set draw path type failed."); err = vg_lite_set_stroke(&path, cap_style, join_style, width, 8, stroke_dash_pattern, stroke_dash_count, stroke_dash_phase, vgcol); VG_LITE_ERR_RETURN_INV(err, "Set stroke failed."); err = vg_lite_update_stroke(&path); VG_LITE_ERR_RETURN_INV(err, "Update stroke failed."); lv_vglite_set_scissor(clip_area); err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, vglite_blend_mode, vgcol); VG_LITE_ERR_RETURN_INV(err, "Draw line failed."); if(lv_vglite_run() != LV_RES_OK) VG_LITE_RETURN_INV("Run failed."); lv_vglite_disable_scissor(); err = vg_lite_clear_path(&path); VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); return LV_RES_OK; } /********************** * STATIC FUNCTIONS **********************/ #endif /*LV_USE_GPU_NXP_VG_LITE*/