void gdispFillString(coord_t x, coord_t y, const char *str, font_t font, color_t color, color_t bgcolor) { /* No mutex required as we only call high level functions which have their own mutex */ coord_t w, h, p; char c; int first; if (!str) return; first = 1; h = font->height * font->yscale; p = font->charPadding * font->xscale; while(*str) { /* Get the next printable character */ c = *str++; w = _getCharWidth(font, c) * font->xscale; if (!w) continue; /* Handle inter-character padding */ if (p) { if (!first) { gdispFillArea(x, y, p, h, bgcolor); x += p; } else first = 0; } /* Print the character */ gdispFillChar(x, y, c, font, color, bgcolor); x += w; } }
void gwinPutChar(GHandle gh, char c) { #define gcw ((GConsoleObject *)gh) uint8_t width, fy, fp; if (gh->vmt != &consoleVMT || !gh->font) return; fy = gdispGetFontMetric(gh->font, fontHeight); fp = gdispGetFontMetric(gh->font, fontCharPadding); #if GDISP_NEED_CLIP gdispSetClip(gh->x, gh->y, gh->width, gh->height); #endif if (c == '\n') { gcw->cx = 0; gcw->cy += fy; // We use lazy scrolling here and only scroll when the next char arrives } else if (c == '\r') { // gcw->cx = 0; } else { width = gdispGetCharWidth(c, gh->font) + fp; if (gcw->cx + width >= gh->width) { gcw->cx = 0; gcw->cy += fy; } if (gcw->cy + fy > gh->height) { #if GDISP_NEED_SCROLL /* scroll the console */ gdispVerticalScroll(gh->x, gh->y, gh->width, gh->height, fy, gh->bgcolor); /* reset the cursor to the start of the last line */ gcw->cx = 0; gcw->cy = (((coord_t)(gh->height/fy))-1)*fy; #else /* clear the console */ gdispFillArea(gh->x, gh->y, gh->width, gh->height, gh->bgcolor); /* reset the cursor to the top of the window */ gcw->cx = 0; gcw->cy = 0; #endif } #if GWIN_CONSOLE_USE_CLEAR_LINES /* clear to the end of the line */ if (gcw->cx == 0) gdispFillArea(gh->x, gh->y + gcw->cy, gh->width, fy, gh->bgcolor); #endif #if GWIN_CONSOLE_USE_FILLED_CHARS gdispFillChar(gh->x + gcw->cx, gh->y + gcw->cy, c, gh->font, gh->color, gh->bgcolor); #else gdispDrawChar(gh->x + gcw->cx, gh->y + gcw->cy, c, gh->font, gh->color); #endif /* update cursor */ gcw->cx += width; } #undef gcw }
void gwinFillChar(GHandle gh, coord_t x, coord_t y, char c) { if (!((gh->flags & GWIN_FLG_VISIBLE)) || !gh->font) return; #if GDISP_NEED_CLIP gdispSetClip(gh->x, gh->y, gh->width, gh->height); #endif gdispFillChar(gh->x+x, gh->y+y, c, gh->font, gh->color, gh->bgcolor); }
void gdispFillStringBox(coord_t x, coord_t y, coord_t cx, coord_t cy, const char* str, font_t font, color_t color, color_t bgcolor, justify_t justify) { /* No mutex required as we only call high level functions which have their own mutex */ coord_t w, h, p, ypos, xpos; char c; int first; const char *rstr; if (!str) str = ""; h = font->height * font->yscale; p = font->charPadding * font->xscale; /* Oops - font too large for the area */ if (h > cy) return; /* See if we need to fill above the font */ ypos = (cy - h + 1)/2; if (ypos > 0) { gdispFillArea(x, y, cx, ypos, bgcolor); y += ypos; cy -= ypos; } /* See if we need to fill below the font */ ypos = cy - h; if (ypos > 0) { gdispFillArea(x, y+cy-ypos, cx, ypos, bgcolor); cy -= ypos; } /* get the start of the printable string and the xpos */ switch(justify) { case justifyCenter: /* Get the length of the entire string */ w = gdispGetStringWidth(str, font); if (w <= cx) xpos = x + (cx - w)/2; else { /* Calculate how much of the string we need to get rid of */ ypos = (w - cx)/2; xpos = 0; first = 1; while(*str) { /* Get the next printable character */ c = *str++; w = _getCharWidth(font, c) * font->xscale; if (!w) continue; /* Handle inter-character padding */ if (p) { if (!first) { xpos += p; if (xpos > ypos) break; } else first = 0; } /* Print the character */ xpos += w; if (xpos > ypos) break; } xpos = ypos - xpos + x; } break; case justifyRight: /* Find the end of the string */ for(rstr = str; *str; str++); xpos = x+cx - 2; first = 1; for(str--; str >= rstr; str--) { /* Get the next printable character */ c = *str; w = _getCharWidth(font, c) * font->xscale; if (!w) continue; /* Handle inter-character padding */ if (p) { if (!first) { if (xpos - p < x) break; xpos -= p; } else first = 0; } /* Print the character */ if (xpos - w < x) break; xpos -= w; } str++; break; case justifyLeft: /* Fall through */ default: xpos = x+1; break; } /* Fill any space to the left */ if (x < xpos) gdispFillArea(x, y, xpos-x, cy, bgcolor); /* Print characters until we run out of room */ first = 1; while(*str) { /* Get the next printable character */ c = *str++; w = _getCharWidth(font, c) * font->xscale; if (!w) continue; /* Handle inter-character padding */ if (p) { if (!first) { if (xpos + p > x+cx) break; gdispFillArea(xpos, y, p, cy, bgcolor); xpos += p; } else first = 0; } /* Print the character */ if (xpos + w > x+cx) break; gdispFillChar(xpos, y, c, font, color, bgcolor); xpos += w; } /* Fill any space to the right */ if (xpos < x+cx) gdispFillArea(xpos, y, x+cx-xpos, cy, bgcolor); }