diff options
| author | [email protected] <[email protected]> | 2012-08-27 07:57:19 +0000 |
|---|---|---|
| committer | [email protected] <[email protected]> | 2012-08-27 07:57:19 +0000 |
| commit | 64b0cd34fe31b9277d091d71e2a877f81d582df5 (patch) | |
| tree | 58c546e41fcd49b01b0bc9f3286d093d3bee176e /components/rtgui/common | |
| parent | a2c5b921511c555410425e1f099624c391a2b7fc (diff) | |
sync RTGUI with github(https://github.com/RT-Thread/RTGUI) 126336387561442a0508b661595134deb28ad34b
As always, full log is in GitHub.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@2265 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'components/rtgui/common')
| -rw-r--r-- | components/rtgui/common/dc.c | 28 | ||||
| -rw-r--r-- | components/rtgui/common/dc_client.c | 2 | ||||
| -rw-r--r-- | components/rtgui/common/filerw.c | 134 | ||||
| -rw-r--r-- | components/rtgui/common/font_hz_file.c | 12 | ||||
| -rw-r--r-- | components/rtgui/common/image.c | 11 | ||||
| -rw-r--r-- | components/rtgui/common/image_bmp.c | 172 | ||||
| -rw-r--r-- | components/rtgui/common/rtgui_app.c | 12 | ||||
| -rw-r--r-- | components/rtgui/common/rtgui_object.c | 8 | ||||
| -rw-r--r-- | components/rtgui/common/rtgui_system.c | 21 |
9 files changed, 282 insertions, 118 deletions
diff --git a/components/rtgui/common/dc.c b/components/rtgui/common/dc.c index 1de54318a5..b9834312ae 100644 --- a/components/rtgui/common/dc.c +++ b/components/rtgui/common/dc.c @@ -38,6 +38,7 @@ void rtgui_dc_destory(struct rtgui_dc* dc) dc->engine->fini(dc); rtgui_free(dc); } +RTM_EXPORT(rtgui_dc_destory); void rtgui_dc_draw_line (struct rtgui_dc* dc, int x1, int y1, int x2, int y2) { @@ -106,6 +107,7 @@ void rtgui_dc_draw_line (struct rtgui_dc* dc, int x1, int y1, int x2, int y2) } } } +RTM_EXPORT(rtgui_dc_draw_line); void rtgui_dc_draw_horizontal_line(struct rtgui_dc* dc, int x1, int x2, int y) { @@ -127,6 +129,7 @@ void rtgui_dc_draw_horizontal_line(struct rtgui_dc* dc, int x1, int x2, int y) /* restore color */ RTGUI_DC_FC(dc) = color; } +RTM_EXPORT(rtgui_dc_draw_horizontal_line); void rtgui_dc_draw_vertical_line(struct rtgui_dc* dc, int x, int y1, int y2) { @@ -148,6 +151,7 @@ void rtgui_dc_draw_vertical_line(struct rtgui_dc* dc, int x, int y1, int y2) /* restore color */ RTGUI_DC_FC(dc) = color; } +RTM_EXPORT(rtgui_dc_draw_vertical_line); void rtgui_dc_draw_rect (struct rtgui_dc* dc, struct rtgui_rect* rect) { @@ -157,6 +161,7 @@ void rtgui_dc_draw_rect (struct rtgui_dc* dc, struct rtgui_rect* rect) rtgui_dc_draw_vline(dc, rect->x1, rect->y1, rect->y2); rtgui_dc_draw_vline(dc, rect->x2 - 1, rect->y1, rect->y2); } +RTM_EXPORT(rtgui_dc_draw_rect); void rtgui_dc_fill_rect_forecolor(struct rtgui_dc* dc, struct rtgui_rect* rect) { @@ -169,6 +174,7 @@ void rtgui_dc_fill_rect_forecolor(struct rtgui_dc* dc, struct rtgui_rect* rect) i++; }while(!(rect->y1+i == rect->y2)); } +RTM_EXPORT(rtgui_dc_fill_rect_forecolor); void rtgui_dc_draw_round_rect(struct rtgui_dc* dc, struct rtgui_rect* rect, int r) { @@ -198,6 +204,7 @@ void rtgui_dc_draw_round_rect(struct rtgui_dc* dc, struct rtgui_rect* rect, int rtgui_dc_draw_vline(dc, rect->x2, rect->y1 + r, rect->y2 - r); } } +RTM_EXPORT(rtgui_dc_draw_round_rect); void rtgui_dc_fill_round_rect(struct rtgui_dc* dc, struct rtgui_rect* rect, int r) { @@ -231,6 +238,7 @@ void rtgui_dc_fill_round_rect(struct rtgui_dc* dc, struct rtgui_rect* rect, int rtgui_dc_fill_circle(dc, rect->x1 + r, rect->y2 - r, r); } } +RTM_EXPORT(rtgui_dc_fill_round_rect); void rtgui_dc_draw_shaded_rect(struct rtgui_dc* dc, rtgui_rect_t* rect, rtgui_color_t c1, rtgui_color_t c2) @@ -245,6 +253,7 @@ void rtgui_dc_draw_shaded_rect(struct rtgui_dc* dc, rtgui_rect_t* rect, rtgui_dc_draw_vline(dc, rect->x2 - 1, rect->y1, rect->y2); rtgui_dc_draw_hline(dc, rect->x1, rect->x2, rect->y2 - 1); } +RTM_EXPORT(rtgui_dc_draw_shaded_rect); void rtgui_dc_draw_focus_rect(struct rtgui_dc* dc, rtgui_rect_t* rect) { @@ -266,6 +275,7 @@ void rtgui_dc_draw_focus_rect(struct rtgui_dc* dc, rtgui_rect_t* rect) rtgui_dc_draw_point(dc, rect->x2-1, y); } } +RTM_EXPORT(rtgui_dc_draw_focus_rect); void rtgui_dc_draw_text (struct rtgui_dc* dc, const char* text, struct rtgui_rect* rect) { @@ -289,6 +299,7 @@ void rtgui_dc_draw_text (struct rtgui_dc* dc, const char* text, struct rtgui_rec len = strlen((const char*)text); rtgui_font_draw(font, dc, text, len, &text_rect); } +RTM_EXPORT(rtgui_dc_draw_text); void rtgui_dc_draw_text_stroke (struct rtgui_dc* dc, const char* text, struct rtgui_rect* rect, rtgui_color_t color_stroke, rtgui_color_t color_core) @@ -314,6 +325,7 @@ void rtgui_dc_draw_text_stroke (struct rtgui_dc* dc, const char* text, struct rt rtgui_dc_draw_text(dc, text, rect); RTGUI_DC_FC(dc) = fc; } +RTM_EXPORT(rtgui_dc_draw_text_stroke); /* * draw a monochrome color bitmap data @@ -332,16 +344,19 @@ void rtgui_dc_draw_mono_bmp(struct rtgui_dc* dc, int x, int y, int w, int h, con if ( ((data[i*w + j] >> (7-k)) & 0x01) != 0) rtgui_dc_draw_point(dc, x + 8*j + k, y + i); } +RTM_EXPORT(rtgui_dc_draw_mono_bmp); void rtgui_dc_draw_byte(struct rtgui_dc*dc, int x, int y, int h, const rt_uint8_t* data) { rtgui_dc_draw_mono_bmp(dc, x, y, 8, h, data); } +RTM_EXPORT(rtgui_dc_draw_byte); void rtgui_dc_draw_word(struct rtgui_dc*dc, int x, int y, int h, const rt_uint8_t* data) { rtgui_dc_draw_mono_bmp(dc, x, y, 16, h, data); } +RTM_EXPORT(rtgui_dc_draw_word); void rtgui_dc_draw_border(struct rtgui_dc* dc, rtgui_rect_t* rect, int flag) { @@ -395,6 +410,7 @@ void rtgui_dc_draw_border(struct rtgui_dc* dc, rtgui_rect_t* rect, int flag) /* restore color */ RTGUI_DC_FC(dc) = color; } +RTM_EXPORT(rtgui_dc_draw_border); void rtgui_dc_draw_polygon(struct rtgui_dc* dc, const int *vx, const int *vy, int count) { @@ -427,6 +443,7 @@ void rtgui_dc_draw_polygon(struct rtgui_dc* dc, const int *vx, const int *vy, in } rtgui_dc_draw_line(dc, *x1, *y1, *vx, *vy); } +RTM_EXPORT(rtgui_dc_draw_polygon); void rtgui_dc_draw_regular_polygon(struct rtgui_dc* dc, int x, int y, int r, int count, rt_uint16_t angle) { @@ -474,6 +491,7 @@ void rtgui_dc_draw_regular_polygon(struct rtgui_dc* dc, int x, int y, int r, int rtgui_free(y_head); } +RTM_EXPORT(rtgui_dc_draw_regular_polygon); void rtgui_dc_fill_polygon(struct rtgui_dc* dc, const int* vx, const int* vy, int count) { @@ -556,6 +574,7 @@ void rtgui_dc_fill_polygon(struct rtgui_dc* dc, const int* vx, const int* vy, in /* release memory */ rtgui_free(poly_ints); } +RTM_EXPORT(rtgui_dc_fill_polygon); void rtgui_dc_draw_circle(struct rtgui_dc* dc, int x, int y, int r) { @@ -632,6 +651,7 @@ void rtgui_dc_draw_circle(struct rtgui_dc* dc, int x, int y, int r) cx++; }while (cx <= cy); } +RTM_EXPORT(rtgui_dc_draw_circle); void rtgui_dc_fill_circle(struct rtgui_dc* dc, rt_int16_t x, rt_int16_t y, rt_int16_t r) { @@ -707,6 +727,7 @@ void rtgui_dc_fill_circle(struct rtgui_dc* dc, rt_int16_t x, rt_int16_t y, rt_in cx++; } while (cx <= cy); } +RTM_EXPORT(rtgui_dc_fill_circle); void rtgui_dc_draw_arc(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16_t r, rt_int16_t start, rt_int16_t end) { @@ -926,6 +947,7 @@ void rtgui_dc_draw_arc(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16 cx++; } while (cx <= cy); } +RTM_EXPORT(rtgui_dc_draw_arc); void rtgui_dc_draw_annulus(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16_t r1, rt_int16_t r2, rt_int16_t start, rt_int16_t end) { @@ -977,6 +999,7 @@ void rtgui_dc_draw_annulus(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_i rtgui_dc_draw_line(dc, start_x, start_y, end_x, end_y); } +RTM_EXPORT(rtgui_dc_draw_annulus); void rtgui_dc_draw_sector(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16_t r, rt_int16_t start, rt_int16_t end) { @@ -1010,6 +1033,7 @@ void rtgui_dc_draw_sector(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_in rtgui_dc_draw_line(dc, x, y, start_x, start_y); rtgui_dc_draw_line(dc, x, y, end_x, end_y); } +RTM_EXPORT(rtgui_dc_draw_sector); void rtgui_dc_fill_sector(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16_t r, rt_int16_t start, rt_int16_t end) { @@ -1044,6 +1068,7 @@ void rtgui_dc_fill_sector(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_in rtgui_dc_draw_line(dc, x, y, start_x, start_y); }while(!((start_x == end_x) && (start_y == end_y))); } +RTM_EXPORT(rtgui_dc_fill_sector); void rtgui_dc_draw_ellipse(struct rtgui_dc* dc, rt_int16_t x, rt_int16_t y, rt_int16_t rx, rt_int16_t ry) { @@ -1192,6 +1217,7 @@ void rtgui_dc_draw_ellipse(struct rtgui_dc* dc, rt_int16_t x, rt_int16_t y, rt_i } while (i > h); } } +RTM_EXPORT(rtgui_dc_draw_ellipse); void rtgui_dc_fill_ellipse(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16_t rx, rt_int16_t ry) { @@ -1300,5 +1326,5 @@ void rtgui_dc_fill_ellipse(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_i } while (i > h); } } - +RTM_EXPORT(rtgui_dc_fill_ellipse); diff --git a/components/rtgui/common/dc_client.c b/components/rtgui/common/dc_client.c index abff12b3a0..0046bc75ad 100644 --- a/components/rtgui/common/dc_client.c +++ b/components/rtgui/common/dc_client.c @@ -62,12 +62,14 @@ struct rtgui_dc* rtgui_dc_begin_drawing(rtgui_widget_t* owner) return dc; } +RTM_EXPORT(rtgui_dc_begin_drawing); void rtgui_dc_end_drawing(struct rtgui_dc* dc) { dc->engine->fini(dc); rtgui_screen_unlock(); } +RTM_EXPORT(rtgui_dc_end_drawing); const struct rtgui_dc_engine dc_client_engine = { diff --git a/components/rtgui/common/filerw.c b/components/rtgui/common/filerw.c index dd7ab18f20..5a0390c7c5 100644 --- a/components/rtgui/common/filerw.c +++ b/components/rtgui/common/filerw.c @@ -16,7 +16,6 @@ #include <rtgui/rtgui_system.h> #ifdef RTGUI_USING_DFS_FILERW -#include <dfs_posix.h> /* standard file read/write */ struct rtgui_filerw_stdio @@ -95,93 +94,7 @@ static int stdio_close(struct rtgui_filerw *context) return -1; } -#elif defined(RTGUI_USING_STDIO_FILERW) -#include <stdio.h> -/* standard file read/write */ -struct rtgui_filerw_stdio -{ - /* inherit from rtgui_filerw */ - struct rtgui_filerw parent; - - FILE* fp; -}; - -static int stdio_seek(struct rtgui_filerw *context, rt_off_t offset, int whence) -{ - struct rtgui_filerw_stdio* stdio_filerw = (struct rtgui_filerw_stdio *)context; - int stdio_whence[3] = {SEEK_SET, SEEK_CUR, SEEK_END}; - - if (whence < RTGUI_FILE_SEEK_SET || whence > RTGUI_FILE_SEEK_END) - { - return -1; - } - - if (fseek(stdio_filerw->fp, offset, stdio_whence[whence]) == 0) - { - return ftell(stdio_filerw->fp); - } - - return -1; -} - -static int stdio_read(struct rtgui_filerw *context, void *ptr, rt_size_t size, rt_size_t maxnum) -{ - size_t nread; - struct rtgui_filerw_stdio* stdio_filerw = (struct rtgui_filerw_stdio *)context; - - nread = fread(ptr, size, maxnum, stdio_filerw->fp); - if (nread == 0 && ferror(stdio_filerw->fp)) - { - return -1; - } - - return nread; -} - -static int stdio_write(struct rtgui_filerw *context, const void *ptr, rt_size_t size, rt_size_t num) -{ - size_t nwrote; - struct rtgui_filerw_stdio* stdio_filerw = (struct rtgui_filerw_stdio *)context; - - nwrote = fwrite(ptr, size, num, stdio_filerw->fp); - - if ( nwrote == 0 && ferror(stdio_filerw->fp) ) - { - return -1; - } - - return nwrote; -} - -static int stdio_tell(struct rtgui_filerw* context) -{ - struct rtgui_filerw_stdio* stdio_filerw = (struct rtgui_filerw_stdio *)context; - - return ftell(stdio_filerw->fp); -} - -static int stdio_eof(struct rtgui_filerw* context) -{ - struct rtgui_filerw_stdio* stdio_filerw = (struct rtgui_filerw_stdio *)context; - - return feof(stdio_filerw->fp); -} - -static int stdio_close(struct rtgui_filerw *context) -{ - struct rtgui_filerw_stdio* stdio_filerw = (struct rtgui_filerw_stdio *)context; - - if (stdio_filerw) - { - fclose(stdio_filerw->fp); - rtgui_free(stdio_filerw); - - return 0; - } - - return -1; -} #endif /* memory file read/write */ @@ -302,7 +215,11 @@ static int parse_mode(const char *mode) switch (*mode) { case 0: return f; - case 'b': break; +#ifdef _WIN32 + case 'b': f|=O_BINARY;break; +#else + case 'b': break; +#endif case 'r': f=O_RDONLY; break; case 'w': f=O_WRONLY|O_CREAT|O_TRUNC; break; case 'a': f=O_WRONLY|O_CREAT|O_APPEND; break; @@ -321,7 +238,11 @@ struct rtgui_filerw* rtgui_filerw_create_file(const char* filename, const char* RT_ASSERT(filename != RT_NULL); rw = RT_NULL; +#ifdef _WIN32 + fd = _open(filename, parse_mode(mode), 0); +#else fd = open(filename, parse_mode(mode), 0); +#endif if ( fd >= 0 ) { @@ -342,35 +263,7 @@ struct rtgui_filerw* rtgui_filerw_create_file(const char* filename, const char* return &(rw->parent); } -#elif defined(RTGUI_USING_STDIO_FILERW) -struct rtgui_filerw* rtgui_filerw_create_file(const char* filename, const char* mode) -{ - FILE *fp; - struct rtgui_filerw_stdio *rw; - RT_ASSERT(filename != RT_NULL); - - rw = RT_NULL; - fp = fopen(filename, mode); - - if ( fp != NULL ) - { - rw = (struct rtgui_filerw_stdio*) rtgui_malloc(sizeof(struct rtgui_filerw_stdio)); - if (rw != RT_NULL) - { - rw->parent.seek = stdio_seek; - rw->parent.read = stdio_read; - rw->parent.write = stdio_write; - rw->parent.tell = stdio_tell; - rw->parent.close = stdio_close; - rw->parent.eof = stdio_eof; - - rw->fp = fp; - } - } - - return &(rw->parent); -} #endif struct rtgui_filerw* rtgui_filerw_create_mem(const rt_uint8_t* mem, rt_size_t size) @@ -447,3 +340,12 @@ int rtgui_filerw_close(struct rtgui_filerw* context) return 0; } + +int rtgui_filerw_unlink(const char *filename) +{ +#ifdef _WIN32 + return _unlink(filename); +#else + return unlink(filename); +#endif +} diff --git a/components/rtgui/common/font_hz_file.c b/components/rtgui/common/font_hz_file.c index f5945442a8..f08c925a04 100644 --- a/components/rtgui/common/font_hz_file.c +++ b/components/rtgui/common/font_hz_file.c @@ -7,7 +7,19 @@ #include <rtgui/rtgui_system.h> #ifdef RTGUI_USING_HZ_FILE +#ifdef _WIN32 +#include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <io.h> +#define open _open +#define close _close +#define read _read +#define write _write +#define unlink _unlink +#else #include <dfs_posix.h> +#endif #define HZ_CACHE_MAX 64 diff --git a/components/rtgui/common/image.c b/components/rtgui/common/image.c index 424c684729..843d598360 100644 --- a/components/rtgui/common/image.c +++ b/components/rtgui/common/image.c @@ -81,7 +81,7 @@ static struct rtgui_image_engine* rtgui_image_get_engine(const char* type) return RT_NULL; } -#if defined(RTGUI_USING_DFS_FILERW) || defined(RTGUI_USING_STDIO_FILERW) +#if defined(RTGUI_USING_DFS_FILERW) struct rtgui_image_engine* rtgui_image_get_engine_by_filename(const char* fn) { struct rtgui_list_node *node; @@ -105,6 +105,7 @@ struct rtgui_image_engine* rtgui_image_get_engine_by_filename(const char* fn) return RT_NULL; } +RTM_EXPORT(rtgui_image_get_engine_by_filename); struct rtgui_image* rtgui_image_create_from_file(const char* type, const char* filename, rt_bool_t load) { @@ -153,6 +154,7 @@ struct rtgui_image* rtgui_image_create_from_file(const char* type, const char* f return image; } +RTM_EXPORT(rtgui_image_create_from_file); struct rtgui_image* rtgui_image_create(const char* filename, rt_bool_t load) { @@ -201,6 +203,7 @@ struct rtgui_image* rtgui_image_create(const char* filename, rt_bool_t load) return image; } +RTM_EXPORT(rtgui_image_create); #endif struct rtgui_image* rtgui_image_create_from_mem(const char* type, const rt_uint8_t* data, rt_size_t length, rt_bool_t load) @@ -250,6 +253,7 @@ struct rtgui_image* rtgui_image_create_from_mem(const char* type, const rt_uint8 return image; } +RTM_EXPORT(rtgui_image_create_from_mem); void rtgui_image_destroy(struct rtgui_image* image) { @@ -260,6 +264,7 @@ void rtgui_image_destroy(struct rtgui_image* image) rtgui_free(image->palette); rtgui_free(image); } +RTM_EXPORT(rtgui_image_destroy); /* register an image engine */ void rtgui_image_register_engine(struct rtgui_image_engine* engine) @@ -268,6 +273,7 @@ void rtgui_image_register_engine(struct rtgui_image_engine* engine) rtgui_list_append(&_rtgui_system_image_list, &(engine->list)); } +RTM_EXPORT(rtgui_image_register_engine); void rtgui_image_blit(struct rtgui_image* image, struct rtgui_dc* dc, struct rtgui_rect* rect) { @@ -282,6 +288,7 @@ void rtgui_image_blit(struct rtgui_image* image, struct rtgui_dc* dc, struct rtg image->engine->image_blit(image, dc, rect); } } +RTM_EXPORT(rtgui_image_blit); struct rtgui_image_palette* rtgui_image_palette_create(rt_uint32_t ncolors) { @@ -296,6 +303,7 @@ struct rtgui_image_palette* rtgui_image_palette_create(rt_uint32_t ncolors) return palette; } +RTM_EXPORT(rtgui_image_palette_create); void rtgui_image_get_rect(struct rtgui_image* image, struct rtgui_rect* rect) { @@ -305,4 +313,5 @@ void rtgui_image_get_rect(struct rtgui_image* image, struct rtgui_rect* rect) rect->x1 = 0; rect->y1 = 0; rect->x2 = image->w; rect->y2 = image->h; } +RTM_EXPORT(rtgui_image_get_rect); diff --git a/components/rtgui/common/image_bmp.c b/components/rtgui/common/image_bmp.c index 71f7adbec8..78c60d796b 100644 --- a/components/rtgui/common/image_bmp.c +++ b/components/rtgui/common/image_bmp.c @@ -832,6 +832,178 @@ static void rtgui_image_bmp_blit(struct rtgui_image *image, struct rtgui_dc *dc, while (0); } +/* + * config bitmap header. + */ +void rtgui_image_bmp_header_cfg(struct rtgui_image_bmp_header *bhr, rt_int32_t w, rt_int32_t h, rt_uint16_t bits_per_pixel) +{ + int image_size = w * h * bits_per_pixel/8; + int header_size = sizeof(struct rtgui_image_bmp_header); + + bhr->bfType = 0x4d42; /* BM */ + bhr->bfSize = header_size + image_size; /* data size */ + bhr->bfReserved1 = 0; + bhr->bfReserved2 = 0; + bhr->bfOffBits = header_size; + + bhr->biSize = 40; /* sizeof BITMAPINFOHEADER */ + bhr->biWidth = w; + bhr->biHeight = h; + bhr->biPlanes = 1; + bhr->biBitCount = bits_per_pixel; + bhr->biCompression = BI_BITFIELDS; + bhr->biSizeImage = image_size; + bhr->biXPelsPerMeter = 0; + bhr->biYPelsPerMeter = 0; + bhr->biClrUsed = 0; + bhr->biClrImportant = 0; + if(bhr->biBitCount == 16 && bhr->biCompression == BI_BITFIELDS) + { + bhr->bfSize += 12; + bhr->bfOffBits += 12; + } +} + +#define WRITE_CLUSTER_SIZE 2048 +void bmp_align_write(struct rtgui_filerw *file, char *dest, char *src, rt_int32_t len, rt_int32_t *count) +{ + rt_int32_t len_bak = len; + + while(len) + { + if(*count >= WRITE_CLUSTER_SIZE) + { + rtgui_filerw_write(file, dest, WRITE_CLUSTER_SIZE, 1); + *count = 0; + } + *(dest + *count) = *(src + (len_bak-len)); + len --; + (*count) ++; + } +} + +/* + * Grab screen and save as a BMP file + * MACRO RGB_CONVERT_TO_BGR: If the pixel of colors is BGR mode, defined it. + */ +void screenshot(const char *filename) +{ + struct rtgui_filerw *file; + int w, h, i, pitch; + rt_uint16_t *src; + rt_uint32_t mask; + struct rtgui_image_bmp_header bhr; + struct rtgui_graphic_driver *grp = hw_driver; +#ifdef RGB_CONVERT_TO_BGR + int j; + rt_uint16_t *line_buf; + rt_uint16_t color, tmp; +#endif + char *pixel_buf; + rt_int32_t write_count=0; + + file = rtgui_filerw_create_file(filename, "wb"); + if(file == RT_NULL) + { + rt_kprintf("create file failed\n"); + return; + } + + w = grp->width; + h = grp->height; + + pitch = w * sizeof(rt_uint16_t); +#ifdef RGB_CONVERT_TO_BGR + line_buf = rt_malloc(pitch); + if(line_buf == RT_NULL) + { + rt_kprintf("no memory!\n"); + return; + } +#endif + pixel_buf = rt_malloc(WRITE_CLUSTER_SIZE); + if(pixel_buf == RT_NULL) + { + rt_kprintf("no memory!\n"); +#ifdef RGB_CONVERT_TO_BGR + rt_free(line_buf); +#endif + return; + } + + rtgui_image_bmp_header_cfg(&bhr, w, h, grp->bits_per_pixel); + + bmp_align_write(file, pixel_buf, (char*)&bhr, + sizeof(struct rtgui_image_bmp_header), &write_count); + + if(bhr.biCompression == BI_BITFIELDS) + { + mask = 0xF800; /* Red Mask */ + bmp_align_write(file, pixel_buf, (char*)&mask, 4, &write_count); + mask = 0x07E0; /* Green Mask */ + bmp_align_write(file, pixel_buf, (char*)&mask, 4, &write_count); + mask = 0x001F; /* Blue Mask */ + bmp_align_write(file, pixel_buf, (char*)&mask, 4, &write_count); + } + rtgui_screen_lock(RT_WAITING_FOREVER); + if(grp->framebuffer != RT_NULL) + { + src = (rt_uint16_t*)grp->framebuffer; + src += w * h; + for(i=0; i<h; i++) + { + src -= w; +#ifdef RGB_CONVERT_TO_BGR + for(j=0; j<w; j++) + { + tmp = *(src + j); + color = (tmp & 0x001F)<<11; + color += (tmp & 0x07E0); + color += (tmp & 0xF800)>>11; + + *(line_buf + i) = color; + } + bmp_align_write(file, pixel_buf, (char*)line_buf, pitch, &write_count); +#else + bmp_align_write(file, pixel_buf, (char*)src, pitch, &write_count); +#endif + } + } + else + { + rtgui_color_t pixel_color; + rt_uint16_t write_color; + int x; + for(i=h-1; i>=0; i--) + { + x = 0; + if(i%10==0)rt_kprintf(">",i); + while(x < w) + { + grp->ops->get_pixel(&pixel_color, x, i); + write_color = rtgui_color_to_565p(pixel_color); + bmp_align_write(file, pixel_buf, (char*)&write_color, + sizeof(rt_uint16_t), &write_count); + x++; + } + } + } + /* write The tail of the last */ + if(write_count < WRITE_CLUSTER_SIZE) + rtgui_filerw_write(file, pixel_buf, write_count, 1); + rtgui_screen_unlock(); +#ifdef RGB_CONVERT_TO_BGR + rt_free(line_buf); +#endif + rt_free(pixel_buf); + rt_kprintf("bmp create succeed.\n"); + rtgui_filerw_close(file); +} +#ifdef RT_USING_FINSH +#include <finsh.h> +FINSH_FUNCTION_EXPORT(screenshot, usage: screenshot(filename)); +#endif + void rtgui_image_bmp_init() { /* register bmp on image system */ diff --git a/components/rtgui/common/rtgui_app.c b/components/rtgui/common/rtgui_app.c index da63107172..68876926dc 100644 --- a/components/rtgui/common/rtgui_app.c +++ b/components/rtgui/common/rtgui_app.c @@ -112,6 +112,7 @@ __mq_err: tid->user_data = 0; return RT_NULL; } +RTM_EXPORT(rtgui_app_create); #define _rtgui_application_check(app) \ do { \ @@ -152,6 +153,7 @@ void rtgui_app_destroy(struct rtgui_app *app) rt_mq_delete(app->mq); rtgui_object_destroy(RTGUI_OBJECT(app)); } +RTM_EXPORT(rtgui_app_destroy); struct rtgui_app* rtgui_app_self(void) { @@ -164,6 +166,7 @@ struct rtgui_app* rtgui_app_self(void) return app; } +RTM_EXPORT(rtgui_app_self); void rtgui_app_set_onidle(rtgui_idle_func_t onidle) { @@ -173,6 +176,7 @@ void rtgui_app_set_onidle(rtgui_idle_func_t onidle) if (app != RT_NULL) app->on_idle = onidle; } +RTM_EXPORT(rtgui_app_set_onidle); rtgui_idle_func_t rtgui_app_get_onidle(void) { @@ -184,6 +188,7 @@ rtgui_idle_func_t rtgui_app_get_onidle(void) else return RT_NULL; } +RTM_EXPORT(rtgui_app_get_onidle); rt_inline rt_bool_t _rtgui_application_dest_handle( struct rtgui_app *app, @@ -339,12 +344,14 @@ rt_base_t rtgui_app_run(struct rtgui_app *app) return app->exit_code; } +RTM_EXPORT(rtgui_app_run); void rtgui_app_exit(struct rtgui_app* app, rt_uint16_t code) { --app->ref_count; app->exit_code = code; } +RTM_EXPORT(rtgui_app_exit); void rtgui_app_activate(struct rtgui_app *app) { @@ -355,6 +362,7 @@ void rtgui_app_activate(struct rtgui_app *app) rtgui_send(app->tid, RTGUI_EVENT(&event), sizeof(struct rtgui_event_application)); } +RTM_EXPORT(rtgui_app_activate); void rtgui_app_close(struct rtgui_app *app) { @@ -365,6 +373,7 @@ void rtgui_app_close(struct rtgui_app *app) rtgui_send(app->tid, RTGUI_EVENT(&event), sizeof(struct rtgui_event_application)); } +RTM_EXPORT(rtgui_app_close); /** * set this application as window manager @@ -389,6 +398,7 @@ rt_err_t rtgui_app_set_as_wm(void) return RT_ERROR; } +RTM_EXPORT(rtgui_app_set_as_wm); void rtgui_app_set_main_win(struct rtgui_win* win) { @@ -400,3 +410,5 @@ void rtgui_app_set_main_win(struct rtgui_win* win) app->main_object = RTGUI_OBJECT(win); } } +RTM_EXPORT(rtgui_app_set_main_win); + diff --git a/components/rtgui/common/rtgui_object.c b/components/rtgui/common/rtgui_object.c index 95a7c4e17e..81c3acc701 100644 --- a/components/rtgui/common/rtgui_object.c +++ b/components/rtgui/common/rtgui_object.c @@ -34,6 +34,7 @@ DEFINE_CLASS_TYPE(object, "object", _rtgui_object_constructor, _rtgui_object_destructor, sizeof(struct rtgui_object)); +RTM_EXPORT(_rtgui_object); void rtgui_type_object_construct(const rtgui_type_t *type, rtgui_object_t *object) { @@ -121,6 +122,7 @@ rtgui_object_t *rtgui_object_create(rtgui_type_t *object_type) return new_object; } +RTM_EXPORT(rtgui_object_create); /** * @brief Destroys the object: it first sets the weak-pointers to RT_NULL, emits the "destroyed" signal, and then @@ -146,6 +148,7 @@ void rtgui_object_destroy(rtgui_object_t *object) /* release object */ rtgui_free(object); } +RTM_EXPORT(rtgui_object_destroy); /** * @brief Checks if @a object can be cast to @a type. @@ -166,6 +169,8 @@ rtgui_object_t *rtgui_object_check_cast(rtgui_object_t *obj, rtgui_type_t *obj_t return obj; } +RTM_EXPORT(rtgui_object_check_cast); + /** * @brief Gets the type of the object @@ -178,6 +183,7 @@ const rtgui_type_t *rtgui_object_object_type_get(rtgui_object_t *object) return object->type; } +RTM_EXPORT(rtgui_object_object_type_get); void rtgui_object_set_event_handler(struct rtgui_object *object, rtgui_event_handler_ptr handler) { @@ -185,9 +191,11 @@ void rtgui_object_set_event_handler(struct rtgui_object *object, rtgui_event_han object->event_handler = handler; } +RTM_EXPORT(rtgui_object_set_event_handler); rt_bool_t rtgui_object_event_handler(struct rtgui_object *object, struct rtgui_event* event) { return RT_FALSE; } +RTM_EXPORT(rtgui_object_event_handler); diff --git a/components/rtgui/common/rtgui_system.c b/components/rtgui/common/rtgui_system.c index 4669ef3010..ed2ad57705 100644 --- a/components/rtgui/common/rtgui_system.c +++ b/components/rtgui/common/rtgui_system.c @@ -87,6 +87,7 @@ rtgui_timer_t* rtgui_timer_create(rt_int32_t time, rt_int32_t flag, rtgui_timeou return timer; } +RTM_EXPORT(rtgui_timer_create); void rtgui_timer_destory(rtgui_timer_t* timer) { @@ -100,6 +101,7 @@ void rtgui_timer_destory(rtgui_timer_t* timer) rtgui_free(timer); } +RTM_EXPORT(rtgui_timer_destory); void rtgui_timer_start(rtgui_timer_t* timer) { @@ -108,6 +110,7 @@ void rtgui_timer_start(rtgui_timer_t* timer) /* start rt-thread timer */ rt_timer_start(&(timer->timer)); } +RTM_EXPORT(rtgui_timer_start); void rtgui_timer_stop (rtgui_timer_t* timer) { @@ -116,6 +119,7 @@ void rtgui_timer_stop (rtgui_timer_t* timer) /* stop rt-thread timer */ rt_timer_stop(&(timer->timer)); } +RTM_EXPORT(rtgui_timer_stop); /************************************************************************/ /* RTGUI Memory Management */ @@ -267,6 +271,7 @@ void* rtgui_malloc(rt_size_t size) return ptr; } +RTM_EXPORT(rtgui_malloc); void* rtgui_realloc(void* ptr, rt_size_t size) { @@ -285,6 +290,7 @@ void* rtgui_realloc(void* ptr, rt_size_t size) return new_ptr; } +RTM_EXPORT(rtgui_realloc); void rtgui_free(void* ptr) { @@ -295,6 +301,7 @@ void rtgui_free(void* ptr) rt_free(ptr); } +RTM_EXPORT(rtgui_free); #if defined(RTGUI_MEM_TRACE) && defined(RT_USING_FINSH) #include <finsh.h> @@ -560,6 +567,7 @@ rt_err_t rtgui_send(rt_thread_t tid, rtgui_event_t* event, rt_size_t event_size) return result; } +RTM_EXPORT(rtgui_send); rt_err_t rtgui_send_urgent(rt_thread_t tid, rtgui_event_t* event, rt_size_t event_size) { @@ -583,6 +591,7 @@ rt_err_t rtgui_send_urgent(rt_thread_t tid, rtgui_event_t* event, rt_size_t even return result; } +RTM_EXPORT(rtgui_send_urgent); rt_err_t rtgui_send_sync(rt_thread_t tid, rtgui_event_t* event, rt_size_t event_size) { @@ -631,6 +640,7 @@ __return: rt_mb_detach(&ack_mb); return r; } +RTM_EXPORT(rtgui_send_sync); rt_err_t rtgui_ack(rtgui_event_t* event, rt_int32_t status) { @@ -641,6 +651,7 @@ rt_err_t rtgui_ack(rtgui_event_t* event, rt_int32_t status) return RT_EOK; } +RTM_EXPORT(rtgui_ack); rt_err_t rtgui_recv(rtgui_event_t* event, rt_size_t event_size) { @@ -658,6 +669,7 @@ rt_err_t rtgui_recv(rtgui_event_t* event, rt_size_t event_size) return r; } +RTM_EXPORT(rtgui_recv); rt_err_t rtgui_recv_nosuspend(rtgui_event_t* event, rt_size_t event_size) { @@ -675,6 +687,7 @@ rt_err_t rtgui_recv_nosuspend(rtgui_event_t* event, rt_size_t event_size) return r; } +RTM_EXPORT(rtgui_recv_nosuspend); rt_err_t rtgui_recv_filter(rt_uint32_t type, rtgui_event_t* event, rt_size_t event_size) { @@ -704,33 +717,41 @@ rt_err_t rtgui_recv_filter(rt_uint32_t type, rtgui_event_t* event, rt_size_t eve return -RT_ERROR; } +RTM_EXPORT(rtgui_recv_filter); rt_thread_t rtgui_get_server(void) { return rt_thread_find("rtgui"); } +RTM_EXPORT(rtgui_get_server); void rtgui_set_mainwin_rect(struct rtgui_rect *rect) { _mainwin_rect = *rect; } +RTM_EXPORT(rtgui_set_mainwin_rect); void rtgui_get_mainwin_rect(struct rtgui_rect *rect) { *rect = _mainwin_rect; } +RTM_EXPORT(rtgui_get_mainwin_rect); void rtgui_get_screen_rect(struct rtgui_rect *rect) { rtgui_graphic_driver_get_rect(rtgui_graphic_driver_get_default(), rect); } +RTM_EXPORT(rtgui_get_screen_rect); void rtgui_screen_lock(rt_int32_t timeout) { rt_mutex_take(&_screen_lock, timeout); } +RTM_EXPORT(rtgui_screen_lock); void rtgui_screen_unlock(void) { rt_mutex_release(&_screen_lock); } +RTM_EXPORT(rtgui_screen_unlock); + |
