static void render(struct widget *w) { struct widget_priv *priv = w->priv; const struct font *f = get_font(priv->font_id); struct canvas *ca = &w->ca; unsigned int x2 = (f->width + f->spacing) * 12; char buf[100]; sprintf(buf, "%10.6f\n%10.6f", priv->gps_lat, priv->gps_lon); draw_str(buf, 0, 0, ca, priv->font_id); sprintf(buf, "%2d", priv->gps_nrsats); draw_str(buf, x2, 0, ca, priv->font_id); buf[1] = 'D'; switch (priv->gps_fix_type) { default: case 0: case 1: buf[0] = ' '; buf[1] = ' '; break; case 2: buf[0] = '2'; break; case 3: buf[0] = '3'; break; } buf[2] = '\0'; draw_str(buf, x2, f->height, ca, priv->font_id); sprintf(buf, "HDP\n%2.1f", priv->gps_eph); draw_str(buf, x2 + (f->width + f->spacing) * 4, 0, ca, priv->font_id); }
void inputmenuitem::drawAsActive(unsigned char alpha) { glBegin(GL_QUADS); glColor4ub(75,75,75,alpha); glVertex3f(input_left, input_top, 0.0f); glVertex3f(input_left, input_bottom, 0.0f); glVertex3f(input_right, input_bottom, 0.0f); glVertex3f(input_right, input_top, 0.0f); glColor4ub(150,150,150,alpha); glVertex3f(input_left + input_textfield_left, input_top + input_textfield_top, 0.0f); glVertex3f(input_left + input_textfield_left + input_textfield_width, input_top + input_textfield_top, 0.0f); glVertex3f(input_left + input_textfield_left + input_textfield_width, input_top + input_textfield_top + input_textfield_height, 0.0f); glVertex3f(input_left + input_textfield_left, input_top + input_textfield_top + input_textfield_height, 0.0f); glEnd(); glColor4ub(0,0,0,255); //Make text opaque if(text != NULL) { textquad tq(input_left + input_title_left, input_top + input_title_top, 0.0f, input_left + input_title_left, input_top + input_title_top + font_size, 0.0f, 0.05f, 0.0f, 0.0f); draw_str(tq, text); } if(input != NULL) { textquad tq(input_left + input_textfield_left + 0.02f, input_top + input_textfield_top + 0.02f, 0.0f, input_left + input_textfield_left + 0.02f, input_top + input_textfield_top + font_size + 0.02f, 0.0f, 0.05f, 0.0f, 0.0f); draw_str(tq, input); } if(displayError && invalidInputError != NULL) { glColor4ub(255,0,0,255); textquad tq(input_left + input_textfield_left + 0.02f, input_top + input_textfield_top + input_textfield_height + 0.02f, 0.0f, input_left + input_textfield_left + 0.02f, input_top + input_textfield_top + input_textfield_height + font_size + 0.02f, 0.0f, 0.05f, 0.0f, 0.0f); draw_str(tq, invalidInputError); } }
static void render(struct widget *w) { struct home_data *priv = w->priv; struct canvas *ca = &w->ca; char buf[50]; float d, a; struct point arrow_points[7] = { {-3, 0}, {-3, -6}, {3, -6}, {3, 0}, {6, 0}, {0, 6}, {-6, 0} }; struct polygon arrow = { .len = 7, .points = arrow_points, }; if (priv->lock != HOME_LOCKED) { sprintf(buf, "No Home"); draw_str(buf, 0, 0, ca, 2); } else { switch (get_units(w->cfg)) { case UNITS_METRIC: default: sprintf(buf, "Alt %dm\nDis %dm\n%d", priv->altitude, (unsigned int) priv->distance, priv->direction); break; case UNITS_IMPERIAL: a = (float) priv->altitude * M2FEET; d = (float) priv->distance * M2FEET; sprintf(buf, "Alt %df\nDis %df\n%d", (unsigned int) a, (unsigned int) d, priv->direction); break; } draw_str(buf, 0, 0, ca, 1); transform_polygon(&arrow, 50, 34, priv->direction + 180); draw_polygon(&arrow, 3, ca); move_polygon(&arrow, -1, -1); draw_polygon(&arrow, 1, ca); } } const struct widget_ops home_info_widget_ops = { .name = "Home info", .mavname = "HOMEINF", .id = WIDGET_HOME_INFO_ID, .init = NULL, .open = open, .render = render, .close = NULL, };
static void render(struct widget *w) { struct flight_stats *priv = w->priv; struct canvas *ca = &w->ca; char buf[50]; sprintf(buf, "Distance traveled: %ld m", (unsigned long) priv->total_distance); draw_str(buf, 0, 0, ca, 1); sprintf(buf, "Maximum altitude: %d m", priv->max_altitude); draw_str(buf, 0, 12*1, ca, 1); sprintf(buf, "Maximum home altitude: %d m", priv->max_home_altitude); draw_str(buf, 0, 12*2, ca, 1); sprintf(buf, "Maximum ground speed: %d m/s", priv->max_gnd_speed); draw_str(buf, 0, 12*3, ca, 1); sprintf(buf, "Maximum air speed: %d m/s", priv->max_air_speed); draw_str(buf, 0, 12*4, ca, 1); sprintf(buf, "Maximum home distance: %d m", priv->max_home_distance); draw_str(buf, 0, 12*5, ca, 1); sprintf(buf, "Peak current: %.2fA", ((double) priv->max_bat_current) / 100); draw_str(buf, 0, 12*6, ca, 1); sprintf(buf, "Total used current: %dmAh", (unsigned int) priv->total_mah); draw_str(buf, 0, 12*7, ca, 1); }
static void render(struct widget *w) { struct canvas *ca = &w->ca; draw_rect(0, 0, 119, 119, 3, ca); draw_frect(1, 1, 118, 118, 1, ca); draw_frect(9, 59, 59, 109, 0, ca); draw_frect(9, 9, 59, 59, 1, ca); draw_frect(59, 9, 109, 59, 2, ca); draw_frect(59, 59, 109, 109, 3, ca); draw_str("White", 10, 10, ca, 1); draw_str("Gray", 60, 10, ca, 1); draw_str("Black", 60, 60, ca, 1); }
void togglemenuitem::draw(bool selected, float x, float y, float width, float height, unsigned char alpha) { draw_button(selected, name, x, y, width, height, alpha); textquad tq(x + width - toggle_dist_from_back, y + (height - font_size) * 0.5f, 0.0f, x + width - toggle_dist_from_back, y + (height + font_size) * 0.5f, 0.0f, 0.05f, 0.0f, 0.0f); if(state) { glColor4ub(0,255,0,alpha); draw_str(tq, (char*)"ON"); } else { glColor4ub(255,0,0,alpha); draw_str(tq, (char*)"OFF"); } }
static void render(struct widget *w) { struct widget_priv *priv = w->priv; struct canvas *ca = &w->ca; char buf[100], buf2[5]; sprintf(buf, "%10.6f\n%10.6f", (double) priv->gps_lat, (double) priv->gps_lon); draw_str(buf, 0, 0, ca, priv->font_id); if (priv->gps_fix_type < 2) { buf2[0] = '\0'; } else if (priv->gps_fix_type < 4) { sprintf(buf2, "%dD", priv->gps_fix_type); } else if (priv->gps_fix_type < 5) { strcpy(buf2, "DGPS"); } else if (priv->gps_fix_type < 6) { strcpy(buf2, "RTK"); } else { strcpy(buf2, "?"); } sprintf(buf, "%d %s\n%2.1f HDP", priv->gps_nrsats, buf2, (double) priv->gps_eph); draw_jstr(buf, ca->width, 0, JUST_RIGHT, ca, priv->font_id); }
static void render(struct widget *w) { struct widget_priv *priv = w->priv; struct canvas *ca = &w->ca; char buf[10]; struct point uav_points[4] = { {0, 0}, {6, 8}, {0, -8}, {-6, 8} }; struct polygon uav = { .len = 4, .points = uav_points, }; struct point arrow_points[7] = { {1, -10}, {1, -3}, {4, -4}, {0, 0}, {-4, -4}, {-1, -3}, {-1, -10} }; struct polygon arrow = { .len = 7, .points = arrow_points, }; move_polygon(&uav, ca->width >> 1, ca->height >> 1); draw_polygon(&uav, 3, ca); move_polygon(&uav, -1, -1); draw_polygon(&uav, 1, ca); move_polygon(&arrow, 0, -11); transform_polygon(&arrow, ca->width >> 1, ca->height >> 1, priv->direction - priv->heading); draw_polygon(&arrow, 3, ca); move_polygon(&arrow, -1, -1); draw_polygon(&arrow, 1, ca); switch (get_units(w->cfg)) { case UNITS_METRIC: default: sprintf(buf, "%dkm/h", (int) ((priv->speed * 3600) / 1000)); break; case UNITS_IMPERIAL: sprintf(buf, "%dmph", (int) ((priv->speed * 3600) * M2MILE)); break; case UNITS_CUSTOM_1: sprintf(buf, "%dm/s", (int) (priv->speed)); break; case UNITS_CUSTOM_2: sprintf(buf, "%df/s", (int) (priv->speed * M2FEET)); break; case UNITS_CUSTOM_3: sprintf(buf, "%dkn", (int) ((priv->speed * 3600 * 1.852) / 1000)); break; } draw_str(buf, 0, 0, ca, 0); } const struct widget_ops wind_widget_ops = { .name = "Wind information", .mavname = "WINDINF", .id = WIDGET_WIND_ID, .init = NULL, .open = open, .render = render, .close = NULL, };
static void render(struct widget *w) { struct widget_priv *priv = (struct widget_priv*) w->priv; struct canvas *ca = &w->ca; unsigned char i; unsigned int width = ca->width; int x; char buf[10]; for (i = 0; i < 8; i++) { if ((w->cfg->props.mode == 0) || (w->cfg->props.mode == 1)) sprintf(buf, "CH%u %4d", i+1, priv->ch_raw[i]); else sprintf(buf, "CH%u", i+1); draw_str(buf, 0, i*8+1, ca, 0); if ((w->cfg->props.mode == 0) || (w->cfg->props.mode == 2)) { x = priv->ch_raw[i] - 1000; if (x < 0) x = 0; else if (x > 1000) x = 1000; x = (x * (unsigned int) priv->bar_size) / 1000; draw_rect(width-priv->bar_size-1, i*8, width-1, i*8+6, 3, ca); draw_rect(width-priv->bar_size, i*8+1, width-2, i*8+5, 1, ca); draw_vline(width-priv->bar_size-1+x, i*8+1, i*8+5, 1, ca); draw_vline(width-priv->bar_size-1+x-1, i*8+1, i*8+5, 3, ca); draw_vline(width-priv->bar_size-1+x+1, i*8+1, i*8+5, 3, ca); } } }
static void render(struct widget *w) { struct widget_priv *priv = (struct widget_priv*) w->priv; struct canvas *ca = &w->ca; int i, j, y = -1; long yy; char buf[10], d = 0; int major_tick = priv->range / 5; int minor_tick = major_tick / 4; for (i = 0; i < priv->range; i++) { yy = ((long) i * Y_SIZE) / priv->range; if ((yy == y) && (d == 1)) continue; y = Y_SIZE - (int) yy; j = priv->speed_i + i - priv->range/2; if(j < 0) continue; if (j % major_tick == 0) { sprintf(buf, "%3d", j); draw_str(buf, 2, y - 2, ca, 0); draw_ohline(X_CENTER - 2, X_CENTER + 4, y, 1, 3, ca); d = 1; } else if (j % minor_tick == 0) { draw_ohline(X_CENTER - 2, X_CENTER + 2, y, 1, 3, ca); d = 1; } else { d = 0; } } draw_frect(1, Y_CENTER-4, X_CENTER - 10, Y_CENTER + 4, 0, ca); sprintf(buf, "%3d", (int) priv->speed_i); draw_str(buf, 2, Y_CENTER - 3, ca, 0); draw_hline(0, X_CENTER - 10, Y_CENTER - 5, 1, ca); draw_hline(0, X_CENTER - 10, Y_CENTER + 5, 1, ca); draw_vline(0, Y_CENTER - 3 , Y_CENTER + 3, 1, ca); draw_line(X_CENTER-10, Y_CENTER-5, X_CENTER-10+5, Y_CENTER, 1, ca); draw_line(X_CENTER-10, Y_CENTER+5, X_CENTER-10+5, Y_CENTER, 1, ca); }
static void render(struct widget *w) { struct widget_priv *priv = (struct widget_priv*) w->priv; struct canvas *ca = &w->ca; char buf[20]; int i; switch (w->cfg->props.mode) { case 0: default: sprintf(buf, "%5.2fV\n%5.2fA", priv->bat_voltage, priv->bat_current); draw_str(buf, 4, BAT_BAR_Y + BAT_BAR_H + 3, ca, 2); draw_rect(BAT_BAR_X, BAT_BAR_Y, BAT_BAR_X + BAT_BAR_W, BAT_BAR_Y + BAT_BAR_H, 3, ca); draw_rect(BAT_BAR_X+1, BAT_BAR_Y+1, BAT_BAR_X + BAT_BAR_W-1, BAT_BAR_Y + BAT_BAR_H-1, 1, ca); draw_vline(BAT_BAR_X - 1, BAT_BAR_Y + 4, BAT_BAR_Y + BAT_BAR_H - 4, 1, ca); draw_vline(BAT_BAR_X - 2, BAT_BAR_Y + 4, BAT_BAR_Y + BAT_BAR_H - 4, 1, ca); draw_vline(BAT_BAR_X - 3, BAT_BAR_Y + 4, BAT_BAR_Y + BAT_BAR_H - 4, 3, ca); for (i = 0; i < (priv->bat_remaining*BAT_BAR_W)/100 - 2; i++) { draw_vline(BAT_BAR_X + 2 + i, BAT_BAR_Y + 2, BAT_BAR_Y + BAT_BAR_H - 2, 2, ca); } sprintf(buf, "%d", priv->bat_remaining); draw_str(buf, BAT_BAR_X + BAT_BAR_W/2 - 6, BAT_BAR_Y + 3, ca, 0); break; case 1: case 2: sprintf(buf, "%5.2fV", priv->bat_voltage); draw_str(buf, 0, 0, ca, 2); break; case 3: sprintf(buf, "%5.2fV\n%5.2fV", priv->bat_voltage, priv->bat_voltage2); draw_str(buf, 0, 0, ca, 2); break; } }
void slidermenuitem::draw(bool selected, float x, float y, float width, float height, unsigned char alpha) { glColor4ub(0,0,0,alpha); glBegin(GL_LINES); glVertex3f(x + slider_left * width, y + slider_line_height * height, 0.0f); glVertex3f(x + slider_right * width, y + slider_line_height * height, 0.0f); for(int i = 0; i < len; i++) { float tickx = x + width*(slider_right*(float)i + slider_left*(float)(len-1-i)) / (float)(len-1); glVertex3f(tickx, y + slider_tick_top * height, 0.0f); glVertex3f(tickx, y + slider_tick_bottom * height, 0.0f); } glEnd(); if(selected) glColor4ub(selected_r,selected_g,selected_b,alpha); else glColor4ub(unselected_r,unselected_g,unselected_b,alpha); float rectx1 = x + width * ((slider_right * (float)curstate + slider_left * (float)(len-1-curstate))/(float)(len-1) - 0.5f * slider_slide_width); float recty1 = y + height * (slider_line_height - 0.5f*slider_slide_height); float recty2 = y + height * (slider_line_height + 0.5f*slider_slide_height); glBegin(GL_QUADS); glVertex3f(rectx1, recty1, 0.0f); glVertex3f(rectx1, recty2, 0.0f); glVertex3f(rectx1 + slider_slide_width * width, recty2, 0.0f); glVertex3f(rectx1 + slider_slide_width * width, recty1, 0.0f); if(curstate != newcurstate) { glColor4ub(selected_r,selected_g,selected_b,50); rectx1 = x + width * ((slider_right * (float)newcurstate + slider_left * (float)(len-1-newcurstate))/(float)(len-1) - 0.5f * slider_slide_width); glVertex3f(rectx1, recty1, 0.0f); glVertex3f(rectx1, recty2, 0.0f); glVertex3f(rectx1 + slider_slide_width * width, recty2, 0.0f); glVertex3f(rectx1 + slider_slide_width * width, recty1, 0.0f); } glEnd(); glColor4ub(0,0,0,255); for(int i = 0; i < len; i++) { //printf("\n\ni = %d\n", i); float tickx = x + width*(slider_right*(float)i + slider_left*(float)(len-1-i)) / (float)(len-1); textquad tq(tickx, y+slider_text_top*height, 0.0f, tickx, y+slider_text_bottom*height, 0.0f, (slider_text_bottom-slider_text_top)*height, 0.0f, 0.0f); //printf("meh\n"); //printf("%s\n", states[i]); draw_str_center(tq, states[i]); } textquad tq( slider_text_name_left * width, y+slider_text_name_top*height, 0.0f, slider_text_name_left * width, y+slider_text_name_bottom*height, 0.0f, (slider_text_name_bottom-slider_text_name_top)*height, 0.0f, 0.0f); draw_str(tq, name); }
void draw_button(bool selected, char *text, float x, float y, float width, float height, GLubyte alpha) { if(selected) glColor4ub(selected_r,selected_g,selected_b,alpha); else glColor4ub(unselected_r,unselected_g,unselected_b,alpha); glBegin(GL_QUADS); glVertex3f(x, y, 0.0f); glVertex3f(x, y+height, 0.0f); glVertex3f(x+width, y+height, 0.0f); glVertex3f(x+width, y, 0.0f); glEnd(); glColor4ub(255,255,255,menu_alpha); textquad tq(x + button_text_padding, y + (height - font_size) * 0.5f, 0.0f, x + button_text_padding, y + (height + font_size) * 0.5f, 0.0f, 0.05f, 0.0f, 0.0f); draw_str(tq, text); }
// falls select == 0 wird kein label gezeichnet // falls select = ((1 << MAX_CLABEL)-1) - // wird der hintergrund komplett gefüllt und alle labels werden gezeichnet // sonst wird nur das geänderte label gezeichnet // static void paint(Widget w, int select ) { #define ALL_LABELS ((1 << MAX_CLABEL)-1) CtrlWidget cw = (CtrlWidget)w; CtrlPart *c = & cw->ctrl; TF(); int i,clear_area = 1; if( (select & ALL_LABELS)==ALL_LABELS ) { TRACE(2, "%s %d", cw->core.name, c->msg.state ); XFillRectangle( XtDisplay(w), XtWindow(w), c->gc[c->msg.state], 0, 0, XtWidth(w), XtHeight(w) ); clear_area=0; } for(i=0;i<MAX_CLABEL;i++) { if( select & ( 1 << i ) ) draw_str(w,clear_area,i); } }
static void render(struct widget *w) { struct widget_priv *priv = w->priv; struct canvas *ca = &w->ca; unsigned char i; unsigned int width = ca->width; int x, y; char buf[10]; const struct font *f = get_font(0); unsigned int *ch = priv->ch; for (i = 0; i < priv->total_ch; i++) { if ((w->cfg->props.mode == 0) || (w->cfg->props.mode == 1)) sprintf(buf, "CH%u %4d", i+1, *ch); else sprintf(buf, "CH%u", i+1); draw_str(buf, 0, i*f->size, ca, 0); if ((w->cfg->props.mode == 0) || (w->cfg->props.mode == 2)) { x = *ch - 1000; if (x < 0) x = 0; else if (x > 1000) x = 1000; x = (x * (unsigned int) priv->bar_size) / 1000; y = i * f->size; draw_rect(width-priv->bar_size-1, y, width-1, y+BAR_SIZE, 3, ca); draw_rect(width-priv->bar_size, y+1, width-2, y+BAR_SIZE-1, 1, ca); draw_vline(width-priv->bar_size-1+x, y+1, y+BAR_SIZE-1, 1, ca); draw_vline(width-priv->bar_size-1+x-1, y+1, y+BAR_SIZE-1, 3, ca); draw_vline(width-priv->bar_size-1+x+1, y+1, y+BAR_SIZE-1, 3, ca); } ch++; } }
//fps調整用wait(SDLで描画だよ) void wait_byFPS(unsigned int hope_fps,SDL_Surface* w,SDL_Rect* r,unsigned int wh){ static unsigned int fps = 0; static unsigned int t1=0,t2=0; static char str[256] = "wait..."; unsigned int t3; //待ち do{ t3 = SDL_GetTicks(); }while(t3 - t1 < 1000/hope_fps); t1 = t3; //描画 if(t1 - t2 > 1000) { sprintf(str,"%5.2lf", (1000.0 * fps)/(double)(t1-t2)); t2 = t1; fps = 0; } draw_str(str,w,r,wh); fps++; }
//fps調整用wait void wait_byFPS(unsigned int hope_fps,bool view){ static unsigned int fps = 0; static unsigned int t1=0,t2=0; static char str[256] = "wait..."; unsigned int t3; do{ t3 = SDL_GetTicks(); }while(t3 - t1 < 1000/hope_fps); t1 = t3; if(view) { if(t1 - t2 > 1000) { sprintf(str,"%5.2lf", (1000.0 * fps)/(double)(t1-t2)); t2 = t1; fps = 0; } draw_str(str); fps++; } }
int spupng_export_string2png(struct spupng_t *sp, char *str) { png_structp png_ptr; png_infop info_ptr; png_bytep *row_pointer; png_bytep image; int ww, wh, rowstride, row_adv; int row = 0; assert ((sizeof(png_byte) == sizeof(uint8_t)) && (sizeof(*image) == sizeof(uint8_t))); // Allow space at beginning and end of each row for a padding space ww = CCW * (COLUMNS+2); wh = CCH * ROWS; row_adv = (COLUMNS+2) * CCW * CCH; rowstride = ww * sizeof(*image); if (!(row_pointer = (png_bytep*)malloc(sizeof(*row_pointer) * wh))) { mprint("Unable to allocate %d byte buffer.\n", sizeof(*row_pointer) * wh); return 0; } if (!(image = (png_bytep)malloc(wh * ww * sizeof(*image)))) { mprint("Unable to allocate %d KB image buffer.", wh * ww * sizeof(*image) / 1024); free(row_pointer); return 0; } // Initialize image to transparent memset(image, COL_TRANSPARENT, wh * ww * sizeof(*image)); /* draw the image */ draw_str(str, image + row * row_adv, rowstride); /* Now save the image */ if (!(png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL))) goto unknown_error; if (!(info_ptr = png_create_info_struct(png_ptr))) { png_destroy_write_struct(&png_ptr, (png_infopp) NULL); goto unknown_error; } #if 0 if (!spupng_write_png (sp, data, png_ptr, info_ptr, image, row_pointer, ww, wh)) { png_destroy_write_struct (&png_ptr, &info_ptr); goto write_error; } #endif png_destroy_write_struct (&png_ptr, &info_ptr); free (row_pointer); free (image); return 1; unknown_error: free (row_pointer); free (image); return 0; }
int gra2cairo_strwidth(struct objlist *obj, N_VALUE *inst, N_VALUE *rval, int argc, char **argv) { struct gra2cairo_local *local; gchar *font, *str; double size, dir, s,c ; int width, style, symbol; struct fontmap *fcur; str = argv[3]; size = ( * (int *) argv[4]) / 72.0 * 25.4; font = argv[5]; style = * (int *) (argv[6]); if (size == 0) { rval->i = 0; return 0; } if (_getobj(obj, "_local", inst, &local)) return 1; if (local->cairo == NULL) return 0; fcur = loadfont(font, style, &symbol); if (fcur == NULL) { rval->i = nround(size * 0.600); return 0; } dir = local->fontdir; s = local->fontsin; c = local->fontcos; local->fontdir = 0; local->fontsin = 0; local->fontcos = 1; if (symbol) { char *ptr; ptr = ascii2greece(str); if (ptr == NULL) { return 1; } str = ptr; } draw_str(local, FALSE, str, fcur, size, 0, &width, NULL, NULL); if (symbol) { g_free(str); } rval->i = mxp2dw(local, width); local->fontsin = s; local->fontcos = c; local->fontdir = dir; return 0; }
static int gra2cairo_output(struct objlist *obj, N_VALUE *inst, N_VALUE *rval, int argc, char **argv) { char code, *cstr, *tmp; int *cpar, i, r, font_style; double x, y, w, h, fontsize, fontspace, fontdir, fontsin, fontcos, a1, a2; cairo_line_join_t join; cairo_line_cap_t cap; double *dashlist = NULL; struct gra2cairo_local *local; local = (struct gra2cairo_local *)argv[2]; code = *(char *)(argv[3]); cpar = (int *)argv[4]; cstr = argv[5]; if (local->cairo == NULL) return -1; if (code != 'T') { gra2cairo_draw_path(local); } switch (code) { case 'I': gra2cairo_set_antialias(local, local->antialias); local->linetonum = 0; r = check_cairo_status(local->cairo); if (r) { error(obj, r); return 1; } case '%': case 'X': break; case 'E': r = check_cairo_status(local->cairo); if (r) { error(obj, r); return 1; } break; case 'V': local->offsetx = mxd2pw(local, cpar[1]); local->offsety = mxd2ph(local, cpar[2]); cairo_new_path(local->cairo); if (cpar[5]) { x = mxd2pw(local, cpar[1]); y = mxd2ph(local, cpar[2]); w = mxd2pw(local, cpar[3]) - x; h = mxd2ph(local, cpar[4]) - y; cairo_reset_clip(local->cairo); cairo_rectangle(local->cairo, x, y, w, h); cairo_clip(local->cairo); } else { cairo_reset_clip(local->cairo); } if (local->region) { gra2cairo_clip_region(local, local->region); } break; case 'A': if (cpar[1] == 0) { cairo_set_dash(local->cairo, NULL, 0, 0); } else { dashlist = g_malloc(sizeof(* dashlist) * cpar[1]); if (dashlist == NULL) break; for (i = 0; i < cpar[1]; i++) { dashlist[i] = mxd2pw(local, cpar[6 + i]); if (dashlist[i] <= 0) { dashlist[i] = 1; } } cairo_set_dash(local->cairo, dashlist, cpar[1], 0); g_free(dashlist); } cairo_set_line_width(local->cairo, mxd2pw(local, cpar[2])); if (cpar[3] == 2) { cap = CAIRO_LINE_CAP_SQUARE; } else if (cpar[3] == 1) { cap = CAIRO_LINE_CAP_ROUND; } else { cap = CAIRO_LINE_CAP_BUTT; } cairo_set_line_cap(local->cairo, cap); if (cpar[4] == 2) { join = CAIRO_LINE_JOIN_BEVEL; } else if (cpar[4] == 1) { join = CAIRO_LINE_JOIN_ROUND; } else { join = CAIRO_LINE_JOIN_MITER; } cairo_set_line_join(local->cairo, join); break; case 'G': if (local->use_opacity && cpar[0] > 3 && cpar[4] < 255) { cairo_set_source_rgba(local->cairo, cpar[1] / 255.0, cpar[2] / 255.0, cpar[3] / 255.0, cpar[4] / 255.0); } else { cairo_set_source_rgb(local->cairo, cpar[1] / 255.0, cpar[2] / 255.0, cpar[3] / 255.0); } break; case 'M': cairo_move_to(local->cairo, mxd2px(local, cpar[1]), mxd2py(local, cpar[2])); break; case 'N': relative_move(local->cairo, mxd2pw(local, cpar[1]), mxd2ph(local, cpar[2])); break; case 'L': cairo_new_path(local->cairo); cairo_move_to(local->cairo, mxd2px(local, cpar[1]), mxd2py(local, cpar[2])); cairo_line_to(local->cairo, mxd2px(local, cpar[3]), mxd2py(local, cpar[4])); cairo_stroke(local->cairo); break; case 'T': cairo_line_to(local->cairo, mxd2px(local, cpar[1]), mxd2py(local, cpar[2])); local->linetonum++; break; case 'C': x = mxd2px(local, cpar[1] - cpar[3]); y = mxd2py(local, cpar[2] - cpar[4]); w = mxd2pw(local, cpar[3]); h = mxd2ph(local, cpar[4]); a1 = cpar[5] * (M_PI / 18000.0); a2 = cpar[6] * (M_PI / 18000.0) + a1; if (w == 0 || h == 0 || a1 == a2) break; cairo_new_path(local->cairo); cairo_save(local->cairo); cairo_translate(local->cairo, x + w, y + h); cairo_scale(local->cairo, w, h); cairo_arc_negative(local->cairo, 0., 0., 1., -a1, -a2); cairo_restore (local->cairo); switch (cpar[7]) { case 1: cairo_line_to(local->cairo, x + w, y + h); /* fall through */ case 2: cairo_close_path(local->cairo); cairo_fill(local->cairo); break; case 3: cairo_line_to(local->cairo, x + w, y + h); /* fall through */ case 4: cairo_close_path(local->cairo); cairo_stroke(local->cairo); break; default: cairo_stroke(local->cairo); } break; case 'B': cairo_new_path(local->cairo); if (cpar[1] <= cpar[3]) { x = mxd2px(local, cpar[1]); w = mxd2pw(local, cpar[3] - cpar[1]); } else { x = mxd2px(local, cpar[3]); w = mxd2pw(local, cpar[1] - cpar[3]); } if (cpar[2] <= cpar[4]) { y = mxd2py(local, cpar[2]); h = mxd2ph(local, cpar[4] - cpar[2]); } else { y = mxd2py(local, cpar[4]); h = mxd2ph(local, cpar[2] - cpar[4]); } cairo_rectangle(local->cairo, x, y, w, h); if (cpar[5] == 0) { cairo_stroke(local->cairo); } else { cairo_fill(local->cairo); } break; case 'P': cairo_new_path(local->cairo); cairo_arc(local->cairo, mxd2px(local, cpar[1]), mxd2py(local, cpar[2]), mxd2pw(local, 1), 0, 2 * M_PI); cairo_fill(local->cairo); break; case 'R': cairo_new_path(local->cairo); if (cpar[1] == 0) break; for (i = 0; i < cpar[1]; i++) { cairo_line_to(local->cairo, mxd2px(local, cpar[i * 2 + 2]), mxd2py(local, cpar[i * 2 + 3])); } cairo_stroke(local->cairo); break; case 'D': cairo_new_path(local->cairo); if (cpar[1] == 0) break; for (i = 0; i < cpar[1]; i++) { cairo_line_to(local->cairo, mxd2px(local, cpar[i * 2 + 3]), mxd2py(local, cpar[i * 2 + 4])); } cairo_close_path(local->cairo); switch (cpar[2]) { case 0: cairo_stroke(local->cairo); break; case 1: cairo_set_fill_rule(local->cairo, CAIRO_FILL_RULE_EVEN_ODD); cairo_fill(local->cairo); break; case 2: cairo_set_fill_rule(local->cairo, CAIRO_FILL_RULE_WINDING); cairo_fill(local->cairo); break; } break; case 'F': g_free(local->fontalias); local->fontalias = g_strdup(cstr); break; case 'H': fontspace = cpar[2] / 72.0 * 25.4; local->fontspace = fontspace; fontsize = cpar[1] / 72.0 * 25.4; local->fontsize = fontsize; fontdir = cpar[3] * MPI / 18000.0; fontsin = sin(fontdir); fontcos = cos(fontdir); local->fontdir = (cpar[3] % 36000) / 100.0; if (local->fontdir < 0) { local->fontdir += 360; } local->fontsin = fontsin; local->fontcos = fontcos; font_style = (cpar[0] > 3) ? cpar[4] : -1; local->loadfont = loadfont(local->fontalias, font_style, &local->symbol); break; case 'S': if (local->loadfont == NULL) break; tmp = gra2cairo_get_utf8_str(cstr, local->symbol); if (tmp) { draw_str(local, TRUE, tmp, local->loadfont, local->fontsize, local->fontspace, NULL, NULL, NULL); g_free(tmp); } break; case 'K': if (local->loadfont == NULL) break; tmp = sjis_to_utf8(cstr); if (tmp) { draw_str(local, TRUE, tmp, local->loadfont, local->fontsize, local->fontspace, NULL, NULL, NULL); g_free(tmp); } break; default: break; } return 0; }
static void render(struct widget *w) { struct widget_priv *priv = w->priv; struct canvas *ca = &w->ca; char mode[17]; unsigned int cust_mode; cust_mode = priv->custom_mode; if (priv->mav_type != MAV_TYPE_FIXED_WING) cust_mode += 100; switch (cust_mode) { case PLANE_MODE_MANUAL: strcpy(mode, "Manual"); break; case PLANE_MODE_CIRCLE: case COPTER_MODE_CIRCLE: strcpy(mode, "Circle"); break; case PLANE_MODE_STABILIZE: case COPTER_MODE_STABILIZE: strcpy(mode, "Stabilize"); break; case PLANE_MODE_TRAINING: strcpy(mode, "Training"); break; case PLANE_MODE_ACRO: case COPTER_MODE_ACRO: strcpy(mode, "Acro"); break; case PLANE_MODE_FBWA: strcpy(mode, "Fly-By-Wire A"); break; case PLANE_MODE_FBWB: strcpy(mode, "Fly-By-Wire B"); break; case PLANE_MODE_CRUISE: strcpy(mode, "Cruise"); break; case PLANE_MODE_AUTOTUNE: case COPTER_MODE_AUTOTUNE: strcpy(mode, "Auto tune"); break; case PLANE_MODE_AUTO: case COPTER_MODE_AUTO: strcpy(mode, "Auto"); break; case PLANE_MODE_RTL: case COPTER_MODE_RTL: strcpy(mode, "Return To Launch"); break; case PLANE_MODE_LOITER: case COPTER_MODE_LOITER: strcpy(mode, "Loiter"); break; case PLANE_MODE_INIT: strcpy(mode, "Initializing"); break; case PLANE_MODE_GUIDED: case COPTER_MODE_GUIDED: strcpy(mode, "Guided"); break; case COPTER_MODE_ALTHOLD: strcpy(mode, "Altitude hold"); break; case COPTER_MODE_LAND: strcpy(mode, "Land"); break; case COPTER_MODE_OF_LOITER: strcpy(mode, "OF Loiter"); break; case COPTER_MODE_DRIFT: strcpy(mode, "Drift"); break; case COPTER_MODE_SPORT: strcpy(mode, "Sport"); break; case COPTER_MODE_FLIP: strcpy(mode, "Flip"); break; case COPTER_MODE_POSHOLD: strcpy(mode, "Position hold"); break; default: strcpy(mode, "Unknown Mode"); break; } draw_str(mode, 0, 0, ca, priv->font_size); }
static void render(struct widget *w) { struct widget_priv *priv = w->priv; struct canvas *ca = &w->ca; char buf[10]; unsigned long d = (unsigned long) priv->home->distance; unsigned int r = (w->ca.width/2)-2; int x, y; int min_increment; long i, scale; struct point ils_points[5] = { {-4, -6}, {-4, 6}, {0, 10}, {4, 6}, {4, -6} }; struct polygon ils = { .len = 5, .points = ils_points, }; struct point uav_points[4] = { {0, 0}, {6, 8}, {0, -8}, {-6, 8} }; struct polygon uav = { .len = 4, .points = uav_points, }; struct polygon *p; x = (w->ca.width/2)-1; y = (w->ca.height/2)-1; draw_vline(x, 0, r*2, 2, ca); draw_hline(0, r*2, y, 2, ca); //draw_circle(x, y, r+1, 3, ca); draw_circle(x, y, r , 2, ca); /* auto scale */ switch (get_units(w->cfg)) { default: case UNITS_METRIC: min_increment = 500; scale = ((d / min_increment) + 1) * min_increment; sprintf(buf, "%um", (unsigned int) scale); break; case UNITS_IMPERIAL: d *= M2FEET; min_increment = 1000; scale = ((d / min_increment) + 1) * min_increment; if (d > 5000) { d = (d * 1000) / MILE2FEET; scale /= 1000; sprintf(buf, "%umi", (unsigned int) scale); } else { sprintf(buf, "%uf", (unsigned int) scale); } break; } draw_str(buf, 0, 0, ca, 0); i = (long) d * r; i /= scale; switch (w->cfg->props.mode >> 1) { case 0: default: /* radar fixed at uav heading, home moves */ x += sin(DEG2RAD(priv->home->direction)) * i; y -= cos(DEG2RAD(priv->home->direction)) * i; transform_polygon(&ils, x, y, priv->stats->launch_heading - priv->heading - 180); p = &ils; break; case 1: /* radar always facing north, uav moves */ x += sin(DEG2RAD(priv->home->uav_bearing)) * i; y -= cos(DEG2RAD(priv->home->uav_bearing)) * i; transform_polygon(&uav, x, y, priv->heading); p = &uav; break; case 2: /* radar always facing launch direction, uav moves */ x += sin(DEG2RAD(priv->home->uav_bearing - priv->stats->launch_heading)) * i; y -= cos(DEG2RAD(priv->home->uav_bearing - priv->stats->launch_heading)) * i; transform_polygon(&uav, x, y, priv->heading - priv->stats->launch_heading); p = &uav; break; case 3: /* testing waypoints */ /* radar always facing north, uav moves with waypoints */ if (priv->wp_seq > 0) { long i_wp = (long) priv->wp_distance * r; i_wp /= scale; int x_wp = x, y_wp = y; x_wp += sin(DEG2RAD(priv->wp_target_bearing - priv->heading)) * i_wp; y_wp -= cos(DEG2RAD(priv->wp_target_bearing - priv->heading)) * i_wp; sprintf(buf, "%d", priv->wp_seq); draw_str(buf, x_wp, y_wp, ca, 0); } x += sin(DEG2RAD(priv->home->uav_bearing)) * i; y -= cos(DEG2RAD(priv->home->uav_bearing)) * i; transform_polygon(&uav, x, y, priv->heading); p = &uav; break; } draw_polygon(p, 3, ca); move_polygon(p, -1, -1); draw_polygon(p, 1, ca); } const struct widget_ops radar_widget_ops = { .name = "Radar", .mavname = "RADAR", .id = WIDGET_RADAR_ID, .init = NULL, .open = open, .render = render, .close = NULL, };
int gra2cairo_charheight(struct objlist *obj, N_VALUE *inst, N_VALUE *rval, int argc, char **argv) { struct gra2cairo_local *local; char *font; double size, dir, s, c; char *func; int height, descent, ascent, style, symbol; struct fontmap *fcur; func = (char *)argv[1]; size = (*(int *)(argv[3])) / 72.0 * 25.4; font = (char *)(argv[4]); style = *(int *) (argv[5]); if (size == 0) { rval->i = 0; return 0; } if (_getobj(obj, "_local", inst, &local)) return 1; if (local->cairo == NULL) return 1; if (strcmp0(func, "_charascent") == 0) { height = TRUE; } else { height = FALSE; } fcur = loadfont(font, style, &symbol); if (fcur == NULL) { if (height) { rval->i = nround(size * 0.562); } else { rval->i = nround(size * 0.250); } return 0; } dir = local->fontdir; s = local->fontsin; c = local->fontcos; local->fontdir = 0; local->fontsin = 0; local->fontcos = 1; draw_str(local, FALSE, "A", fcur, size, 0, NULL, &ascent, &descent); if (height) { rval->i = mxp2dh(local, ascent); } else { rval->i = mxp2dh(local, descent); } local->fontsin = s; local->fontcos = c; local->fontdir = dir; return 0; }