-
Notifications
You must be signed in to change notification settings - Fork 792
Open
Description
1、本次提交,是解决在xml里添加mutable_image后,即使代码没有去使用,后台也在不断刷新,占用大量CPU,但改法有些问题,原改法在paint_self函数中设置了has_bitmap标志位,存在以下问题:
- 由于has_bitmap标志位只在paint_self中设置,如果在paint_self函数里,确实是没有bitmap,导致has_bitmap设置为false,后续即使需要绘制,定时器也永远无法执行invalidate_force刷新,paint_self函数也不会被执行了。
2、如果是要解决这个问题,是否应该是新增一个函数,由用户决定是否开始刷新,需要用户主动调用,patch如下:
soky@ubuntu:~/starnet_git/awtk/awtk$ git diff src/ext_widgets/mutable_image/
diff --git a/src/ext_widgets/mutable_image/mutable_image.c b/src/ext_widgets/mutable_image/mutable_image.c
index 222c87a..40f7cb2 100644
--- a/src/ext_widgets/mutable_image/mutable_image.c
+++ b/src/ext_widgets/mutable_image/mutable_image.c
@@ -89,8 +89,6 @@ ret_t mutable_image_on_paint_self(widget_t* widget, canvas_t* canvas) {
mutable_image->is_need_redraw = FALSE;
}
- mutable_image->has_bitmap = bitmap != NULL ? TRUE : FALSE;
-
if (bitmap == NULL) {
return RET_FAIL;
}
@@ -138,8 +136,9 @@ ret_t mutable_image_on_attach_parent(widget_t* widget, widget_t* parent) {
widget_t* win = widget_get_window(parent);
mutable_image_t* mutable_image = MUTABLE_IMAGE(widget);
return_value_if_fail(mutable_image != NULL, RET_BAD_PARAMS);
- if (widget_is_designing_window(win)) {
+ if (widget_is_designing_window(win) && mutable_image->timer_id != TK_INVALID_ID) {
widget_remove_timer(widget, mutable_image->timer_id);
+ mutable_image->timer_id = TK_INVALID_ID;
}
return RET_OK;
}
@@ -176,7 +175,7 @@ static ret_t mutable_image_init_impl(widget_t* widget) {
return_value_if_fail(mutable_image != NULL, RET_BAD_PARAMS);
image_base_init(widget);
mutable_image->is_need_redraw = TRUE;
- mutable_image->timer_id = widget_add_timer(widget, mutable_image_invalidate, 16);
+ mutable_image->timer_id = TK_INVALID_ID;
if (widget != NULL && widget->parent != NULL) {
mutable_image_on_attach_parent(widget, widget->parent);
@@ -196,13 +195,10 @@ static ret_t mutable_image_invalidate(const timer_info_t* info) {
widget_t* widget = WIDGET(info->ctx);
mutable_image_t* mutable_image = MUTABLE_IMAGE(widget);
ENSURE(mutable_image);
- return_value_if_fail(widget->visible, RET_REPEAT);
if (mutable_image->need_redraw == NULL ||
mutable_image->need_redraw(mutable_image->need_redraw_ctx)) {
- if (mutable_image->has_bitmap) {
- mutable_image_invalidate_force(widget);
- }
+ mutable_image_invalidate_force(widget);
}
return RET_REPEAT;
@@ -253,6 +249,19 @@ ret_t mutable_image_set_create_image(widget_t* widget, mutable_image_create_imag
return RET_OK;
}
+ret_t mutable_image_set_invalidate_force(widget_t* widget, bool_t invalidate)
+{
+ mutable_image_t* mutable_image = MUTABLE_IMAGE(widget);
+ return_value_if_fail(mutable_image != NULL, RET_BAD_PARAMS);
+ if (invalidate && mutable_image->timer_id == TK_INVALID_ID) {
+ mutable_image->timer_id = widget_add_timer(widget, mutable_image_invalidate, 16);
+ } else if (!invalidate && mutable_image->timer_id != TK_INVALID_ID) {
+ widget_remove_timer(widget, mutable_image->timer_id);
+ mutable_image->timer_id = TK_INVALID_ID;
+ }
+ return RET_OK;
+}
+
ret_t mutable_image_set_framebuffer(widget_t* widget, uint32_t w, uint32_t h,
bitmap_format_t format, uint8_t* buff) {
mutable_image_t* mutable_image = MUTABLE_IMAGE(widget);
diff --git a/src/ext_widgets/mutable_image/mutable_image.h b/src/ext_widgets/mutable_image/mutable_image.h
index 81df625..99ea3e4 100644
--- a/src/ext_widgets/mutable_image/mutable_image.h
+++ b/src/ext_widgets/mutable_image/mutable_image.h
@@ -78,7 +78,6 @@ typedef struct _mutable_image_t {
/*private*/
bool_t is_need_redraw;
- bool_t has_bitmap;
uint32_t timer_id;
void* prepare_image_ctx;
mutable_image_prepare_image_t prepare_image;
@@ -170,6 +169,18 @@ ret_t mutable_image_set_prepare_image(widget_t* widget, mutable_image_prepare_im
*/
ret_t mutable_image_set_create_image(widget_t* widget, mutable_image_create_image_t create_image,
void* create_image_ctx);
+
+
+/**
+ * @method mutable_image_set_invalidate_force
+ * 设置mutable_image定时刷新(16ms)
+ *
+ * @param {widget_t*} widget mutable_image对象。
+ * @param {bool_t} 是否定时刷新,为FALSE时停止定时器,为TRUE时开启定时器刷新
+ *
+ * @return {ret_t} 返回RET_OK表示成功,否则表示失败。
+ */
+ret_t mutable_image_set_invalidate_force(widget_t* widget, bool_t invalidate);
/**
* @method mutable_image_set_framebuffer
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels