/* * Function : _libaroma_ctl_fragment_window_control_draw_begin * Return Value: LIBAROMA_CANVASP * Descriptions: get canvas for child control */ LIBAROMA_CANVASP _libaroma_ctl_fragment_window_control_draw_begin( LIBAROMA_WINDOWP win,LIBAROMA_CONTROLP cctl ){ _VALIDATE_FRAGMENT(NULL); if (!wind->active_state){ return NULL; } LIBAROMA_CANVASP c=NULL; libaroma_mutex_lock(me->dmutex); if (me->on_direct_canvas){ int x = cctl->x; int y = cctl->y; int w = cctl->w; int h = cctl->h; LIBAROMA_CANVASP ccv = libaroma_control_draw_begin(ctl); if (ccv){ if ((ccv->w>x)&&(ccv->h>y)){ c = libaroma_canvas_area(ccv,x,y,w,h); } libaroma_canvas_free(ccv); } } else { if (win->dc!=NULL){ c = libaroma_canvas_area( win->dc, cctl->x, cctl->y, cctl->w, cctl->h ); } } libaroma_mutex_unlock(me->dmutex); return c; } /* End of _libaroma_ctl_fragment_window_control_draw_begin */
/* * Function : _libaroma_ctl_pager_window_control_draw_begin * Return Value: LIBAROMA_CANVASP * Descriptions: get canvas for child control */ LIBAROMA_CANVASP _libaroma_ctl_pager_window_control_draw_begin( LIBAROMA_WINDOWP win,LIBAROMA_CONTROLP cctl ){ LIBAROMA_CONTROLP ctl=(LIBAROMA_CONTROLP) win->client_data; _LIBAROMA_CTL_CHECK( _libaroma_ctl_pager_handler, _LIBAROMA_CTL_PAGERP, NULL ); LIBAROMA_CANVASP c=NULL; libaroma_mutex_lock(me->mutex); if (!me->on_direct_canvas){ if (win->dc==NULL){ libaroma_mutex_unlock(me->mutex); return NULL; } c = libaroma_canvas_area( win->dc, cctl->x, cctl->y, cctl->w, cctl->h ); } else{ int xt = me->scroll_x; int x = cctl->x - xt; int y = cctl->y; int w = cctl->w; int h = cctl->h; LIBAROMA_CANVASP ccv = libaroma_control_draw_begin(ctl); if (ccv){ if ((ccv->w>x)&&(ccv->h>y)){ c = libaroma_canvas_area( ccv,x,y,w,h ); } libaroma_canvas_free(ccv); } else{ libaroma_mutex_unlock(me->mutex); return NULL; } } libaroma_mutex_unlock(me->mutex); return c; } /* End of _libaroma_ctl_pager_window_control_draw_begin */
/* * Function : libaroma_control_draw_begin * Return Value: LIBAROMA_CANVASP * Descriptions: begin control ondraw */ LIBAROMA_CANVASP libaroma_control_draw_begin( LIBAROMA_CONTROLP ctl){ if (!libaroma_window_isactive(ctl->window)|| !libaroma_control_isvisible(ctl)){ return NULL; } LIBAROMA_WINDOWP win = ctl->window; if (win->handler!=NULL){ if (win->handler->control_draw_begin!=NULL){ return win->handler->control_draw_begin( win, ctl ); } } if (win->dc==NULL){ return NULL; } LIBAROMA_CANVASP c = libaroma_canvas_area( win->dc, ctl->x, ctl->y, ctl->w, ctl->h ); return c; } /* End of libaroma_control_draw_begin */
/* * Function : _libaroma_ctl_list_draw_item_fresh * Return Value: void * Descriptions: fresh item drawing */ void _libaroma_ctl_list_draw_item_fresh( LIBAROMA_CONTROLP ctl, LIBAROMA_CTL_LIST_ITEMP item, LIBAROMA_CANVASP canvas, word bgcolor, int hpad, byte flag ){ if ((!canvas)||(!item)||(!ctl)) { return; } /* cleanup */ if (!(flag&LIBAROMA_CTL_LIST_ITEM_DRAW_ADDONS)){ libaroma_canvas_setcolor(canvas,bgcolor,0xff); } LIBAROMA_CANVASP tcanvas=NULL; LIBAROMA_CANVASP ccv = canvas; /* have horizontal padding */ if (hpad>0){ tcanvas = libaroma_canvas_area( canvas, hpad, 0, canvas->w-hpad*2, canvas->h ); if (tcanvas){ ccv = tcanvas; } } /* draw directly */ if (item->handler->draw!=NULL){ item->handler->draw(ctl,item,ccv,bgcolor, flag); } if (tcanvas){ libaroma_canvas_free(tcanvas); } } /* End of _libaroma_ctl_list_draw_item_fresh */
/* init recovery */ byte recovery_init(){ /* snprintf(libaroma_config()->fb_shm_name,64,"recovery-mainfb"); libaroma_config()->runtime_monitor = LIBAROMA_START_UNSAFE; */ /* disable shared fb */ libaroma_config()->runtime_monitor = LIBAROMA_START_UNSAFE; libaroma_config()->fb_shm_name[0]=0; /* start libaroma */ if (!libaroma_start()){ RLOG("recovery_init: libaroma_start failed"); return 0; } /* LIBAROMA_CANVASP svg1=libaroma_image( libaroma_stream( "file:///sdcard/23.svg" ), 1 ); if (svg1){ libaroma_draw(libaroma_fb()->canvas,svg1,0,0,1); libaroma_sync(); sleep(4); } else{ printf("\n\nSVG RENDER ERROR\n\n\n"); } */ /* set workspace size */ libaroma_wm_set_workspace( 0, libaroma_dp(24), libaroma_fb()->w, libaroma_fb()->h-libaroma_dp(24) ); /* clean display */ libaroma_canvas_blank(libaroma_fb()->canvas); /* create statusbar canvas area */ _recovery.status_canvas=libaroma_canvas_area( libaroma_fb()->canvas, 0, 0, libaroma_fb()->w, libaroma_dp(24) ); if (!_recovery.status_canvas){ RLOG("recovery_init: _recovery.status_canvas failed"); libaroma_end(); return 0; } /* set wm ui thread */ libaroma_wm_set_ui_thread(recovery_statusbar_ui_thread); recovery_statusbar_setcolor(0); /* load zip resource */ _recovery.zip = libaroma_zip("/sdcard/recovery.zip"); if (!_recovery.zip){ RLOG("recovery_init: libaroma_zip resource failed"); libaroma_canvas_free(_recovery.status_canvas); libaroma_end(); return 0; } /* init stream callback */ libaroma_stream_set_uri_callback(recovery_stream_uri_cb); /* load font id=0 */ libaroma_font(0, libaroma_stream( "res:///fonts/Roboto-Regular.ttf" ) ); if (!recovery_init_ui()){ recovery_release(); return 0; } /* cleanup display */ libaroma_sync(); return 1; }
/* * Function : _libaroma_ctl_list_draw * Return Value: void * Descriptions: draw routine */ void _libaroma_ctl_list_draw( LIBAROMA_CONTROLP ctl, LIBAROMA_CTL_SCROLL_CLIENTP client, LIBAROMA_CANVASP cv, int x, int y, int w, int h){ if (client->handler!=&_libaroma_ctl_list_handler){ return; } LIBAROMA_CTL_SCROLLP mi = (LIBAROMA_CTL_SCROLLP) client->internal; if (y<mi->vpad){ libaroma_draw_rect( cv, 0, 0, w, mi->vpad-y, libaroma_ctl_scroll_get_bg_color(ctl), 0xff ); } if (y+h>mi->h-mi->vpad){ int dh=(y+h)-(mi->h-mi->vpad); libaroma_draw_rect( cv, 0, h-dh, w, dh, libaroma_ctl_scroll_get_bg_color(ctl), 0xff ); } libaroma_mutex_lock(mi->imutex); /* find first item */ int current_index = 0; LIBAROMA_CTL_LIST_ITEMP f = mi->first; while(f){ if (f->y+f->h>y){ break; } f = f->next; current_index++; } word bgcolor = libaroma_ctl_scroll_get_bg_color(ctl); /* draw routine */ LIBAROMA_CTL_LIST_ITEMP item = f; while(item){ if (item->y>=y+h){ break; } LIBAROMA_CANVASP canvas=NULL; byte is_area=0; if ((item->y>=y)&&(item->y+item->h<y+cv->h)){ canvas = libaroma_canvas_area(cv,0,item->y-y,w,item->h); is_area=1; } else{ canvas = libaroma_canvas(w,item->h); } if (canvas!=NULL){ _libaroma_ctl_list_draw_item( ctl, item, canvas, bgcolor ); /* blit into working canvas */ if (!is_area){ libaroma_draw(cv,canvas,0,item->y-y,0); } libaroma_canvas_free(canvas); } item=item->next; current_index++; } libaroma_mutex_unlock(mi->imutex); } /* End of _libaroma_ctl_list_draw */