예제 #1
0
파일: gps.c 프로젝트: 381426068/alceosd
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);
}
예제 #2
0
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);
	}

}	
예제 #3
0
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,
};
예제 #4
0
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);
}
예제 #5
0
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);
}
예제 #6
0
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");
	}
}
예제 #7
0
파일: gps.c 프로젝트: ljalves/alceosd-1
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);
}
예제 #8
0
파일: wind.c 프로젝트: ljalves/alceosd
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,
};
예제 #9
0
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);
        }
    }
}
예제 #10
0
파일: speed.c 프로젝트: Elios007/alceosd
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);
}
예제 #11
0
파일: battery.c 프로젝트: Elios007/alceosd
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;
    }
}
예제 #12
0
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);
}
예제 #13
0
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);
}
예제 #14
0
파일: Ctrl.c 프로젝트: xtforever/xtcw
// 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);
  }
}
예제 #15
0
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++;
    }
}
예제 #16
0
	//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++;
		
	} 
예제 #17
0
	//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++;
		}
	}
예제 #18
0
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;
}
예제 #19
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;
}
예제 #20
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;
}
예제 #21
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);
}
예제 #22
0
파일: radar.c 프로젝트: ljalves/alceosd
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,
};
예제 #23
0
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;
}