void lcd_clearui( u32 color ) { u32 x, y; u32 height = screen_get_height(); u32 width = screen_get_width(); u32 *dst = lcd_bufferui(); for( y = 0; y < height; y++ ) { for( x = 0; x < width; x+=8 ) { dst[0] = color; dst[1] = color; dst[2] = color; dst[3] = color; dst[4] = color; dst[5] = color; dst[6] = color; dst[7] = color; dst += 8; } } }
static si_t _server_lib_handle_graphics_ops(addr_t body, si_t detail_type, union respond* respond_ptr, addr_t app_addr) { /** 存储调用实际操作函数结果的变量 **/ si_t func_ret = 0; /** 存储_server_lib_handle_request()返回值的变量 **/ si_t handler_ret = SELECTER_RETURN_TYPE_CONTINUE; switch(detail_type) { case REQUEST_TYPE_CLEAR: func_ret = request_call_by_clear(body, engine_clear); respond_set_normal(respond_ptr, RESPOND_TYPE_CLEAR, func_ret); break; case REQUEST_TYPE_CLEAR_WHITE: func_ret = request_call_by_clear_white(body, engine_clear_white); respond_set_normal(respond_ptr, RESPOND_TYPE_CLEAR_WHITE, func_ret); break; case REQUEST_TYPE_CLEAR_BLACK: func_ret = request_call_by_clear_black(body, engine_clear_black); respond_set_normal(respond_ptr, RESPOND_TYPE_CLEAR_BLACK, func_ret); break; case REQUEST_TYPE_CPY_AREA: func_ret = request_call_by_cpy_area(body, engine_cpy_area); respond_set_normal(respond_ptr, RESPOND_TYPE_CPY_AREA, func_ret); break; case REQUEST_TYPE_DRAW_ARROW: func_ret = request_call_by_draw_arrow(body, engine_draw_arrow); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_ARROW, func_ret); break; case REQUEST_TYPE_DRAW_BITMAP: func_ret = request_call_by_draw_bitmap(body, engine_draw_bitmap); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_BITMAP, func_ret); break; case REQUEST_TYPE_DRAW_CIRCLE: func_ret = request_call_by_draw_circle(body, engine_draw_circle); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_CIRCLE, func_ret); break; case REQUEST_TYPE_DRAW_ELLIPSE: func_ret = request_call_by_draw_ellipse(body, engine_draw_ellipse); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_ELLIPSE, func_ret); break; case REQUEST_TYPE_DRAW_IMG: func_ret = request_call_by_draw_img(body, engine_draw_img); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_IMG, func_ret); break; case REQUEST_TYPE_DRAW_LINE: func_ret = request_call_by_draw_line(body, engine_draw_line); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_LINE, func_ret); break; case REQUEST_TYPE_DRAW_POINT: func_ret = request_call_by_draw_point(body, engine_draw_point); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_POINT, func_ret); break; case REQUEST_TYPE_DRAW_POLYGON: func_ret = request_call_by_draw_polygon(body, engine_draw_polygon); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_POLYGON, func_ret); break; case REQUEST_TYPE_DRAW_RECTANGLE: func_ret = request_call_by_draw_rectangle(body, engine_draw_rectangle); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_RECTANGLE, func_ret); break; case REQUEST_TYPE_DRAW_X: func_ret = request_call_by_draw_x(body, engine_draw_x); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_X, func_ret); break; case REQUEST_TYPE_FILL_ARROW: func_ret = request_call_by_fill_arrow(body, engine_fill_arrow); respond_set_normal(respond_ptr, RESPOND_TYPE_FILL_ARROW, func_ret); break; case REQUEST_TYPE_FILL_CIRCLE: func_ret = request_call_by_fill_circle(body, engine_fill_circle); respond_set_normal(respond_ptr, RESPOND_TYPE_FILL_CIRCLE, func_ret); break; case REQUEST_TYPE_FILL_ELLIPSE: func_ret = request_call_by_fill_ellipse(body, engine_fill_ellipse); respond_set_normal(respond_ptr, RESPOND_TYPE_FILL_ELLIPSE, func_ret); break; case REQUEST_TYPE_FILL_RECTANGLE: func_ret = request_call_by_fill_rectangle(body, engine_fill_rectangle); respond_set_normal(respond_ptr, RESPOND_TYPE_FILL_RECTANGLE, func_ret); break; case REQUEST_TYPE_FILL_X: func_ret = request_call_by_fill_x(body, engine_fill_x); respond_set_normal(respond_ptr, RESPOND_TYPE_FILL_X, func_ret); break; case REQUEST_TYPE_GET_COLOR_LIMIT: { struct color_limit func_ret = {0}; engine_get_color_limit(&func_ret); respond_set_color_limit(respond_ptr, RESPOND_TYPE_GET_COLOR_LIMIT, &func_ret); } break; case REQUEST_TYPE_GET_SCREEN_WIDTH: func_ret = screen_get_width(); respond_set_normal(respond_ptr, RESPOND_TYPE_GET_SCREEN_WIDTH, func_ret); break; case REQUEST_TYPE_GET_SCREEN_HEIGHT: func_ret = screen_get_height(); respond_set_normal(respond_ptr, RESPOND_TYPE_GET_SCREEN_HEIGHT, func_ret); break; case REQUEST_TYPE_GET_COLOR: { struct color* func_ret_ptr = request_call_by_get_color(body, engine_get_color); respond_set_color(respond_ptr, RESPOND_TYPE_GET_COLOR, func_ret_ptr); } break; case REQUEST_TYPE_GET_AREA: { struct rectangle* func_ret_ptr = request_call_by_get_area(body, engine_get_area); respond_set_rectangle(respond_ptr, RESPOND_TYPE_GET_AREA, func_ret_ptr); } break; case REQUEST_TYPE_GET_FONT_WIDTH: func_ret = request_call_by_get_font_width(body, engine_get_font_width); respond_set_normal(respond_ptr, RESPOND_TYPE_GET_FONT_WIDTH, func_ret); break; case REQUEST_TYPE_GET_FONT_HEIGHT: func_ret = request_call_by_get_font_height(body, engine_get_font_height); respond_set_normal(respond_ptr, RESPOND_TYPE_GET_FONT_HEIGHT, func_ret); break; case REQUEST_TYPE_SET_AREA: func_ret = request_call_by_set_area(body, engine_set_area); respond_set_normal(respond_ptr, RESPOND_TYPE_SET_AREA, func_ret); break; case REQUEST_TYPE_SET_COLOR: func_ret = request_call_by_set_color(body, engine_set_color); respond_set_normal(respond_ptr, RESPOND_TYPE_SET_COLOR, func_ret); break; case REQUEST_TYPE_SET_FONT: func_ret = request_call_by_set_font(body, engine_set_font); respond_set_normal(respond_ptr, RESPOND_TYPE_SET_FONT, func_ret); break; case REQUEST_TYPE_SHOW_TEXT: func_ret = request_call_by_show_text(body, engine_show_text); respond_set_normal(respond_ptr, RESPOND_TYPE_SHOW_TEXT, func_ret); break; default: /** * 不是绘制图形类的请求,接下来查看是否为窗口管理类请求 **/ handler_ret = -1; break; } return handler_ret; }
ERRCODE RootCallBack( struct XGUI_WND * hWnd , XGUI_MSG * msg ) { static u32 * bg = NULL; int x, y; int pitch = screen_get_width(); switch( msg->type ) { case XGUI_MSG_DRAW: { u32 * dst = lcd_bufferui(); u32 * src = bg; int max_x = screen_get_width(); int max_y = screen_get_height(); XGUI_RECT *rect = (XGUI_RECT *)msg->data; if( src == NULL ) { XGUI_RectFill( hWnd, rect, 0x000000 ); break; } max_x = (rect->right - rect->left); max_y = (rect->bottom - rect->top); for( y = 0; y < max_y; y+=4 ) { src = bg + rect->left/4 + (screen_get_width()/4) * ((rect->top+y)/4); //src += dst = lcd_bufferui() + rect->left + screen_get_width() * (rect->top+y); for( x = 0; x < max_x; x+=4 ) { dst[0] = *src; dst[1] = *src; dst[2] = *src; dst[3] = *src; dst[pitch+0] = *src; dst[pitch+1] = *src; dst[pitch+2] = *src; dst[pitch+3] = *src; dst[pitch*2+0] = *src; dst[pitch*2+1] = *src; dst[pitch*2+2] = *src; dst[pitch*2+3] = *src; dst[pitch*3+0] = *src; dst[pitch*3+1] = *src; dst[pitch*3+2] = *src; dst[pitch*3+3] = *src; dst += 4; src ++; } dst += pitch*3; } break; } case XGUI_MSG_INIT: { //缩略图显示背景 u32 * src = lcd_bufferui(); u32 * dst; int max_x = screen_get_width()/4; int max_y = screen_get_height()/4; bg = malloc( max_x*max_y*4 ); if( bg == NULL ) { TRACE_LOG("malloc error"); break; } dst = bg; for( y = 0; y < max_y; y++ ) { for( x = 0; x < max_x; x++ ) { *dst =( (src[0]&0xF0F0F0)+ (src[1]&0xF0F0F0)+ (src[2]&0xF0F0F0)+ (src[3]&0xF0F0F0)+ (src[pitch+0]&0xF0F0F0)+ (src[pitch+1]&0xF0F0F0)+ (src[pitch+2]&0xF0F0F0)+ (src[pitch+3]&0xF0F0F0)+ (src[pitch*2+0]&0xF0F0F0)+ (src[pitch*2+1]&0xF0F0F0)+ (src[pitch*2+2]&0xF0F0F0)+ (src[pitch*2+3]&0xF0F0F0)+ (src[pitch*3+0]&0xF0F0F0)+ (src[pitch*3+1]&0xF0F0F0)+ (src[pitch*3+2]&0xF0F0F0)+ (src[pitch*3+3]&0xF0F0F0) )>>4; src += 4; dst ++; } src += pitch*3; } break; } case XGUI_MSG_DESTROY: { if(bg) free(bg); break; } } return ERRCODE_NONE; }
void lcd_clear32( u32 color ) { memset( lcd_get_cframe() , color , screen_get_width() * screen_get_height()* 4 ); }