//#include #include #include #include #include #include #include #include #include #include "reversing_auxiliary_line.h" // 红黄绿辅助线及轨迹线的原始SVG数据. // 直接运行.\image\run.bat, 将原始的SVG格式设计数据转换为OpenVG格式的C数据文件. // 注意: SVG格式的坐标系是自顶向下, 使用时应将其转换到OpenVG坐标系. // // 参考如下 do_paint_auxiliary_line 代码中的坐标映射 // VGfloat m[9]; // // 设置自顶向下(SVG坐标系)到自底向上(OpenVG)的坐标映射, 将SVG坐标转换为OpenVG坐标 // // 以下红黄绿辅助线及轨迹线均使用SVG元素绘制. // vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE); // vgGetMatrix(m); // m[4] = -1; // m[7] = VG_H; // vgLoadMatrix(m); // #include ".\image\bg.c" #include ".\image\BackLine001.c" #include ".\image\BackLine002.c" #include ".\image\BackLine003.c" #include ".\image\BackLine004.c" #include ".\image\BackLine005.c" #include ".\image\BackLine006.c" #include ".\image\BackLine007.c" #include ".\image\BackLine008.c" #include ".\image\BackLine009.c" #include ".\image\BackLine010.c" #include ".\image\BackLine011.c" #include ".\image\BackLine012.c" #include ".\image\BackLine013.c" #include ".\image\BackLine014.c" #include ".\image\BackLine015.c" #include ".\image\BackLine016.c" #include ".\image\BackLine017.c" #include ".\image\BackLine018.c" #include ".\image\BackLine019.c" #include ".\image\BackLine020.c" #include ".\image\BackLine021.c" #include ".\image\BackLine022.c" #include ".\image\BackLine023.c" #include ".\image\BackLine024.c" #include ".\image\BackLine025.c" #include ".\image\BackLine026.c" #include ".\image\BackLine027.c" #include ".\image\BackLine028.c" #include ".\image\BackLine029.c" #include ".\image\BackLine030.c" #include ".\image\BackLine031.c" #include ".\image\BackLine032.c" #include ".\image\BackLine033.c" #include ".\image\BackLine034.c" #include ".\image\BackLine035.c" #include ".\image\BackLine036.c" #include ".\image\BackLine037.c" #include ".\image\BackLine038.c" #include ".\image\BackLine039.c" #include ".\image\BackLine040.c" #include ".\image\BackLine041.c" #include ".\image\BackLine042.c" #include ".\image\BackLine043.c" #include ".\image\BackLine044.c" #include ".\image\BackLine045.c" #include ".\image\BackLine046.c" #include ".\image\BackLine047.c" #include ".\image\BackLine048.c" #include ".\image\BackLine049.c" #include ".\image\BackLine050.c" #include ".\image\BackLine051.c" #include ".\image\BackLine052.c" #include ".\image\BackLine053.c" #include ".\image\BackLine054.c" #include ".\image\BackLine055.c" #include ".\image\BackLine056.c" #include ".\image\BackLine057.c" #include ".\image\BackLine058.c" #include ".\image\BackLine059.c" #include ".\image\BackLine060.c" #include ".\image\BackLine061.c" #include ".\image\BackLine062.c" #include ".\image\BackLine063.c" #include ".\image\BackLine064.c" #include ".\image\BackLine065.c" #include ".\image\BackLine066.c" #include ".\image\BackLine067.c" #include ".\image\BackLine068.c" #include ".\image\BackLine069.c" #include ".\image\BackLine070.c" #include ".\image\BackLine071.c" #include ".\image\BackLine072.c" #include ".\image\BackLine073.c" #include ".\image\BackLine074.c" #include ".\image\BackLine075.c" #include ".\image\BackLine076.c" #include ".\image\BackLine077.c" #include ".\image\BackLine078.c" #include ".\image\BackLine079.c" #include ".\image\BackLine080.c" #include ".\image\BackLine081.c" #include ".\image\BackLine082.c" #include ".\image\BackLine083.c" #include ".\image\BackLine084.c" #include ".\image\BackLine085.c" #include ".\image\BackLine086.c" #include ".\image\BackLine087.c" #include ".\image\BackLine088.c" #include ".\image\BackLine089.c" #include ".\image\BackLine090.c" #include ".\image\BackLine091.c" #include ".\image\BackLine092.c" #include ".\image\BackLine093.c" #include ".\image\BackLine094.c" #include ".\image\BackLine095.c" #include ".\image\BackLine096.c" #include ".\image\BackLine097.c" #include ".\image\BackLine098.c" #include ".\image\BackLine099.c" #include ".\image\BackLine100.c" #include ".\image\BackLine101.c" #include ".\image\BackLine102.c" #include ".\image\BackLine103.c" #include ".\image\BackLine104.c" #include ".\image\BackLine105.c" #include ".\image\BackLine106.c" #include ".\image\BackLine107.c" #include ".\image\BackLine108.c" #include ".\image\BackLine109.c" #include ".\image\BackLine110.c" #include ".\image\BackLine111.c" #include ".\image\BackLine112.c" #include ".\image\BackLine113.c" // 轨迹线描述结构 typedef struct { const VGubyte *command; int cb_command; const VGfloat *coordinate; } BACK_LINE; #define L_DEF(num) { BackLine##num##_path_0_commands , sizeof(BackLine##num##_path_0_commands )/sizeof(BackLine##num##_path_0_commands [0]), BackLine##num##_path_0_coordinates } #define R_DEF(num) { BackLine##num##_path_1_commands , sizeof(BackLine##num##_path_1_commands )/sizeof(BackLine##num##_path_1_commands [0]), BackLine##num##_path_1_coordinates } // 左轨迹数据 static const BACK_LINE back_lines_left[] = { L_DEF(001), L_DEF(002), L_DEF(003), L_DEF(004), L_DEF(005), L_DEF(006), L_DEF(007), L_DEF(008), L_DEF(009), L_DEF(010), L_DEF(011), L_DEF(012), L_DEF(013), L_DEF(014), L_DEF(015), L_DEF(016), L_DEF(017), L_DEF(018), L_DEF(019), L_DEF(020), L_DEF(021), L_DEF(022), L_DEF(023), L_DEF(024), L_DEF(025), L_DEF(026), L_DEF(027), L_DEF(028), L_DEF(029), L_DEF(030), L_DEF(031), L_DEF(032), L_DEF(033), L_DEF(034), L_DEF(035), L_DEF(036), L_DEF(037), L_DEF(038), L_DEF(039), L_DEF(040), L_DEF(041), L_DEF(042), L_DEF(043), L_DEF(044), L_DEF(045), L_DEF(046), L_DEF(047), L_DEF(048), L_DEF(049), L_DEF(050), L_DEF(051), L_DEF(052), L_DEF(053), L_DEF(054), L_DEF(055), L_DEF(056), L_DEF(057), L_DEF(058), L_DEF(059), L_DEF(060), L_DEF(061), L_DEF(062), L_DEF(063), L_DEF(064), L_DEF(065), L_DEF(066), L_DEF(067), L_DEF(068), L_DEF(069), L_DEF(070), L_DEF(071), L_DEF(072), L_DEF(073), L_DEF(074), L_DEF(075), L_DEF(076), L_DEF(077), L_DEF(078), L_DEF(079), L_DEF(080), L_DEF(081), L_DEF(082), L_DEF(083), L_DEF(084), L_DEF(085), L_DEF(086), L_DEF(087), L_DEF(088), L_DEF(089), L_DEF(090), L_DEF(091), L_DEF(092), L_DEF(093), L_DEF(094), L_DEF(095), L_DEF(096), L_DEF(097), L_DEF(098), L_DEF(099), L_DEF(100), L_DEF(101), L_DEF(102), L_DEF(103), L_DEF(104), L_DEF(105), L_DEF(106), L_DEF(107), L_DEF(108), L_DEF(109), L_DEF(110), L_DEF(111), L_DEF(112), L_DEF(113), }; // 右轨迹数据 static const BACK_LINE back_lines_right[] = { R_DEF(001), R_DEF(002), R_DEF(003), R_DEF(004), R_DEF(005), R_DEF(006), R_DEF(007), R_DEF(008), R_DEF(009), R_DEF(010), R_DEF(011), R_DEF(012), R_DEF(013), R_DEF(014), R_DEF(015), R_DEF(016), R_DEF(017), R_DEF(018), R_DEF(019), R_DEF(020), R_DEF(021), R_DEF(022), R_DEF(023), R_DEF(024), R_DEF(025), R_DEF(026), R_DEF(027), R_DEF(028), R_DEF(029), R_DEF(030), R_DEF(031), R_DEF(032), R_DEF(033), R_DEF(034), R_DEF(035), R_DEF(036), R_DEF(037), R_DEF(038), R_DEF(039), R_DEF(040), R_DEF(041), R_DEF(042), R_DEF(043), R_DEF(044), R_DEF(045), R_DEF(046), R_DEF(047), R_DEF(048), R_DEF(049), R_DEF(050), R_DEF(051), R_DEF(052), R_DEF(053), R_DEF(054), R_DEF(055), R_DEF(056), R_DEF(057), R_DEF(058), R_DEF(059), R_DEF(060), R_DEF(061), R_DEF(062), R_DEF(063), R_DEF(064), R_DEF(065), R_DEF(066), R_DEF(067), R_DEF(068), R_DEF(069), R_DEF(070), R_DEF(071), R_DEF(072), R_DEF(073), R_DEF(074), R_DEF(075), R_DEF(076), R_DEF(077), R_DEF(078), R_DEF(079), R_DEF(080), R_DEF(081), R_DEF(082), R_DEF(083), R_DEF(084), R_DEF(085), R_DEF(086), R_DEF(087), R_DEF(088), R_DEF(089), R_DEF(090), R_DEF(091), R_DEF(092), R_DEF(093), R_DEF(094), R_DEF(095), R_DEF(096), R_DEF(097), R_DEF(098), R_DEF(099), R_DEF(100), R_DEF(101), R_DEF(102), R_DEF(103), R_DEF(104), R_DEF(105), R_DEF(106), R_DEF(107), R_DEF(108), R_DEF(109), R_DEF(110), R_DEF(111), R_DEF(112), R_DEF(113), }; #define LEFT_PATH_ORG_X (0.0f) #define LEFT_PATH_ORG_Y (0.0f) #define RIGHT_PATH_ORG_X (0.0f) #define RIGHT_PATH_ORG_Y (0.0f) #define BACK_LINE_WIDTH 7.0f // 红黄绿辅助线线宽 static VGPath back_line_path_0; // 绿色标线 static VGPath back_line_path_1; // 黄色标线 static VGPath back_line_path_2; // 红色标线 static int vg_w, vg_h; // 绘制红黄绿辅助线及轨迹线 // path_line_index 轨迹线图片索引 static void do_paint_auxiliary_line (int path_line_index) { VGfloat line_color[4]; VGPaint colorPaint; if (path_line_index < 0 || path_line_index >= sizeof(back_lines_left) / sizeof(back_lines_left[0]) || path_line_index >= sizeof(back_lines_right) / sizeof(back_lines_right[0])) return; // 设置单位矩阵 vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE); vgLoadIdentity(); // 创建一个纯色画笔对象 colorPaint = vgCreatePaint(); vgSetParameteri(colorPaint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR); VGfloat m[9]; // 设置自顶向下(SVG坐标系)到自底向上(OpenVG)的坐标映射, 将SVG坐标转换为OpenVG坐标 // 以下红黄绿辅助线及轨迹线均使用SVG元素绘制. vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE); vgGetMatrix(m); m[4] = -1; m[7] = vg_h; vgLoadMatrix(m); // 绘制红黄绿辅助线 (以下路径使用的坐标为SVG坐标, 通过上面的转换矩阵m进行坐标系转换) // 绘制绿色标线 // SVG代码 // // 创建绿色画笔 line_color[0] = 0.00f; // 绿色 line_color[1] = 1.00f; line_color[2] = 0.00f; line_color[3] = 1.00f; vgSetParameterfv (colorPaint, VG_PAINT_COLOR, 4, line_color); // 标记画笔对象colorPaint用于下面的路径描边操作 vgSetPaint (colorPaint, VG_STROKE_PATH); // 设置笔宽度 vgSetf (VG_STROKE_LINE_WIDTH, BACK_LINE_WIDTH); // 设置笔帽类型 vgSetf (VG_STROKE_CAP_STYLE, VG_CAP_ROUND); // 绘制绿色标线 vgDrawPath (back_line_path_0, VG_STROKE_PATH); // 绘制黄色标线 // SVG代码 // // 创建黄色画笔 line_color[0] = 1.00f; // 黄色 line_color[1] = 1.00f; line_color[2] = 0.00f; line_color[3] = 1.00f; vgSetParameterfv (colorPaint, VG_PAINT_COLOR, 4, line_color); // 标记画笔对象colorPaint用于下面的路径描边操作 vgSetPaint (colorPaint, VG_STROKE_PATH); // 设置笔宽度 vgSetf (VG_STROKE_LINE_WIDTH, BACK_LINE_WIDTH); // 设置笔帽类型 vgSetf (VG_STROKE_CAP_STYLE, VG_CAP_ROUND); // 绘制黄色标线 vgDrawPath (back_line_path_1, VG_STROKE_PATH); // 绘制红色标线 // SVG代码 // // 创建红色画笔 line_color[0] = 1.00f; // 红色 line_color[1] = 0.00f; line_color[2] = 0.00f; line_color[3] = 1.00f; vgSetParameterfv (colorPaint, VG_PAINT_COLOR, 4, line_color); // 标记画笔对象colorPaint用于下面的路径描边操作 vgSetPaint (colorPaint, VG_STROKE_PATH); // 设置笔宽度 vgSetf (VG_STROKE_LINE_WIDTH, BACK_LINE_WIDTH); // 设置笔帽类型 vgSetf (VG_STROKE_CAP_STYLE, VG_CAP_ROUND); // 绘制红色标线 vgDrawPath (back_line_path_2, VG_STROKE_PATH); // 绘制倒车轨迹 // leftBackLine001.svg // line_color[0] = 1.00f; // 黄色 line_color[1] = 1.00f; line_color[2] = 0.00f; line_color[3] = 1.00f; vgSetParameterfv (colorPaint, VG_PAINT_COLOR, 4, line_color); // 标记画笔对象colorPaint用于下面的路径填充操作 vgSetPaint (colorPaint, VG_STROKE_PATH); // 设置笔宽度 vgSetf (VG_STROKE_LINE_WIDTH, BACK_LINE_WIDTH); // 设置笔帽类型 vgSetf (VG_STROKE_CAP_STYLE, VG_CAP_BUTT); // VG_CAP_BUTT为缺省类型 // 绘制左边的轨迹线 // 移至坐标原点至左轨迹SVG相对于VG背景的偏移位置 vgTranslate(LEFT_PATH_ORG_X, LEFT_PATH_ORG_Y); const BACK_LINE *back_line_left = back_lines_left + path_line_index; // 创建左轨迹路径 VGPath path_line_path_left = vgCreatePath (VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1.0f, 0.0f, 0, 0, VG_PATH_CAPABILITY_ALL); if (path_line_path_left != VG_INVALID_HANDLE) { // 以下VG命令个数 - 1 "back_line_left->cb_command - 1"的作用是去除最后的 VG_CLOSE_PATH 命令. SVG2OPENVG.exe工具转换时自动在所有路径命令上补全 VG_CLOSE_PATH vgAppendPathData (path_line_path_left, back_line_left->cb_command - 1, back_line_left->command, back_line_left->coordinate); // 绘制左轨迹 vgDrawPath (path_line_path_left, VG_STROKE_PATH); } // 释放左轨迹路径资源 vgDestroyPath (path_line_path_left); vgTranslate (-LEFT_PATH_ORG_X, -LEFT_PATH_ORG_Y); // 绘制右边的轨迹线 // 移至坐标原点至右轨迹SVG相对于VG背景的偏移位置 vgTranslate (RIGHT_PATH_ORG_X, RIGHT_PATH_ORG_Y); const BACK_LINE *back_line_right = back_lines_right + path_line_index; // 创建右轨迹路径 VGPath path_line_path_right = vgCreatePath (VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1.0f, 0.0f, 0, 0, VG_PATH_CAPABILITY_ALL); if (path_line_path_right != VG_INVALID_HANDLE) { // 以下VG命令个数 - 1 "back_line_right->cb_command - 1"的作用是去除最后的 VG_CLOSE_PATH 命令. SVG2OPENVG.exe工具转换时自动在所有路径命令上补全 VG_CLOSE_PATH vgAppendPathData (path_line_path_right, back_line_right->cb_command - 1, back_line_right->command, back_line_right->coordinate); vgDrawPath (path_line_path_right, VG_STROKE_PATH); } // 释放右轨迹路径资源 vgDestroyPath (path_line_path_right); vgTranslate (-RIGHT_PATH_ORG_X, -RIGHT_PATH_ORG_Y); // 设置无效句柄用于路径描边, 将colorPaint的引用次数减1 vgSetPaint (VG_INVALID_HANDLE, VG_STROKE_PATH); // 释放colorPaint资源 vgDestroyPaint (colorPaint); vgFinish(); } int reversing_auxiliary_line_draw (int index) { vgSeti(VG_IMAGE_QUALITY, VG_IMAGE_QUALITY_BETTER); vgSeti(VG_RENDERING_QUALITY, VG_RENDERING_QUALITY_BETTER); do_paint_auxiliary_line(index); return 0; } int reversing_auxiliary_line_init (int width, int height) { vg_w = width; vg_h = height; (void)vg_w; (void)vg_h; // 创建红黄绿辅助线路径对象 // 以下VG命令个数 - 1 "sizeof(bg_path_0_commands) / sizeof(VGubyte) - 1"的作用是去除最后的 VG_CLOSE_PATH 命令. SVG2OPENVG.exe工具转换时自动在所有路径命令上补全 VG_CLOSE_PATH back_line_path_0 = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1.0f, 0.0f, 0, 0, VG_PATH_CAPABILITY_ALL); if(back_line_path_0 != VG_INVALID_HANDLE) vgAppendPathData(back_line_path_0, sizeof(bg_path_0_commands) / sizeof(VGubyte) - 1, bg_path_0_commands, bg_path_0_coordinates); back_line_path_1 = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1.0f, 0.0f, 0, 0, VG_PATH_CAPABILITY_ALL); if (back_line_path_1 != VG_INVALID_HANDLE) vgAppendPathData(back_line_path_1, sizeof(bg_path_1_commands) / sizeof(VGubyte) - 1, bg_path_1_commands, bg_path_1_coordinates); back_line_path_2 = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1.0f, 0.0f, 0, 0, VG_PATH_CAPABILITY_ALL); if (back_line_path_2 != VG_INVALID_HANDLE) vgAppendPathData(back_line_path_2, sizeof(bg_path_2_commands) / sizeof(VGubyte) - 1, bg_path_2_commands, bg_path_2_coordinates); return 0; } int reversing_auxiliary_line_exit (void) { // 释放背景轨迹路径对象 if (back_line_path_0 != VG_INVALID_HANDLE) { vgDestroyPath(back_line_path_0); back_line_path_0 = VG_INVALID_HANDLE; } if (back_line_path_1 != VG_INVALID_HANDLE) { vgDestroyPath(back_line_path_1); back_line_path_1 = VG_INVALID_HANDLE; } if (back_line_path_2 != VG_INVALID_HANDLE) { vgDestroyPath(back_line_path_2); back_line_path_2 = VG_INVALID_HANDLE; } return 0; }