static void app_list_pagemark_change(struct app_list_view *view) { rtgui_rect_t rect = {0, 0, PAGE_MARK_ITEM_WIDTH, PAGE_MARK_ITEM_HEIGHT}; if (view->current_page != view->old_page) { /* draw the current page mark */ rect.x1 = view->current_page * (PAGE_MARK_ITEM_WIDTH + PAGE_MARK_MARGIN); rect.x2 = rect.x1 + PAGE_MARK_ITEM_WIDTH; RTGUI_DC_BC(view->pm_buffer) = RTGUI_ARGB(0, 0, 0, 0); rtgui_dc_fill_rect(view->pm_buffer, &rect); rtgui_image_blit(ycircle_image, view->pm_buffer, &rect); /* draw the old page mark */ rect.x1 = view->old_page * (PAGE_MARK_ITEM_WIDTH + PAGE_MARK_MARGIN); rect.x2 = rect.x1 + PAGE_MARK_ITEM_WIDTH; RTGUI_DC_BC(view->pm_buffer) = RTGUI_ARGB(0, 0, 0, 0); rtgui_dc_fill_rect(view->pm_buffer, &rect); rtgui_image_blit(gcircle_image, view->pm_buffer, &rect); view->old_page = view->current_page; } }
static struct rtgui_image_palette *rtgui_image_bmp_load_palette( struct rtgui_filerw *file, rt_uint32_t colorsUsed, rt_bool_t alpha) { /* Load the palette, if any */ rt_uint32_t i; struct rtgui_image_palette *palette; palette = rtgui_image_palette_create(colorsUsed); if (palette == RT_NULL) { return RT_NULL; } palette->ncolors = colorsUsed; if (alpha) { rt_uint8_t temp[4]; for (i = 0; i < colorsUsed; i++) { if (rtgui_filerw_read(file, (void *)&temp, 1, 4) != 4) { rtgui_free(palette); return RT_NULL; } palette->colors[i] = RTGUI_ARGB(temp[3], temp[2], temp[1], temp[0]); } } else { rt_uint8_t temp[3]; for (i = 0; i < colorsUsed; i++) { if (rtgui_filerw_read(file, (void *)&temp, 1, 3) != 3) { rtgui_free(palette); return RT_NULL; } palette->colors[i] = RTGUI_RGB(temp[2], temp[1], temp[0]); } } return palette; }
static struct rtgui_image_palette* rtgui_image_bmp_load_palette(struct rtgui_image_bmp_header* header, struct rtgui_filerw* src) { /* Load the palette, if any */ rt_size_t i; struct rtgui_image_palette* palette; if (header->biClrUsed == 0) header->biClrUsed = 1 << header->biBitCount; palette = rtgui_image_palette_create(header->biClrUsed); if (palette == RT_NULL) return RT_NULL; if ( header->biSize == 12 ) { rt_uint8_t r, g, b; for ( i = 0; i < (int)header->biClrUsed; ++i ) { rtgui_filerw_read(src, &b, 1, 1); rtgui_filerw_read(src, &g, 1, 1); rtgui_filerw_read(src, &r, 1, 1); palette->colors[i] = RTGUI_RGB(r, g, b); } } else { rt_uint8_t r, g, b, a; for ( i = 0; i < (int)header->biClrUsed; ++i ) { rtgui_filerw_read(src, &b, 1, 1); rtgui_filerw_read(src, &g, 1, 1); rtgui_filerw_read(src, &r, 1, 1); rtgui_filerw_read(src, &a, 1, 1); palette->colors[i] = RTGUI_ARGB(a, r, g, b); } } return palette; }
static rt_bool_t rtgui_image_png_process(png_structp png_ptr, png_infop info_ptr, struct rtgui_image_png *png) { rt_uint32_t x, y; png_bytep row; png_bytep data; rtgui_color_t *ptr; row = (png_bytep) rtgui_malloc(png_get_rowbytes(png_ptr, info_ptr)); if (row == RT_NULL) return RT_FALSE; ptr = (rtgui_color_t *)png->pixels; switch (info_ptr->color_type) { case PNG_COLOR_TYPE_RGB: for (y = 0; y < info_ptr->height; y++) { png_read_row(png_ptr, row, png_bytep_NULL); for (x = 0; x < info_ptr->width; x++) { data = &(row[x * 3]); ptr[x + y * info_ptr->width] = RTGUI_RGB(data[0], data[1], data[2]); } } break; case PNG_COLOR_TYPE_RGBA: for (y = 0; y < info_ptr->height; y++) { png_read_row(png_ptr, row, png_bytep_NULL); for (x = 0; x < info_ptr->width; x++) { data = &(row[x * 4]); ptr[x + y * info_ptr->width] = RTGUI_ARGB(data[3], data[0], data[1], data[2]); } } break; case PNG_COLOR_TYPE_PALETTE: for (y = 0; y < info_ptr->height; y++) { png_read_row(png_ptr, row, png_bytep_NULL); for (x = 0; x < info_ptr->width; x++) { data = &(row[x]); ptr[x] = RTGUI_ARGB(0, info_ptr->palette[data[0]].red, info_ptr->palette[data[0]].green, info_ptr->palette[data[0]].blue); } } default: break; }; rtgui_free(row); return RT_TRUE; }
static void rtgui_image_png_blit(struct rtgui_image *image, struct rtgui_dc *dc, struct rtgui_rect *rect) { rt_uint16_t x, y, w, h; rtgui_color_t *ptr; struct rtgui_image_png *png; int fg_maxsample; int ialpha; float alpha; rtgui_color_t color; rtgui_color_t c, bgcolor; int fc[3], bc[3]; struct rtgui_graphic_driver *hwdev = rtgui_graphic_get_device(); RT_ASSERT(image != RT_NULL && dc != RT_NULL && rect != RT_NULL); RT_ASSERT(image->data != RT_NULL); png = (struct rtgui_image_png *) image->data; w = _UI_MIN(image->w, rtgui_rect_width(*rect)); h = _UI_MIN(image->h, rtgui_rect_height(*rect)); fg_maxsample = (1 << png->info_ptr->bit_depth) - 1; if (png->pixels != RT_NULL) { ptr = (rtgui_color_t *)png->pixels; bgcolor = RTGUI_DC_BC(dc); bc[0] = RTGUI_RGB_R(bgcolor); bc[1] = RTGUI_RGB_G(bgcolor); bc[2] = RTGUI_RGB_B(bgcolor); /* draw each point within dc */ for (y = 0; y < h; y ++) { for (x = 0; x < w; x++) { c = *ptr; ialpha = RTGUI_RGB_A(c); if (ialpha == 0) { /* * Foreground image is transparent hear. * If the background image is already in the frame * buffer, there is nothing to do. */ } else if (ialpha == fg_maxsample) { /* * Copy foreground pixel to frame buffer. */ rtgui_dc_draw_color_point(dc, x + rect->x1, y + rect->y1, c); } else { /* output = alpha * foreground + (1-alpha) * background */ /* * Compositing is necessary. * Get floating-point alpha and its complement. * Note: alpha is always linear: gamma does not * affect it. */ fc[0] = RTGUI_RGB_R(c); fc[1] = RTGUI_RGB_G(c); fc[2] = RTGUI_RGB_B(c); alpha = (float) ialpha / fg_maxsample; color = RTGUI_RGB((rt_uint8_t)(fc[0] * alpha + bc[0] * (1 - alpha)), (rt_uint8_t)(fc[1] * alpha + bc[1] * (1 - alpha)), (rt_uint8_t)(fc[2] * alpha + bc[2] * (1 - alpha))); rtgui_dc_draw_color_point(dc, x + rect->x1, y + rect->y1, color); } /* move to next color buffer */ ptr ++; } } } else { png_bytep row; png_bytep data; row = (png_bytep) rtgui_malloc(png_get_rowbytes(png->png_ptr, png->info_ptr)); if (row == RT_NULL) return ; switch (png->info_ptr->color_type) { case PNG_COLOR_TYPE_RGB: for (y = 0; y < h; y++) { png_read_row(png->png_ptr, row, png_bytep_NULL); for (x = 0; x < w; x++) { data = &(row[x * 3]); rtgui_dc_draw_color_point(dc, x + rect->x1, y + rect->y1, RTGUI_RGB(data[0], data[1], data[2])); } } break; case PNG_COLOR_TYPE_RGBA: for (y = 0; y < h; y++) { png_read_row(png->png_ptr, row, png_bytep_NULL); for (x = 0; x < w; x++) { data = &(row[x * 4]); if (data[3] != 0) { rtgui_dc_draw_color_point(dc, x + rect->x1, y + rect->y1, RTGUI_ARGB(data[3], data[0], data[1], data[2])); } } } break; case PNG_COLOR_TYPE_PALETTE: for (y = 0; y < h; y++) { png_read_row(png->png_ptr, row, png_bytep_NULL); for (x = 0; x < w; x++) { data = &(row[x]); rtgui_dc_draw_color_point(dc, x + rect->x1, y + rect->y1, RTGUI_ARGB(0, png->info_ptr->palette[data[0]].red, png->info_ptr->palette[data[0]].green, png->info_ptr->palette[data[0]].blue)); } } default: break; }; rtgui_free(row); } }
static struct app_list_view *app_list_create(rtgui_rect_t *rect, struct app_item *items, rt_uint16_t item_count, rt_uint8_t row_items, rt_uint8_t col_items, rtgui_image_t *bg_image) { struct app_list_view *view = RT_NULL; view = (struct app_list_view *)rtgui_malloc(sizeof(struct app_list_view)); view->rect = *rect; view->view_rect.x1 = rect->x1; view->view_rect.x2 = rect->x2; view->view_rect.y1 = rect->y1 + 4 * LIST_MARGIN; view->view_rect.y2 = rect->y2 - 6 * LIST_MARGIN; view->col_items = col_items; view->row_items = row_items; view->current_page = 0; view->old_page = 0; view->page_items = col_items * row_items; view->page_count = (item_count + view->page_items - 1) / view->page_items; view->current_item = -1; view->items = items; view->items_count = item_count; if (bg_image != RT_NULL) { rtgui_rect_t bg_rect; RTGUI_RECT(bg_rect, 0, 0, bg_image->w, bg_image->h); /* create background dc buffer */ view->bg_buffer = rtgui_dc_buffer_create(bg_image->w, bg_image->h); /* draw background image to buffer */ rtgui_image_blit(bg_image, view->bg_buffer, &bg_rect); } /* create the main menu dc buffer */ view->view_buffer = rtgui_dc_buffer_create_pixformat(RTGRAPHIC_PIXEL_FORMAT_ARGB888, rtgui_rect_width(view->view_rect) * view->page_count, rtgui_rect_height(view->view_rect)); RTGUI_DC_BC(view->view_buffer) = RTGUI_ARGB(0, 0, 0, 0); view->pm_rect.x1 = 0; view->pm_rect.y1 = rect->y2 - 6 * LIST_MARGIN; view->pm_rect.x2 = PAGE_MARK_ITEM_WIDTH * view->page_count + PAGE_MARK_MARGIN * (view->page_count - 1); view->pm_rect.y2 = view->pm_rect.y1 + PAGE_MARK_ITEM_HEIGHT; view->pm_buffer = rtgui_dc_buffer_create_pixformat(RTGRAPHIC_PIXEL_FORMAT_ARGB888, rtgui_rect_width(view->pm_rect) , rtgui_rect_height(view->pm_rect)); rtgui_rect_moveto_align(rect, &view->pm_rect, RTGUI_ALIGN_CENTER_HORIZONTAL); RTGUI_DC_BC(view->pm_buffer) = RTGUI_ARGB(0, 0, 0, 0); view->bgdisp_point.x = 0; view->bgdisp_point.y = 0; view->listdisp_point.x = 0; view->listdisp_point.y = 0; view->on_select = RT_NULL; return view; }