Jump to content

Recommended Posts

Posted (edited)

I have used progressbar that refreshes very fast. I see on screen something like a snow instead of progressbar's border. Need to say I'm using progressbar with image. Yes, progressbar can use image instead of just plain fill color.

Giong deeper in sources gave me a chance to understand whats going on: it just paints inactive area then draws an image over filled area, and then paints border. Chaning border color 3 times per refresh gives effect of snow because of TFT refreshes picture line by line and not-synced with progressbar refresh rate.

I have changed some coordinates and everything started to work fine.

Changed function included (gwin_progressbar.c):

#if GDISP_NEED_IMAGE
void gwinProgressbarDraw_Image(GWidgetObject *gw, void *param) {
    #define gsw         ((GProgressbarObject *)gw)
    #define gi          ((gdispImage *)param)
    const GColorSet *   pcol;
    coord_t             z, v;

    if (gw->g.vmt != (gwinVMT *)&progressbarVMT)
        return;

    if ((gw->g.flags & GWIN_FLG_SYSENABLED))
        pcol = &gw->pstyle->enabled;
    else
        pcol = &gw->pstyle->disabled;

    // Vertical progressbar
    if (gw->g.width < gw->g.height) {
        if (gsw->dpos != 0)                         // The unfilled area
            gdispGFillArea(gw->g.display, gw->g.x+1, gw->g.y+1, gw->g.width-2, gsw->dpos-1, gw->pstyle->enabled.progress);  // Inactive area
        if (gsw->dpos != gw->g.height-1) {          // The filled area
            for(z=gw->g.height, v=gi->height; z > gsw->dpos;) {
                z -= v;
                if (z < gsw->dpos) {
                    v -= gsw->dpos - z;
                    z = gsw->dpos;
                }
                gdispGImageDraw(gw->g.display, gi, gw->g.x+1, gw->g.y+z+1, gw->g.width-1, v-2, 0, gi->height-v);
            }
        }
        gdispGDrawBox(gw->g.display, gw->g.x, gw->g.y, gw->g.width, gw->g.height, pcol->edge);                              // Edge
        gdispGDrawLine(gw->g.display, gw->g.x+1, gw->g.y+gsw->dpos, gw->g.x+gw->g.width-2, gw->g.y+gsw->dpos, pcol->edge);  // Thumb

    // Horizontal progressbar
    } else {
        if (gsw->dpos != gw->g.width-1)             // The unfilled area
            gdispGFillArea(gw->g.display, gw->g.x+gsw->dpos+1, gw->g.y+1, gw->g.width-gsw->dpos-2, gw->g.height-2, gw->pstyle->enabled.progress);   // Inactive area
        if (gsw->dpos != 0) {                       // The filled area
            for(z=0, v=gi->width; z < gsw->dpos; z += v) {
                if (z+v > gsw->dpos)
                    v -= z+v - gsw->dpos;
                gdispGImageDraw(gw->g.display, gi, gw->g.x+z+1, gw->g.y+1, v-1, gw->g.height-2, 0, 0);
            }
        }
        gdispGDrawBox(gw->g.display, gw->g.x, gw->g.y, gw->g.width, gw->g.height, pcol->edge);                              // Edge
        gdispGDrawLine(gw->g.display, gw->g.x+gsw->dpos, gw->g.y+1, gw->g.x+gsw->dpos, gw->g.y+gw->g.height-2, pcol->edge);   // Thumb
    }
    gdispGDrawStringBox(gw->g.display, gw->g.x+1, gw->g.y+1, gw->g.width-2, gw->g.height-2, gw->text, gw->g.font, pcol->text, justifyCenter);

    #undef gsw
}
#endif /* GDISP_NEED_IMAGE */

 

Edited by king2

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...