/** * @brief Renders all the OSD. */ void osd_render (void) { OSD_t *ll; double p; int i, j, k, l; int w, x; const glColour *c; /* Nothing to render. */ if (osd_list == NULL) return; /* Background. */ gl_renderRect( osd_x-5., osd_y-(osd_rh+5.), osd_w+10., osd_rh+10, &cBlackHilight ); /* Render each thingy. */ p = osd_y-gl_smallFont.h; l = 0; for (k=0; k<array_size(osd_list); k++) { ll = &osd_list[k]; x = osd_x; w = osd_w; /* Print title. */ gl_printMaxRaw( &gl_smallFont, w, x, p, NULL, ll->title ); p -= gl_smallFont.h + 5.; l++; if (l >= osd_lines) return; /* Print items. */ for (i=0; i<ll->nitems; i++) { x = osd_x; w = osd_w; c = (ll->active == i) ? &cConsole : NULL; for (j=0; j<ll->items[i].nchunks; j++) { gl_printMaxRaw( &gl_smallFont, w, x, p, c, ll->items[i].chunks[j] ); if (j==0) { w = osd_w - osd_hyphenLen; x = osd_x + osd_hyphenLen; } p -= gl_smallFont.h + 5.; l++; if (l >= osd_lines) return; } } } }
/** * @brief Prints text on the screen. * * @usage gfx.print( nil, "Hello World!", 50, 50, colour.new("Red") ) -- Displays text in red at 50,50. * @usage gfx.print( true, "Hello World!", 50, 50, col, 100 ) -- Displays text to a maximum of 100 pixels wide. * @usage gfx.print( true, str, 50, 50, col, 100, true ) -- Displays centered text to a maximum of 100 pixels. * * @luaparam small Whether or not to use a small font. * @luaparam str String to print. * @luaparam x X position to print at. * @luaparam y Y position to print at. * @luaparam col Colour to print text. * @luaparam max Optional parameter to indicate maximum width to render up to. * @luaparam center Optional boolean parameter indicating whether or not to center it. * @luafunc print( small, str, x, y, col, max, center ) */ static int gfxL_print( lua_State *L ) { glFont *font; const char *str; double x, y; LuaColour *lc; int max, mid; /* Parse parameters. */ font = lua_toboolean(L,1) ? &gl_smallFont : &gl_defFont; str = luaL_checkstring(L,2); x = luaL_checknumber(L,3); y = luaL_checknumber(L,4); lc = luaL_checkcolour(L,5); if (lua_gettop(L) >= 6) max = luaL_checkinteger(L,6); else max = 0; mid = lua_toboolean(L,7); /* Render. */ if (mid) gl_printMidRaw( font, max, x, y, &lc->col, str ); else if (max > 0) gl_printMaxRaw( font, max, x, y, &lc->col, str ); else gl_printRaw( font, x, y, &lc->col, str ); return 0; }
/** * @brief Renders a list widget. * * @param lst List widget to render. * @param bx Base X position. * @param by Base Y position. */ static void lst_render( Widget* lst, double bx, double by ) { int i; double x,y, tx,ty, miny; double w, scroll_pos; w = lst->w; x = bx + lst->x; y = by + lst->y; /* lst bg */ toolkit_drawRect( x, y, lst->w, lst->h, &cGrey90, NULL ); /* inner outline */ toolkit_drawOutline( x, y, lst->w, lst->h, 0., toolkit_colLight, toolkit_col ); /* outter outline */ toolkit_drawOutline( x, y, lst->w, lst->h, 1., toolkit_colDark, NULL ); /* Draw scrollbar. */ if (lst->dat.lst.height > 0) { /* We need to make room for list. */ w -= 10.; scroll_pos = (double)(lst->dat.lst.pos * (2 + gl_defFont.h)); scroll_pos /= (double)lst->dat.lst.height - lst->h; /* XXX lst->h is off by one */ toolkit_drawScrollbar( x + lst->w - 10. + 1, y, 10., lst->h + 1, scroll_pos ); } /* draw selected */ toolkit_drawRect( x, y - 1. + lst->h - (1 + lst->dat.lst.selected - lst->dat.lst.pos)*(gl_defFont.h+2.), w-1, gl_defFont.h + 2., &cHilight, NULL ); /* draw content */ tx = (double)SCREEN_W/2. + x + 2.; ty = (double)SCREEN_H/2. + y + lst->h - 2. - gl_defFont.h; miny = ty - lst->h + 2 + gl_defFont.h; y = ty - 2.; w -= 4; for (i=lst->dat.lst.pos; i<lst->dat.lst.noptions; i++) { gl_printMaxRaw( &gl_defFont, (int)w, tx, ty, &cBlack, lst->dat.lst.options[i] ); ty -= 2 + gl_defFont.h; /* Check if out of bounds. */ if (ty < miny) break; } }
/** * @brief Renders a button widget. * * @param chk WIDGET_BUTTON widget to render. * @param bx Base X position. * @param by Base Y position. */ static void chk_render( Widget* chk, double bx, double by ) { /*glColour *c;*/ glColour *dc, *lc; double x, y; x = bx + chk->x; y = by + chk->y; /* set the colours */ switch (chk->status) { case WIDGET_STATUS_NORMAL: lc = &cGrey80; /*c = &cGrey60;*/ dc = &cGrey40; break; case WIDGET_STATUS_MOUSEOVER: lc = &cWhite; /*c = &cGrey80;*/ dc = &cGrey60; break; case WIDGET_STATUS_MOUSEDOWN: lc = &cGreen; /*c = &cGreen;*/ dc = &cGrey40; break; default: break; } /* Draw rect. */ toolkit_drawRect( x-1, y-1 + (chk->h-10.)/2., 12., 12., &cGrey40, NULL ); toolkit_drawRect( x, y + (chk->h-10.)/2., 10., 10., &cGrey90, NULL ); if (chk->dat.chk.state) toolkit_drawRect( x+1., y+1. + (chk->h-10.)/2., 8., 8., &cGrey20, NULL ); /* Inner outline */ /* toolkit_drawOutline( x, y + (chk->h-10.)/2., 10, 10, 0., lc, c ); */ /* Outter outline */ /*toolkit_drawOutline( x, y + (chk->h-10.)/2., 10, 10, 1., &cBlack, NULL );*/ /* Draw the txt. */ gl_printMaxRaw( NULL, chk->w - 20, bx + chk->x + 15, by + chk->y + (chk->h - gl_defFont.h)/2., &cBlack, chk->dat.chk.display ); }
/** * @brief Behaves like gl_print but stops displaying text after reaching a certain length. * * @param ft_font Font to use (NULL means use gl_defFont). * @param max Maximum length to reach. * @param x X position to display text at. * @param y Y position to display text at. * @param c Colour to use (NULL defaults to white). * @param fmt String to display formatted like printf. * @return The number of characters it had to suppress. */ int gl_printMax( const glFont *ft_font, const int max, const double x, const double y, const glColour* c, const char *fmt, ... ) { /*float h = ft_font->h / .63;*/ /* slightly increase fontsize */ char text[256]; /* holds the string */ va_list ap; if (fmt == NULL) return -1; else { /* convert the symbols to text */ va_start(ap, fmt); vsnprintf(text, 256, fmt, ap); va_end(ap); } return gl_printMaxRaw( ft_font, max, x, y, c, text ); }
/** * @brief Render function for the custom widget. */ static void cli_render( double bx, double by, double w, double h, void *data ) { (void) data; int i, y; glColour *c; /* Draw the text. */ i = cli_viewport; for (y=h-cli_font->h-5; y>0; y -= cli_font->h + 5) { if (cli_buffer[i][0] == '>') c = &cDConsole; else if (strncmp(cli_buffer[i], "cli:", 4)==0) c = &cRed; else c = &cBlack; gl_printMaxRaw( cli_font, w, bx, by + y, c, cli_buffer[i] ); i = (i + 1) % BUF_LINES; } }
/** * @brief Renders an image array. * * @param iar Image array widget to render. * @param bx Base X position. * @param by Base Y position. */ static void iar_render( Widget* iar, double bx, double by ) { int i,j, pos; double x,y, w,h, xcurs,ycurs; double scroll_pos; int xelem, yelem; double xspace; glColour *c, *dc, *lc, tc, fontcolour; int is_selected; int tw; double d; /* * Calculations. */ /* position */ x = bx + iar->x; y = by + iar->y; /* element dimensions */ iar_getDim( iar, &w, &h ); /* number of elements */ xelem = iar->dat.iar.xelem; yelem = iar->dat.iar.yelem; xspace = (double)(((int)iar->w - 10) % (int)w) / (double)(xelem + 1); /* background */ toolkit_drawRect( x, y, iar->w, iar->h, &cBlack, NULL ); /* * Scrollbar. */ d = h * (yelem - (int)(iar->h / h)); if (fabs(d) < 1e-05) scroll_pos = 0.; else scroll_pos = iar->dat.iar.pos / d; toolkit_drawScrollbar( x + iar->w - 10., y, 10., iar->h, scroll_pos ); /* * Main drawing loop. */ gl_clipRect( x, y, iar->w, iar->h ); ycurs = y + iar->h - h + iar->dat.iar.pos; for (j=0; j<yelem; j++) { xcurs = x + xspace; for (i=0; i<xelem; i++) { /* Get position. */ pos = j*xelem + i; /* Out of elements. */ if ((pos) >= iar->dat.iar.nelements) break; is_selected = (iar->dat.iar.selected == pos) ? 1 : 0; fontcolour = cWhite; /* Draw background. */ if (is_selected) toolkit_drawRect( xcurs + 2., ycurs + 2., w - 5., h - 5., &cDConsole, NULL ); else if (iar->dat.iar.background != NULL) { toolkit_drawRect( xcurs + 2., ycurs + 2., w - 5., h - 5., &iar->dat.iar.background[pos], NULL ); tc = iar->dat.iar.background[pos]; if (((tc.r + tc.g + tc.b) / 3) > 0.5) fontcolour = cBlack; } /* image */ if (iar->dat.iar.images[pos] != NULL) gl_blitScale( iar->dat.iar.images[pos], xcurs + 5., ycurs + gl_smallFont.h + 7., iar->dat.iar.iw, iar->dat.iar.ih, NULL ); /* caption */ if (iar->dat.iar.captions[pos] != NULL) gl_printMidRaw( &gl_smallFont, iar->dat.iar.iw, xcurs + 5., ycurs + 5., (is_selected) ? &cBlack : &fontcolour, iar->dat.iar.captions[pos] ); /* quantity. */ if (iar->dat.iar.quantity != NULL) { if (iar->dat.iar.quantity[pos] != NULL) { /* Rectangle to highlight better. */ tw = gl_printWidthRaw( &gl_smallFont, iar->dat.iar.quantity[pos] ); if (is_selected) tc = cDConsole; else if (iar->dat.iar.background != NULL) tc = iar->dat.iar.background[pos]; else tc = cBlack; tc.a = 0.75; toolkit_drawRect( xcurs + 2., ycurs + 5. + iar->dat.iar.ih, tw + 4., gl_smallFont.h + 4., &tc, NULL ); /* Quantity number. */ gl_printMaxRaw( &gl_smallFont, iar->dat.iar.iw, xcurs + 5., ycurs + iar->dat.iar.ih + 7., &fontcolour, iar->dat.iar.quantity[pos] ); } } /* Slot type. */ if (iar->dat.iar.slottype != NULL) { if (iar->dat.iar.slottype[pos] != NULL) { /* Rectangle to highlight better. Width is a hack due to lack of monospace font. */ tw = gl_printWidthRaw( &gl_smallFont, "M" ); if (is_selected) tc = cDConsole; else if (iar->dat.iar.background != NULL) tc = iar->dat.iar.background[pos]; else tc = cBlack; tc.a = 0.75; toolkit_drawRect( xcurs + iar->dat.iar.iw - 6., ycurs + 5. + iar->dat.iar.ih, tw + 2., gl_smallFont.h + 4., &tc, NULL ); /* Slot size letter. */ gl_printMaxRaw( &gl_smallFont, iar->dat.iar.iw, xcurs + iar->dat.iar.iw - 4., ycurs + iar->dat.iar.ih + 7., &fontcolour, iar->dat.iar.slottype[pos] ); } } /* outline */ if (is_selected) { lc = &cWhite; c = &cGrey80; dc = &cGrey60; } else { lc = toolkit_colLight; c = toolkit_col; dc = toolkit_colDark; } toolkit_drawOutline( xcurs + 2., ycurs + 2., w - 4., h - 4., 1., lc, c ); toolkit_drawOutline( xcurs + 2., ycurs + 2., w - 4., h - 4., 2., dc, NULL ); xcurs += w + xspace; } ycurs -= h; } gl_unclipRect(); /* * Final outline. */ toolkit_drawOutline( x+1, y+1, iar->w-2, iar->h-2, 1., toolkit_colLight, toolkit_col ); toolkit_drawOutline( x+1, y+1, iar->w-2, iar->h-2, 2., toolkit_colDark, NULL ); }