Skip to content

20250617提交的improve mutable_image有问题 #966

@Sokyx

Description

@Sokyx

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions